ezlibrary_v2 0.0.1

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 (113) hide show
  1. package/esm2020/ezlibrary_v2.mjs +5 -0
  2. package/esm2020/lib/admin-service/admin-service.service.mjs +36 -0
  3. package/esm2020/lib/analysis-search/analysis-search.component.mjs +1083 -0
  4. package/esm2020/lib/assort-service/assort-service.service.mjs +31 -0
  5. package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +231 -0
  6. package/esm2020/lib/auth/auth.guard.mjs +40 -0
  7. package/esm2020/lib/bi-service/bi.service.mjs +58 -0
  8. package/esm2020/lib/call-info/callinfo.component.mjs +126 -0
  9. package/esm2020/lib/comman-service/comman-service.service.mjs +679 -0
  10. package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
  11. package/esm2020/lib/contact-search/contact-search.component.mjs +679 -0
  12. package/esm2020/lib/contact-service/contact-service.service.mjs +47 -0
  13. package/esm2020/lib/ezheader/header.component.mjs +383 -0
  14. package/esm2020/lib/ezlib.module.mjs +220 -0
  15. package/esm2020/lib/file-upload/fileupload.component.mjs +920 -0
  16. package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +175 -0
  17. package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
  18. package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
  19. package/esm2020/lib/footer/footer.component.mjs +18 -0
  20. package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
  21. package/esm2020/lib/globle/globle-env.service.mjs +45 -0
  22. package/esm2020/lib/globle/memo-report.service.mjs +2800 -0
  23. package/esm2020/lib/globle/pdf-service.service.mjs +18848 -0
  24. package/esm2020/lib/globle/shared-services.service.mjs +27 -0
  25. package/esm2020/lib/globle/upload-service.service.mjs +69 -0
  26. package/esm2020/lib/header/header.component.mjs +179 -0
  27. package/esm2020/lib/invalid/invalid.component.mjs +71 -0
  28. package/esm2020/lib/logout/logout.component.mjs +107 -0
  29. package/esm2020/lib/menu-right/menu-right.component.mjs +252 -0
  30. package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
  31. package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
  32. package/esm2020/lib/pipes/selectedCount.mjs +19 -0
  33. package/esm2020/lib/pipes/sum.pipe.mjs +16 -0
  34. package/esm2020/lib/pkt-data/pkt-data.component.mjs +1107 -0
  35. package/esm2020/lib/pricing-service/pricing.service.mjs +58 -0
  36. package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1035 -0
  37. package/esm2020/lib/report-format/report-format.component.mjs +400 -0
  38. package/esm2020/lib/sessionend/session-end.guard.mjs +28 -0
  39. package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
  40. package/esm2020/lib/stock-service/stock-service.service.mjs +62 -0
  41. package/esm2020/lib/system-module/subform/subform.component.mjs +2481 -0
  42. package/esm2020/lib/system-module/system/system.component.mjs +959 -0
  43. package/esm2020/lib/system-module/system-service/system-service.service.mjs +85 -0
  44. package/esm2020/lib/system-module/system-service/upload-file.service.mjs +86 -0
  45. package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +23 -0
  46. package/esm2020/lib/utility/constants.mjs +5 -0
  47. package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
  48. package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
  49. package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
  50. package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
  51. package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
  52. package/esm2020/lib/utility/tranform.directive.mjs +27 -0
  53. package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
  54. package/esm2020/public_api.mjs +57 -0
  55. package/ezlibrary_v2.d.ts +5 -0
  56. package/fesm2015/ezlibrary_v2.mjs +33543 -0
  57. package/fesm2015/ezlibrary_v2.mjs.map +1 -0
  58. package/fesm2020/ezlibrary_v2.mjs +33533 -0
  59. package/fesm2020/ezlibrary_v2.mjs.map +1 -0
  60. package/lib/admin-service/admin-service.service.d.ts +13 -0
  61. package/lib/analysis-search/analysis-search.component.d.ts +122 -0
  62. package/lib/assort-service/assort-service.service.d.ts +12 -0
  63. package/lib/attribute-definition/attribute-definition.component.d.ts +47 -0
  64. package/lib/auth/auth.guard.d.ts +16 -0
  65. package/lib/bi-service/bi.service.d.ts +20 -0
  66. package/lib/call-info/callinfo.component.d.ts +30 -0
  67. package/lib/comman-service/comman-service.service.d.ts +111 -0
  68. package/lib/comman-service/share-data-service.service.d.ts +10 -0
  69. package/lib/contact-search/contact-search.component.d.ts +115 -0
  70. package/lib/contact-service/contact-service.service.d.ts +15 -0
  71. package/lib/ezheader/header.component.d.ts +61 -0
  72. package/lib/ezlib.module.d.ts +47 -0
  73. package/lib/file-upload/fileupload.component.d.ts +131 -0
  74. package/lib/file-upload-log/file-upload-log.component.d.ts +53 -0
  75. package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
  76. package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
  77. package/lib/footer/footer.component.d.ts +9 -0
  78. package/lib/globle/common-pdf.service.d.ts +9 -0
  79. package/lib/globle/globle-env.service.d.ts +16 -0
  80. package/lib/globle/memo-report.service.d.ts +107 -0
  81. package/lib/globle/pdf-service.service.d.ts +459 -0
  82. package/lib/globle/shared-services.service.d.ts +12 -0
  83. package/lib/globle/upload-service.service.d.ts +20 -0
  84. package/lib/header/header.component.d.ts +45 -0
  85. package/lib/invalid/invalid.component.d.ts +12 -0
  86. package/lib/logout/logout.component.d.ts +21 -0
  87. package/lib/menu-right/menu-right.component.d.ts +47 -0
  88. package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
  89. package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
  90. package/lib/pipes/selectedCount.d.ts +7 -0
  91. package/lib/pipes/sum.pipe.d.ts +7 -0
  92. package/lib/pkt-data/pkt-data.component.d.ts +189 -0
  93. package/lib/pricing-service/pricing.service.d.ts +20 -0
  94. package/lib/qa-analysis/qa-analysis.component.d.ts +99 -0
  95. package/lib/report-format/report-format.component.d.ts +74 -0
  96. package/lib/sessionend/session-end.guard.d.ts +10 -0
  97. package/lib/stock-service/lazyload.service.d.ts +7 -0
  98. package/lib/stock-service/stock-service.service.d.ts +19 -0
  99. package/lib/system-module/subform/subform.component.d.ts +227 -0
  100. package/lib/system-module/system/system.component.d.ts +113 -0
  101. package/lib/system-module/system-service/system-service.service.d.ts +23 -0
  102. package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
  103. package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
  104. package/lib/utility/constants.d.ts +4 -0
  105. package/lib/utility/contact-table-search.pipe.d.ts +7 -0
  106. package/lib/utility/formate-num-field.pipe.d.ts +7 -0
  107. package/lib/utility/search-pipe.pipe.d.ts +7 -0
  108. package/lib/utility/selective-preloading-strategy.d.ts +9 -0
  109. package/lib/utility/table-search.pipe.d.ts +7 -0
  110. package/lib/utility/tranform.directive.d.ts +10 -0
  111. package/lib/websearch-history/websearch-history.component.d.ts +62 -0
  112. package/package.json +48 -0
  113. package/public_api.d.ts +52 -0
@@ -0,0 +1,1107 @@
1
+ import { ToastrService } from 'ngx-toastr';
2
+ import { NgxSpinnerService } from "ngx-spinner";
3
+ import { BiService } from './../bi-service/bi.service';
4
+ import { CommanServiceService } from '../comman-service/comman-service.service';
5
+ import { Component, ViewChild } from '@angular/core';
6
+ import { Router, ActivatedRoute } from '@angular/router';
7
+ import { Cookie } from 'ng2-cookies/ng2-cookies';
8
+ import * as _ from 'lodash';
9
+ import { BaseChartDirective } from 'ng2-charts';
10
+ import * as pluginDataLabels from 'chartjs-plugin-labels';
11
+ import { HttpHeaders } from '@angular/common/http';
12
+ // import * as Rx from 'rxjs/Rx';
13
+ import { from } from 'rxjs';
14
+ import { groupBy, toArray, map, mergeMap } from 'rxjs/operators';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "../comman-service/comman-service.service";
17
+ import * as i2 from "./../bi-service/bi.service";
18
+ import * as i3 from "ngx-spinner";
19
+ import * as i4 from "ngx-toastr";
20
+ import * as i5 from "@angular/router";
21
+ import * as i6 from "ng-select";
22
+ import * as i7 from "@angular/common";
23
+ import * as i8 from "@angular/forms";
24
+ import * as i9 from "ngx-infinite-scroll";
25
+ import * as i10 from "ng2-charts";
26
+ import * as i11 from "../utility/app-no-dbl-click.directive";
27
+ import * as i12 from "../utility/table-search.pipe";
28
+ // import { sumBy } from 'lodash';
29
+ export class PktDataComponent {
30
+ constructor(cs, bis, _spinnerService, toastr, router, route) {
31
+ this.cs = cs;
32
+ this.bis = bis;
33
+ this._spinnerService = _spinnerService;
34
+ this.toastr = toastr;
35
+ this.router = router;
36
+ this.route = route;
37
+ this.pkts = [];
38
+ this.headerKey = [];
39
+ this.header = [];
40
+ this.totalWeight = 0;
41
+ this.scrollDistance = 1;
42
+ this.scrollUpDistance = 2;
43
+ this.startIndex = 0;
44
+ this.endIndex = 30;
45
+ this.groupstartIndex = 0;
46
+ this.groupendIndex = 30;
47
+ this.loadResult = [];
48
+ this.resultlength = 0;
49
+ this.totAvg = 0;
50
+ this.totDis = 0;
51
+ this.selectedItm = [];
52
+ this.selectwt = 0;
53
+ this.selectAvg = 0;
54
+ this.selectDis = 0;
55
+ this.selectAmt = 0;
56
+ this.sttWiseSummary = new Map();
57
+ // anaAllGrpStt = ['asrt', 'lab', 'mkt', 'sold'];
58
+ this.anaAllGrpStt = [];
59
+ this.legendList = [];
60
+ this.newwindow = "YES";
61
+ this.staticLov = [];
62
+ this.defaultGrpList = [];
63
+ this.stObj = {};
64
+ this.totAmt = 0;
65
+ this.nodata = true;
66
+ this.viewdisType = "group";
67
+ this.summaryList = [];
68
+ this.coPuattributeStr = [];
69
+ this.groupBypktList = [];
70
+ this.loadgroupBypktList = [];
71
+ this.sttwise = false;
72
+ this.grp = [];
73
+ this.GrpVals = [];
74
+ this.finalGrpVal = {};
75
+ this.finalSummaryDtl = {};
76
+ this.data = [];
77
+ this.summaryDtl = {};
78
+ this.headList = [];
79
+ this.GrpValsPie = [];
80
+ this.grpPie = [];
81
+ this.finalGrpValPie = {};
82
+ this.summaryDtlPie = {};
83
+ this.byrvalGrp = []; //{};
84
+ this.isBuyerwise = false;
85
+ this.isGrpwise = false;
86
+ this.grpWiseQty = [];
87
+ this.dataType = "";
88
+ this.dynamicColors = [];
89
+ this.byrValArr = [];
90
+ this.pieChartPlugins = [pluginDataLabels];
91
+ this.doughnutChartType = 'pie';
92
+ this.doughnutChartLabels = [];
93
+ this.doughnutChartData = [];
94
+ this.pieChartColors = [];
95
+ this.pieChartLegend = true;
96
+ this.chartColors = [
97
+ {
98
+ backgroundColor: this.generate(),
99
+ fillColor: this.generate(),
100
+ strokeColor: this.generate()
101
+ //["#000080", "#0020C2", "#1569C7", "#357EC7", "#368BC1","659EC7"]
102
+ }
103
+ ];
104
+ this.labels = {
105
+ labels: {
106
+ render: 'percentage',
107
+ //     fontColor: ['green', 'white', 'red'],
108
+ precision: 2
109
+ }
110
+ };
111
+ this.chartOptions = {
112
+ plugins: {
113
+ labels: {
114
+ render: 'percentage',
115
+ }
116
+ },
117
+ legend: {
118
+ position: 'right',
119
+ labels: {
120
+ fontColor: 'black',
121
+ boxWidth: 10,
122
+ padding: 10,
123
+ fontSize: 10,
124
+ render: 'percentage',
125
+ }
126
+ },
127
+ };
128
+ this.pieChartOptions = {
129
+ //legend: {position: 'left',fontColor:'white'},
130
+ //plugins: {labels: { render: 'percentage',position: 'border', textMargin: 4}}
131
+ legend: {
132
+ position: 'right',
133
+ labels: {
134
+ fontColor: 'black',
135
+ boxWidth: 10,
136
+ padding: 10,
137
+ fontSize: 10,
138
+ render: 'percentage'
139
+ }
140
+ },
141
+ plugins: {
142
+ datalabels: {
143
+ formatter: (value, ctx) => {
144
+ const label = ctx.chart.data.labels[ctx.dataIndex];
145
+ return label;
146
+ },
147
+ },
148
+ }
149
+ };
150
+ this.pie = {
151
+ legend: { position: 'left', fontColor: 'white' },
152
+ plugins: {
153
+ labels: {
154
+ // render 'label', 'value', 'percentage', 'image' or custom function, default is 'percentage'
155
+ render: 'percentage',
156
+ precision: 0,
157
+ arc: true,
158
+ showActualPercentages: true,
159
+ position: 'outside'
160
+ }
161
+ },
162
+ tooltips: {
163
+ mode: 'label',
164
+ callbacks: {
165
+ label: function (tooltipItem, data) {
166
+ // let label = data.datasets[tooltipItem.datasetIndex].label;
167
+ // let value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
168
+ return [data.labels[tooltipItem.index]
169
+ ];
170
+ }
171
+ }
172
+ }
173
+ };
174
+ this.TotAvgObj = {};
175
+ this.anaSttLbl = [];
176
+ }
177
+ lpad(lStr, ln) {
178
+ let str = lStr;
179
+ while (str.length < ln) {
180
+ str = '0' + str;
181
+ }
182
+ return str;
183
+ }
184
+ getSearchResult() {
185
+ this.cObj = {};
186
+ this.groupBypktList = [];
187
+ this._spinnerService.show();
188
+ this.pkts = [];
189
+ this.grp = [];
190
+ this.headerKey = [];
191
+ this.legendList = [];
192
+ this.viewdisType = "group";
193
+ let reqObj = {};
194
+ this.formname = this.route.snapshot.params['frmnme'];
195
+ reqObj['searchIdnList'] = localStorage.getItem('srcIdns').split(',');
196
+ reqObj['formNme'] = this.route.snapshot.params['frmnme'];
197
+ console.log(JSON.stringify(reqObj));
198
+ this.startIndex = 0;
199
+ this.endIndex = 30;
200
+ this.loadResult = [];
201
+ this.bis.data(reqObj, 'search', 'marketing/search')
202
+ .subscribe(data => {
203
+ if (data.status == 'SUCCESS') {
204
+ let res = data.result;
205
+ console.log("res", res);
206
+ this.pageDefination = res.pageDefination || {};
207
+ this.links = this.pageDefination.link || [];
208
+ this.pkts = res.searchResultDtl || [];
209
+ this.anaAllGrpStt = Array.from(new Set(this.pkts.map(element => element.dsp_stt)));
210
+ this.resultlength = this.pkts.length;
211
+ this.coPuattributeStr = res.copuStructureDtl || [];
212
+ this.headerKey = res.resultView;
213
+ this.header = res.resultViewDtl;
214
+ this.legendList = res.legendList;
215
+ this.totalWeight = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
216
+ let rapVal = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.rap_vlu), 0));
217
+ let totAmt = 0;
218
+ this.pkts.forEach(element => {
219
+ if (element.grp_stt == 'sold') {
220
+ totAmt += parseFloat(element['sal_rte']) * parseFloat(element['crtwt']);
221
+ }
222
+ else {
223
+ totAmt += parseFloat(element['rte']) * parseFloat(element['crtwt']);
224
+ }
225
+ });
226
+ this.totAmt = this.cs.splitToTwoDecimal(totAmt);
227
+ this.totAvg = this.cs.splitToTwoDecimal(this.totAmt / this.totalWeight);
228
+ this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(rapVal)) - 100);
229
+ if (this.endIndex > this.resultlength)
230
+ this.endIndex = this.resultlength;
231
+ this.addItems();
232
+ debugger;
233
+ // this.totAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
234
+ // this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(totrapVal)) - 100);
235
+ this.getSummary(this.pkts);
236
+ // this.createGrp(this.pkts, this.defaultGrpList);
237
+ // localStorage.setItem('BI-PKT_GROUP_BY',JSON.stringify(res.pageDefination.form_field[0].lov_qry))
238
+ // let GRPby = JSON.parse(localStorage.getItem('BI-PKT_GROUP_BY'));
239
+ this.getStaticKV(res.pageDefination.form_field[0].lov_qry);
240
+ let avgFields = res.pageDefination.tabs[0].lov_qry.split(',');
241
+ this.getTotals(avgFields, this.pkts);
242
+ let ttlFields = res.pageDefination.others[0].lov_qry.split(',');
243
+ this.getTotalsTtl(ttlFields, this.pkts);
244
+ this._spinnerService.hide();
245
+ }
246
+ else {
247
+ this._spinnerService.hide();
248
+ this.toastr.error(data.message);
249
+ }
250
+ }, error => {
251
+ this._spinnerService.hide();
252
+ this.toastr.error(error);
253
+ });
254
+ }
255
+ selectRow(pktId) {
256
+ var checkboxId = "cb_" + pktId;
257
+ document.getElementById(checkboxId).click();
258
+ }
259
+ checkedRow(obj, stockidn, status) {
260
+ let cbId = 'cb_' + obj.stock_idn;
261
+ if (status == false) {
262
+ var element = document.getElementById(cbId); //pktId
263
+ element.parentElement.parentElement.classList.remove("selectedRow");
264
+ element.parentElement.parentElement.classList.add("notselectedRow");
265
+ this.selectedItm.forEach((e, index) => {
266
+ if (e.stock_idn == stockidn) {
267
+ this.selectedItm.splice(index, 1);
268
+ }
269
+ });
270
+ }
271
+ else {
272
+ var element = document.getElementById(cbId); //pktId
273
+ element.parentElement.parentElement.classList.remove("notselectedRow");
274
+ element.parentElement.parentElement.classList.add("selectedRow");
275
+ this.selectedItm.push(obj);
276
+ }
277
+ this.selectwt = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
278
+ // let totAmt = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +b.sal_amount, 0));
279
+ let totweight = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
280
+ let totrapVal = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +b.rap_vlu, 0));
281
+ let totAmt = 0;
282
+ this.selectedItm.forEach(element => {
283
+ if (element.grp_stt == 'sold') {
284
+ totAmt += parseFloat(element['sal_rte'] || 0) * parseFloat(element['crtwt']);
285
+ }
286
+ else {
287
+ totAmt += parseFloat(element['rte'] || 0) * parseFloat(element['crtwt']);
288
+ }
289
+ });
290
+ this.selectAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
291
+ this.selectDis = this.cs.splitToTwoDecimal((totAmt / parseFloat(totrapVal) * 100) - 100);
292
+ this.selectAmt = this.cs.splitToTwoDecimal(totAmt);
293
+ }
294
+ statusWiseDisplay(e, m) {
295
+ debugger;
296
+ this.sttwise = true;
297
+ let gArr = [];
298
+ for (let key in m) {
299
+ if (m[key] == true) {
300
+ debugger;
301
+ let pk = this.pkts.filter(e => e.grp_stt == key);
302
+ gArr = gArr.concat(pk);
303
+ }
304
+ else {
305
+ let pk = gArr.filter(e => e.grp_stt != key);
306
+ }
307
+ }
308
+ debugger;
309
+ this.finalGrpVal[""] = gArr;
310
+ this.loadResult = gArr;
311
+ if (this.finalGrpVal[""].length > 0) {
312
+ this.totalWeight = this.cs.splitToTwoDecimal(this.finalGrpVal[""].reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
313
+ let totweight = this.cs.splitToTwoDecimal(this.finalGrpVal[""].reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
314
+ let totrapVal = this.cs.splitToTwoDecimal(this.finalGrpVal[""].reduce((a, b) => +a + +b.rap_vlu, 0));
315
+ let totAmt = 0;
316
+ this.finalGrpVal[""].forEach(element => {
317
+ if (element.grp_stt == 'sold') {
318
+ totAmt += parseFloat(element['sal_rte']) * parseFloat(element['crtwt']);
319
+ }
320
+ else {
321
+ totAmt += parseFloat(element['rte']) * parseFloat(element['crtwt']);
322
+ }
323
+ });
324
+ this.totAmt = this.cs.splitToTwoDecimal(totAmt);
325
+ this.totAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
326
+ this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(totrapVal)) - 100);
327
+ }
328
+ // let grpBy = e.target.value;
329
+ // if (e.target.checked) {
330
+ // let pk = this.pkts.filter(e => e.grp_stt == grpBy);
331
+ // this.finalGrpVal[""] = pk;
332
+ // }
333
+ // else {
334
+ // let pk = this.pkts.filter(e => e.grp_stt !== grpBy);
335
+ // this.finalGrpVal[""] = pk;
336
+ // }
337
+ console.log(this.finalGrpVal);
338
+ }
339
+ OnLinkClick(lnk, pktdtl) {
340
+ if (lnk.form_field == 'priceupdate') {
341
+ this.cObj = pktdtl;
342
+ document.getElementById("bidMdBBtn").click();
343
+ }
344
+ }
345
+ calculatRteDis(objdtl, typ) {
346
+ debugger;
347
+ if (typ == 'rte') {
348
+ let dis = this.cs.splitToTwoDecimal(((parseFloat(objdtl.new_rte) * 100) / parseFloat(objdtl.rap_rte)) - 100);
349
+ objdtl["new_rap_dis"] = dis;
350
+ }
351
+ if (typ == 'dis') {
352
+ let rte = this.cs.splitToTwoDecimal((parseFloat(objdtl.rap_rte) * (100 + parseFloat(objdtl.new_rap_dis)) / 100));
353
+ objdtl["new_rte"] = rte;
354
+ }
355
+ }
356
+ ChangesPrice() {
357
+ let nmeIdn = JSON.parse(localStorage.getItem('nmeIdn'));
358
+ let pktDataList = [];
359
+ let updateObj = {};
360
+ updateObj["id"] = this.cObj.pkt_code;
361
+ updateObj["issue"] = { "rte": "" };
362
+ updateObj["rtn"] = { "rte": this.cObj.new_rte };
363
+ updateObj["emp"] = {};
364
+ pktDataList.push(updateObj);
365
+ let reqObj = {};
366
+ reqObj['formNme'] = this.route.snapshot.params['frmnme']; //'bulkUpdateForm';
367
+ reqObj['attr'] = "rte";
368
+ reqObj['reissue'] = 'Y';
369
+ reqObj['empIdn'] = nmeIdn;
370
+ reqObj['grp'] = "bulkupdate";
371
+ reqObj['processName'] = "bulkMemPriceUpdate"; //'bulkPrepertiesUpdate';
372
+ reqObj['pktDataList'] = pktDataList;
373
+ console.log(JSON.stringify(reqObj));
374
+ this.reqheader['method'] = 'returnIssue';
375
+ let options = ({ headers: new HttpHeaders(this.reqheader) });
376
+ this.cs.load(reqObj, options, 'preMarketing/issueReturn').then((response) => {
377
+ if (response.status == 'SUCCESS') {
378
+ this.cObj.rte = this.cObj.new_rte;
379
+ this.cObj.rap_dis = this.cObj.new_rap_dis;
380
+ this.getSummary(this.pkts);
381
+ this.toastr.success(response.message);
382
+ this._spinnerService.hide();
383
+ }
384
+ else {
385
+ this._spinnerService.hide();
386
+ this.toastr.error(response.message);
387
+ }
388
+ }).catch((err) => {
389
+ this._spinnerService.hide();
390
+ this.toastr.error(err.message);
391
+ });
392
+ }
393
+ addItems() {
394
+ for (let i = this.startIndex; i < this.endIndex; i++) {
395
+ this.loadResult[i] = this.pkts[i];
396
+ }
397
+ this.startIndex = this.endIndex;
398
+ this.endIndex = this.endIndex + 30;
399
+ if (this.endIndex > this.resultlength) {
400
+ this.endIndex = this.resultlength;
401
+ }
402
+ }
403
+ onScrollDown() {
404
+ if (this.endIndex <= this.resultlength)
405
+ this.addItems();
406
+ document.getElementById("wrap").addEventListener("scroll", function () {
407
+ var translate = "translate(0," + this.scrollTop + "px)";
408
+ this.querySelector("thead").style.transform = translate;
409
+ });
410
+ }
411
+ createGrp(datas, selected) {
412
+ this._spinnerService.show();
413
+ this.data = [...datas];
414
+ // let grpvalues = "pu";
415
+ // let grpvaluesArr = grpvalues.split(',');
416
+ // let resutArr = [];
417
+ let grpvaluesArr = selected;
418
+ var final = [];
419
+ var output = _.groupBy(this.data, function (entry) {
420
+ var strs = '';
421
+ for (let i = 0; i < grpvaluesArr.length; i++) {
422
+ strs += entry[grpvaluesArr[i]] + '#';
423
+ }
424
+ return strs;
425
+ // return entry[grpvaluesArr[0]] + '#' + entry[grpvaluesArr[1]];// + '#' + entry.pu;
426
+ });
427
+ // console.log(output);
428
+ final.push(output);
429
+ console.log(final);
430
+ var Keys = Object.keys(final[0]);
431
+ console.log(Keys);
432
+ var Vals = Object.values(final[0]);
433
+ console.log(Vals);
434
+ let grpNamearr = [];
435
+ Keys.map(ele => {
436
+ grpNamearr.push(ele.split('#').filter(e => e != undefined).join(' / '));
437
+ });
438
+ this.grp = grpNamearr;
439
+ this.GrpVals = Vals;
440
+ for (let i = 0; i < grpNamearr.length; i++) {
441
+ var grpNme = grpNamearr[i];
442
+ this.finalGrpVal[grpNme] = Vals[i];
443
+ console.log(this.finalGrpVal[grpNme]);
444
+ }
445
+ this.getTotal();
446
+ this.grp.sort();
447
+ this._spinnerService.hide();
448
+ }
449
+ onGrpSelect(selected) {
450
+ if (this.viewdisType == 'group')
451
+ this.groupPktsList(this.pkts, selected);
452
+ else
453
+ this.summaryDetails(selected);
454
+ }
455
+ groupPktsList(pkts, selected) {
456
+ if (selected.length == 1) {
457
+ let attr = selected[0];
458
+ // this.finalGrpVal = _.groupBy(pkts, attr);
459
+ //this.grp = Object.keys(this.finalGrpVal);
460
+ from(pkts).pipe(groupBy(x => x[attr]), mergeMap(group => group.pipe(toArray())), map(g => {
461
+ return {
462
+ value: g[0][attr],
463
+ pktList: g,
464
+ count: _.sumBy(g, 'qty_on_handint'),
465
+ rapvlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'rap_vlu')),
466
+ crtwt: this.cs.splitToTwoDecimal(_.sumBy(g, 'crtwtint')),
467
+ vlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'amountint')),
468
+ salvlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'sal_amountint')),
469
+ avg: this.cs.splitToTwoDecimal(_.sumBy(g, 'amountint') / _.sumBy(g, 'crtwtint')),
470
+ salavg: this.cs.splitToTwoDecimal(_.sumBy(g, 'sal_amountint') / _.sumBy(g, 'crtwtint')),
471
+ dis: this.cs.splitToTwoDecimal(((_.sumBy(g, 'amountint') * 100) / (_.sumBy(g, 'rap_vlu'))) - 100),
472
+ saldis: this.cs.splitToTwoDecimal(((_.sumBy(g, 'sal_amountint') * 100) / (_.sumBy(g, 'rap_vlu'))) - 100)
473
+ };
474
+ }), toArray())
475
+ .subscribe(d => {
476
+ this.groupBypktList = d;
477
+ this.groupstartIndex = 0;
478
+ this.groupendIndex = this.groupBypktList.length;
479
+ this.groupaddItems();
480
+ });
481
+ }
482
+ else {
483
+ this.startIndex = 0;
484
+ this.endIndex = 30;
485
+ this.loadResult = [];
486
+ this.groupBypktList = [];
487
+ if (this.endIndex > this.resultlength)
488
+ this.endIndex = this.resultlength;
489
+ this.addItems();
490
+ }
491
+ }
492
+ groupaddItems() {
493
+ let pktcnt = 0;
494
+ for (let i = this.groupstartIndex; i < this.groupendIndex; i++) {
495
+ debugger;
496
+ this.loadgroupBypktList[i] = this.groupBypktList[i];
497
+ let pktlist = this.groupBypktList[i]['pktList'] || [];
498
+ pktcnt = pktcnt + pktlist.length;
499
+ if (pktcnt > 30) {
500
+ this.groupstartIndex = i + 1;
501
+ break;
502
+ }
503
+ }
504
+ }
505
+ grouponScrollDown() {
506
+ if (this.groupstartIndex < this.groupendIndex)
507
+ this.groupaddItems();
508
+ document.getElementById("wrap").addEventListener("scroll", function () {
509
+ var translate = "translate(0," + this.scrollTop + "px)";
510
+ this.querySelector("thead").style.transform = translate;
511
+ });
512
+ }
513
+ summaryDetails(selected) {
514
+ if (selected.length == 1) {
515
+ this.headList = [];
516
+ let summaryData = [];
517
+ let attribue = selected[0];
518
+ from(this.pkts).pipe(groupBy(x => x[attribue] + "#" + x['dsp_stt']), mergeMap(group => group.pipe(toArray())), map(g => {
519
+ return {
520
+ key: g[0][attribue] + "#" + g[0]['dsp_stt'],
521
+ value: g[0][attribue],
522
+ sort: g[0][attribue + "_srt"] || 10000,
523
+ dspstt: g[0]['dsp_stt'],
524
+ count: _.sumBy(g, 'qty_on_handint'),
525
+ rapvlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'rap_vlu')),
526
+ crtwt: this.cs.splitToTwoDecimal(_.sumBy(g, 'crtwtint')),
527
+ vlurte: this.cs.splitToTwoDecimal(_.sumBy(g, 'amountint')),
528
+ vlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'sal_amountint')),
529
+ };
530
+ }), toArray())
531
+ .subscribe(d => {
532
+ summaryData = d;
533
+ });
534
+ let summaryMap = {};
535
+ let sideList = [];
536
+ let headList = [];
537
+ summaryData.forEach(element => {
538
+ summaryMap[element.key] = element;
539
+ let value = element.value || '';
540
+ let dspstt = element.dspstt;
541
+ if ((selected == 'sal_byr' || selected == 'sal_emp') && dspstt != 'sold')
542
+ value = '';
543
+ if (value != '') {
544
+ if (headList.indexOf(dspstt) == -1)
545
+ headList.push(dspstt);
546
+ if (sideList.indexOf(value) == -1)
547
+ sideList.push(value);
548
+ }
549
+ });
550
+ this.summaryList = [];
551
+ sideList.forEach(side => {
552
+ let summry = {};
553
+ headList.forEach(head => {
554
+ let summryData = summaryMap[side + "#" + head] || '';
555
+ if (summryData != '') {
556
+ let stt = summryData['dspstt'];
557
+ let vlu = parseFloat(summryData.vlurte || 0);
558
+ let rapvlu = parseFloat(summryData.rapvlu || 0);
559
+ let crtwt = parseFloat(summryData.crtwt || 0);
560
+ summry['value'] = side;
561
+ summry['valueSort'] = summryData.sort;
562
+ summry['count_' + stt] = summryData.count;
563
+ summry['crtwt_' + stt] = summryData.crtwt;
564
+ summry['vlu_' + stt] = summryData.vlurte;
565
+ summry['avg_' + stt] = this.cs.splitToTwoDecimal(vlu / crtwt);
566
+ summry['dis_' + stt] = this.cs.splitToTwoDecimal(((vlu * 100) / rapvlu) - 100);
567
+ if (stt == 'sold') {
568
+ vlu = parseFloat(summryData.vlu || 0);
569
+ summry['vlu_' + stt] = vlu;
570
+ summry['avg_' + stt] = this.cs.splitToTwoDecimal(vlu / crtwt);
571
+ summry['dis_' + stt] = this.cs.splitToTwoDecimal(((vlu * 100) / rapvlu) - 100);
572
+ }
573
+ }
574
+ });
575
+ this.summaryList.push(summry);
576
+ });
577
+ if (selected == 'sal_byr' || selected == 'sal_emp') {
578
+ this.summaryList.sort((val1, val2) => {
579
+ return (val2['vlu_sold']) - (val1['vlu_sold']);
580
+ });
581
+ }
582
+ else {
583
+ console.log("this.summaryList", this.summaryList);
584
+ this.summaryList.sort((val1, val2) => {
585
+ return (val1['valueSort']) - (val2['valueSort']);
586
+ });
587
+ console.log("this.summaryList", this.summaryList);
588
+ }
589
+ this.headList = headList;
590
+ }
591
+ else {
592
+ if (selected.length > 1) {
593
+ this.toastr.error("Summary need only one attribute");
594
+ }
595
+ }
596
+ }
597
+ exportToCSVSummary() {
598
+ let modifiedObjArr = [];
599
+ this.summaryList.forEach((data, index) => {
600
+ let obj = {};
601
+ obj["Sr. No"] = index + 1;
602
+ obj["Attribute"] = data.value || '';
603
+ this.headList.forEach(hdr => {
604
+ obj["Qty(" + hdr + ")"] = data["count_" + hdr] || '';
605
+ obj["Carat(" + hdr + ")"] = data["crtwt_" + hdr] || '';
606
+ obj["Avg(" + hdr + ")"] = data["avg_" + hdr] || '';
607
+ obj["Dis(" + hdr + ")"] = data["dis_" + hdr] || '';
608
+ obj["Value(" + hdr + ")"] = data["vlu_" + hdr] || '';
609
+ });
610
+ modifiedObjArr.push(obj);
611
+ });
612
+ this.cs.CSVConvertor(modifiedObjArr, "Summary_details", true);
613
+ }
614
+ getTotal() {
615
+ let indexVal = 0;
616
+ let qs = 0;
617
+ this.GrpVals.forEach(element => {
618
+ let totAmt = 0;
619
+ let totweight = this.cs.splitToTwoDecimal(element.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
620
+ let rapVal = _.sumBy(element, 'rap_vlu');
621
+ element.forEach(pkt => {
622
+ if (pkt.grp_stt == 'sold') {
623
+ totAmt += parseFloat(pkt['sal_rte'] || 0) * parseFloat(pkt['crtwt']);
624
+ }
625
+ else {
626
+ totAmt += parseFloat(pkt['rte'] || 0) * parseFloat(pkt['crtwt']);
627
+ }
628
+ });
629
+ totAmt = this.cs.splitToTwoDecimal(totAmt);
630
+ var key = this.grp[indexVal];
631
+ this.summaryDtl[key + "_CTS"] = this.cs.splitToTwoDecimal(totweight);
632
+ this.summaryDtl[key + "_AMT"] = this.cs.splitToTwoDecimal(totAmt);
633
+ this.summaryDtl[key + "_RTE"] = this.cs.splitToTwoDecimal(totAmt / totweight);
634
+ this.summaryDtl[key + "_DIS"] = this.cs.splitToTwoDecimal(((totAmt * 100) / rapVal) - 100);
635
+ indexVal++;
636
+ });
637
+ }
638
+ generatePie(Datatype, ChartType) {
639
+ if (ChartType == 'qty') {
640
+ document.getElementById('btnQty').classList.remove('btn-default');
641
+ document.getElementById('btnQty').classList.add('active');
642
+ document.getElementById('btnVal').classList.remove('active');
643
+ document.getElementById('btnVal').classList.add('btn-default');
644
+ }
645
+ else {
646
+ document.getElementById('btnVal').classList.remove('btn-default');
647
+ document.getElementById('btnVal').classList.add('active');
648
+ document.getElementById('btnQty').classList.remove('active');
649
+ document.getElementById('btnQty').classList.add('btn-default');
650
+ }
651
+ this.grpWiseQty = [];
652
+ this.byrvalGrp = [];
653
+ this.dataType = Datatype;
654
+ this._spinnerService.show();
655
+ this.finalGrpValPie = {};
656
+ this.byrvalGrp = [];
657
+ this.data = [...this.pkts];
658
+ this.data = this.data.filter(x => x.grp_stt == 'sold');
659
+ let grpvalues;
660
+ let grpvaluesArr;
661
+ let resutArr = [];
662
+ // type = 'qty';
663
+ if (Datatype == 'buyer') {
664
+ this.type = "Buyer";
665
+ this.isBuyerwise = true;
666
+ this.isGrpwise = false;
667
+ grpvalues = "sal_byr";
668
+ grpvaluesArr = grpvalues.split(',');
669
+ resutArr = [];
670
+ }
671
+ else {
672
+ this.type = this.defaultGrpList;
673
+ this.isBuyerwise = false;
674
+ this.isGrpwise = true;
675
+ grpvaluesArr = this.defaultGrpList; //selected;
676
+ }
677
+ //let grpvaluesArr = selected;
678
+ var final = [];
679
+ var output = _.groupBy(this.data, function (entry) {
680
+ var strs = '';
681
+ for (let i = 0; i < grpvaluesArr.length; i++) {
682
+ strs += entry[grpvaluesArr[i]] + '#';
683
+ }
684
+ return strs;
685
+ // return entry[grpvaluesArr[0]] + '#' + entry[grpvaluesArr[1]];// + '#' + entry.pu;
686
+ });
687
+ // console.log(output);
688
+ final.push(output);
689
+ var Keys = Object.keys(final[0]);
690
+ var Vals = Object.values(final[0]);
691
+ let grpNamearr = [];
692
+ Keys.map(ele => {
693
+ grpNamearr.push(ele.split('#').filter(e => e != undefined).join(' / '));
694
+ });
695
+ this.grpPie = grpNamearr;
696
+ this.GrpValsPie = Vals;
697
+ for (let i = 0; i < grpNamearr.length; i++) {
698
+ var grpNme = grpNamearr[i];
699
+ this.finalGrpValPie[grpNme] = Vals[i];
700
+ let totAmt = this.cs.splitToTwoDecimal(this.finalGrpValPie[grpNme].reduce((a, b) => +a + +parseFloat(b.sal_amountint), 0));
701
+ let byrObj = {};
702
+ byrObj['k'] = grpNme;
703
+ byrObj['v'] = parseFloat(totAmt); //this.byrvalGrp[grpNme].length;
704
+ this.byrvalGrp.push(byrObj);
705
+ byrObj = {};
706
+ // this.byrvalGrp[grpNme] = totAmt;
707
+ let qtyObj = {};
708
+ qtyObj['k'] = grpNme;
709
+ qtyObj['v'] = this.finalGrpValPie[grpNme].length;
710
+ this.grpWiseQty.push(qtyObj);
711
+ qtyObj = {};
712
+ // this.grpWiseQty[grpNme] = this.finalGrpValPie[grpNme].length;
713
+ }
714
+ console.log(this.grpWiseQty);
715
+ if (ChartType == 'qty') {
716
+ this.drawPie(this.grpWiseQty, ChartType, Datatype);
717
+ }
718
+ else {
719
+ this.drawPie(this.byrvalGrp, ChartType, Datatype);
720
+ }
721
+ // this.getTotalPie();
722
+ // this.grpPie.sort();
723
+ }
724
+ generate() {
725
+ this.dynamicColors = [];
726
+ for (var i = 1; i < 7; i++) {
727
+ // this.LightenDarkenColor("7cb5ec", i * 10);
728
+ let col = 'c6e896';
729
+ let amt = (i * 20) * -1;
730
+ var usePound = false;
731
+ if (col[0] == "#") {
732
+ col = col.slice(1);
733
+ usePound = true;
734
+ }
735
+ var num = parseInt(col, 16);
736
+ var r = (num >> 16) + amt;
737
+ if (r > 255)
738
+ r = 255;
739
+ else if (r < 0)
740
+ r = 0;
741
+ var b = ((num >> 8) & 0x00FF) + amt;
742
+ if (b > 255)
743
+ b = 255;
744
+ else if (b < 0)
745
+ b = 0;
746
+ var g = (num & 0x0000FF) + amt;
747
+ if (g > 255)
748
+ g = 255;
749
+ else if (g < 0)
750
+ g = 0;
751
+ // return (usePound ? "#" : "") + (g | (b << 8) | (r << 16)).toString(16);
752
+ this.dynamicColors.push((usePound ? "#" : "#") + (g | (b << 8) | (r << 16)).toString(16));
753
+ }
754
+ console.log(this.dynamicColors);
755
+ return this.dynamicColors;
756
+ }
757
+ getTotalPie() {
758
+ let indexVal = 0;
759
+ let AmtArr = [];
760
+ this.GrpValsPie.forEach(element => {
761
+ let byrwiseVal = {};
762
+ let totAmt = 0;
763
+ let totweight = 0;
764
+ totweight = this.cs.splitToTwoDecimal(element.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
765
+ totAmt = this.cs.splitToTwoDecimal(element.reduce((a, b) => +a + +parseFloat(b.sal_amountint), 0));
766
+ AmtArr.push(totAmt);
767
+ var key = this.grp[indexVal];
768
+ // this.summaryDtl[key + "_QTY"] = this.cs.splitToTwoDecimal(qty);
769
+ this.summaryDtlPie[key + "_CTS"] = this.cs.splitToTwoDecimal(totweight);
770
+ this.summaryDtlPie[key + "_AMT"] = this.cs.splitToTwoDecimal(totAmt);
771
+ indexVal++;
772
+ if (indexVal == 1) {
773
+ byrwiseVal[this.grp[indexVal]] = totAmt;
774
+ this.byrValArr.push(byrwiseVal);
775
+ byrwiseVal = {};
776
+ }
777
+ // console.log(qs);
778
+ // console.log(amount);
779
+ });
780
+ console.log(this.byrValArr);
781
+ AmtArr = AmtArr.map(function (x) {
782
+ return parseFloat(x);
783
+ });
784
+ AmtArr.sort(function (a, b) { return a - b; });
785
+ console.log(AmtArr);
786
+ AmtArr.reverse();
787
+ // this.drawPie(AmtArr);
788
+ }
789
+ drawPie(salesData, type, ChartType) {
790
+ this.doughnutChartData = [];
791
+ this.doughnutChartLabels = [];
792
+ let AmtArr = salesData.sort((a, b) => (a.v > b.v) ? 1 : -1).reverse();
793
+ if (ChartType == "buyer") {
794
+ this.doughnutChartData = AmtArr.slice(0, 5).map(a => a.v);
795
+ this.doughnutChartLabels = AmtArr.slice(0, 5).map(a => a.k);
796
+ let sums = 0;
797
+ let otherSum = this.cs.splitToTwoDecimal(this.sttWiseSummary.get('sold').get('rate'));
798
+ if (type == 'qty')
799
+ otherSum = this.cs.splitToTwoDecimal(this.sttWiseSummary.get('sold').get('count'));
800
+ let tArr = [];
801
+ tArr = AmtArr.slice(0, 5).map(function (x) {
802
+ return parseFloat(x.v);
803
+ });
804
+ sums = _.sumBy(tArr);
805
+ let maxinArr = Math.max(Math.max(...this.doughnutChartData));
806
+ debugger;
807
+ let otherval = this.cs.splitToTwoDecimal(otherSum - sums) || 0;
808
+ if (maxinArr > otherval) {
809
+ this.doughnutChartData.push(otherval);
810
+ this.doughnutChartLabels.push('Other');
811
+ }
812
+ else {
813
+ this.doughnutChartData.unshift(otherval);
814
+ this.doughnutChartLabels.unshift('Other');
815
+ }
816
+ }
817
+ else {
818
+ this.doughnutChartData = AmtArr.map(a => a.v);
819
+ this.doughnutChartLabels = AmtArr.map(a => a.k);
820
+ console.log("this.doughnutChartData", this.doughnutChartData);
821
+ let sums = 0;
822
+ let otherSum = this.cs.splitToTwoDecimal(this.sttWiseSummary.get('sold').get('rate'));
823
+ sums = _.sumBy(Object.values(AmtArr), 'v');
824
+ }
825
+ // this.doughnutChartData.sort(function (a, b) { return a - b; });
826
+ // this.doughnutChartData = this.doughnutChartData.reverse();
827
+ for (let i = 0; i < this.doughnutChartLabels.length; i++) {
828
+ this.doughnutChartLabels[i] = this.doughnutChartLabels[i] + " " + this.doughnutChartData[i].toString();
829
+ }
830
+ // console.log(this.doughnutChartLabels);
831
+ this.refreshChart(ChartType);
832
+ this.doughnutChartType = 'pie';
833
+ // document.getElementById('PiechartModelBtn').click();
834
+ this._spinnerService.hide();
835
+ }
836
+ refreshChart(ChartType) {
837
+ this.isBuyerwise = false;
838
+ this.isGrpwise = false;
839
+ setTimeout(() => {
840
+ if (ChartType == "buyer") {
841
+ this.isBuyerwise = true;
842
+ }
843
+ else {
844
+ this.isGrpwise = true;
845
+ }
846
+ }, 1);
847
+ }
848
+ sortBy(key, g) {
849
+ this.sorted = this.sorted == 'desc' ? 'asc' : 'desc';
850
+ console.log(this.sorted);
851
+ let srted = _.orderBy(this.finalGrpVal[g], key, [this.sorted]);
852
+ this.finalGrpVal[g] = srted;
853
+ this.sortOn = g;
854
+ this.clmn = key;
855
+ }
856
+ exportToCSV(FileName) {
857
+ let d = this.cs.cDate, month = '' + (d.getMonth() + 1), day = '' + d.getDate(), year = d.getFullYear();
858
+ let dt = [day, month, year].join('-');
859
+ let fileNme = FileName + '__' + dt;
860
+ this.headerKey = ["dsp_stt", ...this.headerKey];
861
+ let modifiedObjArr = this.cs.modifyDataByHeader(this.pkts, this.headerKey, this.header);
862
+ this.cs.CSVConvertor(modifiedObjArr, fileNme, true);
863
+ }
864
+ getSummary(p) {
865
+ let summary;
866
+ p.forEach(element => {
867
+ // let stt = '';
868
+ // if (element.grp_stt == 'sold') {
869
+ // stt = 'Sold';
870
+ // }
871
+ // else if (element.grp_stt == 'mkt') {
872
+ // stt = 'Marketing';
873
+ // }
874
+ // else if (element.grp_stt == 'lab') {
875
+ // stt = 'Lab';
876
+ // }
877
+ // else {
878
+ // stt = element.grp_stt;
879
+ // }
880
+ // summary = this.sttWiseSummary.get(element.grp_stt);
881
+ summary = this.sttWiseSummary.get(element.grp_stt); //stt
882
+ let count = 0;
883
+ let gridWt = 0;
884
+ let gridavg = 0;
885
+ let disc = 0;
886
+ let gridRate = 0;
887
+ let totAmt = 0;
888
+ let gridRap = 0;
889
+ // this.totAvg = this.cs.splitToTwoDecimal(parseFloat(totAmt) / parseFloat(totweight));
890
+ // this.totDis = this.cs.splitToTwoDecimal(((parseFloat(totAmt) * 100) / parseFloat(totrapVal)) - 100);
891
+ let wt = parseFloat(element.crtwt);
892
+ let rate = 0;
893
+ let rapval = parseFloat(element.rap_vlu);
894
+ if (element.grp_stt == 'sold') {
895
+ rate = parseFloat((element.sal_rte == undefined || element.sal_rte == "") ? element.rte : element.sal_rte) * parseFloat(element.crtwt);
896
+ }
897
+ else {
898
+ rate = parseFloat(element.rte) * parseFloat(element.crtwt);
899
+ }
900
+ if (summary != null) {
901
+ count = parseInt(summary.get('count'));
902
+ gridWt = parseFloat(summary.get('wt'));
903
+ gridRate = parseFloat(summary.get('rate'));
904
+ gridRap = parseFloat(summary.get('rap'));
905
+ }
906
+ else {
907
+ summary = new Map();
908
+ }
909
+ summary.set('count', count + 1);
910
+ summary.set('wt', gridWt + wt);
911
+ summary.set('rate', gridRate + rate);
912
+ summary.set('rap', gridRap + rapval);
913
+ // this.sttWiseSummary.set(element.grp_stt == 'sold' ? 'Sold' : element.grp_stt, summary);
914
+ this.sttWiseSummary.set(element.grp_stt, summary); //stt
915
+ });
916
+ console.log('@presum:', this.sttWiseSummary);
917
+ this.anaAllGrpStt.forEach(ele => {
918
+ console.log(ele);
919
+ let count = 0;
920
+ let gridWt = 0;
921
+ let gridavg = 0;
922
+ let disc = 0;
923
+ let gridRate = 0;
924
+ let totAmt = 0;
925
+ let rap = 0;
926
+ let gridRap = 0;
927
+ //if (ele == 'Marketing' || ele == 'Sold') {
928
+ // ele = (ele == 'Marketing' || ele == 'Sold') ? ele : ele.toLowerCase();
929
+ let summary = this.sttWiseSummary.get(ele) || new Map();
930
+ count = parseInt(summary.get('count')) || 0;
931
+ gridWt = parseFloat(summary.get('wt')) || 0.00;
932
+ gridRate = parseFloat(summary.get('rate')) || 0;
933
+ gridRap = parseFloat(summary.get('rap')) || 1;
934
+ disc = this.cs.splitToTwoDecimal(((gridRate * 100) / gridRap) - 100);
935
+ gridavg = this.cs.splitToTwoDecimal(gridRate / gridWt);
936
+ summary.set('disc', disc);
937
+ summary.set('avg', gridavg);
938
+ this.sttWiseSummary.set(ele, summary);
939
+ //}
940
+ });
941
+ console.log(this.sttWiseSummary);
942
+ }
943
+ getTotals(fields, pkts) {
944
+ debugger;
945
+ fields.forEach(element => {
946
+ debugger;
947
+ let tavg = 0;
948
+ let total = 0;
949
+ if (element.trim() == 'age') {
950
+ total = this.cs.splitToTwoDecimal(pkts.reduce((a, b) => +a + +b.age, 0));
951
+ }
952
+ else {
953
+ total = _.sumBy(pkts, item => Number(item[element.trim()]));
954
+ }
955
+ let zeroVals = pkts.filter(x => (x[element.trim()] === "0" || 0)).length;
956
+ if (element.trim() != 'age') {
957
+ tavg = total / _.sumBy(pkts, item => Number(item['crtwt']));
958
+ tavg = this.cs.numbertofixed(tavg, 2);
959
+ }
960
+ else {
961
+ tavg = total / pkts.length;
962
+ }
963
+ this.TotAvgObj[element.trim()] = tavg;
964
+ });
965
+ console.log(this.TotAvgObj);
966
+ }
967
+ getTotalsTtl(fields, pkts) {
968
+ debugger;
969
+ fields.forEach(element => {
970
+ debugger;
971
+ let total = 0;
972
+ total = _.sumBy(pkts, item => Number(item[element.trim()]));
973
+ this.TotAvgObj[element.trim()] = this.cs.numbertofixed(total, 2);
974
+ });
975
+ }
976
+ modifySearch() {
977
+ localStorage.setItem('BIcall', 'BImodify');
978
+ this.router.navigate([this.modulename + '/analysis-search/' + this.route.snapshot.params['frmnme']]);
979
+ }
980
+ ngOnInit() {
981
+ // this.LightenDarkenColor("7cb5ec", 10);
982
+ let mdlk = JSON.parse(localStorage.getItem('mdlKey'));
983
+ this.cObj = {};
984
+ this.cUrl = this.router.url;
985
+ this.reqheader = {
986
+ 'clientkey': Cookie.get('_ck'),
987
+ 'Content-Type': 'application/json',
988
+ 'modulekey': mdlk[this.cUrl.split('/')[1]],
989
+ 'loginid': Cookie.get('_logid'),
990
+ 'source': 'qs'
991
+ };
992
+ this.viewdisType = "group";
993
+ this.newwindow = "YES";
994
+ this.grp = [];
995
+ this.loadResult = [];
996
+ this.startIndex = 0;
997
+ this.endIndex = 30;
998
+ this.cUrl = this.router.url;
999
+ this.modulename = this.cUrl.split('/')[1];
1000
+ this.ck = encodeURIComponent(Cookie.get('_ck'));
1001
+ this.route.params.subscribe(map => {
1002
+ this.loadDefination();
1003
+ let viewType = localStorage.getItem('viewType');
1004
+ let anaArr = JSON.parse(localStorage.getItem('BIanaStt'));
1005
+ let anasttLbl = JSON.parse(localStorage.getItem('BIanaSttLBL'));
1006
+ if (anaArr != null) {
1007
+ this.anaAllGrpStt = JSON.parse(localStorage.getItem('BIanaStt'));
1008
+ this.anaSttLbl = JSON.parse(localStorage.getItem('BIanaSttLBL'));
1009
+ this.anaAllGrpStt.forEach(element => {
1010
+ this.stObj[element] = true;
1011
+ });
1012
+ }
1013
+ if (viewType == 'listView') {
1014
+ this.getSearchResult();
1015
+ }
1016
+ else {
1017
+ let pkts = JSON.parse(localStorage.getItem('pktData'));
1018
+ this.headerKey = JSON.parse(localStorage.getItem('resultView'));
1019
+ this.header = JSON.parse(localStorage.getItem('resultViewDtl'));
1020
+ this.header = JSON.parse(localStorage.getItem('resultViewDtl'));
1021
+ let legends = JSON.parse(localStorage.getItem('BILegends'));
1022
+ if (legends != null && legends != undefined && legends != "") {
1023
+ this.legendList = legends;
1024
+ }
1025
+ this.pkts = [...pkts];
1026
+ this.totalWeight = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
1027
+ this.getSummary(this.pkts);
1028
+ // let totAmt = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +b.sal_rec_rte * parseFloat(b.crtwt), 0));
1029
+ let totweight = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
1030
+ let totrapVal = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +b.rap_vlu, 0));
1031
+ let totAmt = 0;
1032
+ this.pkts.forEach(element => {
1033
+ if (element.grp_stt == 'sold') {
1034
+ totAmt += parseFloat(element['sal_rte']) * parseFloat(element['crtwt']);
1035
+ }
1036
+ else {
1037
+ totAmt += parseFloat(element['rte']) * parseFloat(element['crtwt']);
1038
+ }
1039
+ });
1040
+ this.totAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
1041
+ this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(totrapVal)) - 100);
1042
+ this.resultlength = this.pkts.length;
1043
+ if (this.endIndex > this.resultlength)
1044
+ this.endIndex = this.resultlength;
1045
+ this.addItems();
1046
+ }
1047
+ });
1048
+ let GRPby = JSON.parse(localStorage.getItem('BI-PKT_GROUP_BY')) || '';
1049
+ this.getStaticKV(GRPby);
1050
+ // this.createGrp(this.pkts, this.defaultGrpList);
1051
+ let avgFields = JSON.parse(localStorage.getItem('BI-gridAvg')) || '';
1052
+ if (avgFields != '')
1053
+ this.getTotals(avgFields, this.pkts);
1054
+ }
1055
+ getStaticKV(qry) {
1056
+ this.staticLov = [];
1057
+ let arrkv = qry.split(',');
1058
+ let obj = {}, staticLov = [];
1059
+ for (let i = 0; i < arrkv.length; i += 2) {
1060
+ let key = arrkv[i], value = arrkv[i + 1];
1061
+ obj['k'] = key;
1062
+ obj['v'] = value;
1063
+ // if (i == 0) {
1064
+ // qry.default_value = value;//key
1065
+ // }
1066
+ this.staticLov.push(obj);
1067
+ obj = {};
1068
+ }
1069
+ this.staticLov = this.staticLov.map(option => ({
1070
+ value: option.v,
1071
+ label: option.k
1072
+ }));
1073
+ console.log(this.staticLov);
1074
+ }
1075
+ loadDefination() {
1076
+ this._spinnerService.show();
1077
+ let reqObj = {};
1078
+ reqObj['formNme'] = this.route.snapshot.params['frmnme']; //'searchDtlDscrForm';
1079
+ this.reqheader['method'] = 'loadDefination';
1080
+ let options = ({ headers: new HttpHeaders(this.reqheader) });
1081
+ this.cs.load(reqObj, options, 'marketing/search').then((response) => {
1082
+ if (response.status == 'SUCCESS') {
1083
+ let result = response.result;
1084
+ this.pageDefination = result.pageDefination || {};
1085
+ this.links = this.pageDefination.link || [];
1086
+ this._spinnerService.hide();
1087
+ }
1088
+ else {
1089
+ this._spinnerService.hide();
1090
+ this.toastr.error(response.message);
1091
+ }
1092
+ }).catch((err) => {
1093
+ this._spinnerService.hide();
1094
+ this.toastr.error(err.message);
1095
+ });
1096
+ }
1097
+ }
1098
+ /** @nocollapse */ /** @nocollapse */ PktDataComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PktDataComponent, deps: [{ token: i1.CommanServiceService }, { token: i2.BiService }, { token: i3.NgxSpinnerService }, { token: i4.ToastrService }, { token: i5.Router }, { token: i5.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
1099
+ /** @nocollapse */ /** @nocollapse */ PktDataComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: PktDataComponent, selector: "app-pkt-data", viewQueries: [{ propertyName: "chart", first: true, predicate: BaseChartDirective, descendants: true }], ngImport: i0, template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"cs.pageBck();\"> Back</span>&nbsp;&nbsp;&nbsp; Packet List\r\n <span class=\"f-12\">({{cs.cDate | date: 'medium'}})</span>\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"innerD\">\r\n <div class=\"content-frame-left\" *ngIf=\"false\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <!-- <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\" *ngFor=\"let nav of navigation;let i=index\"\r\n (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}} </a>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content-frame-body\" style=\"margin-left:0\">\r\n <div class=\"panel panel-default custom-panel\">\r\n <div class=\"panel-body\" style=\"padding:0;\">\r\n <div class=\"infoSec\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n </form>\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <div class=\"dropdown text-right\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <div class=\"\" style=\"margin-bottom: 10px;\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr>\r\n <th>Status</th>\r\n <th>Count</th>\r\n <th>Cts</th>\r\n <th>Avg</th>\r\n <th *ngIf=\"formname!='mixAnalysisReportForm'\">Disc</th>\r\n <th>Amount</th>\r\n\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let st of anaAllGrpStt;let i = index;\">\r\n <tr>\r\n <td>\r\n <!-- <label for=\"{{st}}\" class=\"text-capitalize\">S</label> -->\r\n <!-- *ngIf=\"defaultGrpList.length==0\" -->\r\n <input *ngIf=\"defaultGrpList.length==0\" type=\"checkbox\" id=\"{{st}}\" value=\"{{st}}\"\r\n name=\"{{st}}\" [(ngModel)]=\"stObj[st]\" [checked]=\"true\"\r\n (change)=\"statusWiseDisplay($event,stObj)\" />\r\n {{anaSttLbl[i]||st}}\r\n </td>\r\n <!-- anaSttLbl -->\r\n <td> {{sttWiseSummary?.get(st)?.get('count')}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('wt'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('avg'))}}</td>\r\n <td *ngIf=\"formname!='mixAnalysisReportForm'\"> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('disc'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('rate'))}}</td>\r\n\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n \r\n \r\n <div class=\"col-md-3\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"col-md-5\">\r\n \r\n <select class=\"formcontrol\" name=\"viewdisType\" (change)=\"onGrpSelect(defaultGrpList)\" [(ngModel)]=\"viewdisType\">\r\n <option value=\"group\">Group By</option>\r\n <option value=\"summary\">Summary By</option>\r\n \r\n </select>\r\n </div>\r\n <div class=\"col-md-7\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Group\" [options]=\"staticLov\" [(ngModel)]=\"defaultGrpList\"\r\n name=\"status\" [multiple]=\"true\" [allowClear]=\"true\" (selected)=\"onGrpSelect(defaultGrpList)\"\r\n (deselected)=\"onGrpSelect(defaultGrpList)\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value.toLowerCase()}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <p>\r\n <b>Buyer Pie chart</b>\r\n <i title=\"Buyer wise pie chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('buyer','value')\"></i>\r\n </p>\r\n </div>\r\n\r\n \r\n <div class=\"col-md-2\">\r\n <p *ngIf=\"defaultGrpList.length>0\">\r\n <i title=\"Group wise chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('group','value')\"></i>\r\n </p>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-3 pull-right\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search &nbsp;&nbsp;</label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;float: right;\"\r\n data-toggle=\"tooltip\" data-placement=\"left\" title=\"Download Excel\"\r\n (click)=\"exportToCSV('Packet list');\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button>\r\n\r\n </form>\r\n </div>\r\n\r\n </div>\r\n \r\n \r\n\r\n <!-- <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <button class=\"btn btn-success\" style=\"margin-left: 5px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul> \r\n </div>\r\n </div>\r\n -->\r\n <div class=\"row\">\r\n <ng-container *ngIf=\"viewdisType=='group'\">\r\n <div *ngIf=\"groupBypktList.length >0\" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"grouponScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th (click)=\"sortBy(hrdKey,g)\" style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">\r\n {{header[hrdKey]}}\r\n \r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n \r\n <ng-container *ngFor=\"let groupdtl of loadgroupBypktList let j=index;\">\r\n <tr>\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{groupdtl.value}} &nbsp; &nbsp;\r\n Qty : {{groupdtl['count']}} &nbsp; &nbsp; Carats :\r\n {{groupdtl['crtwt']}}\r\n &nbsp; &nbsp; Avg :{{groupdtl['salavg']}}\r\n &nbsp; &nbsp; Dis% : {{groupdtl['saldis']}}\r\n\r\n &nbsp;&nbsp; Amount : {{groupdtl['salvlu']}} \r\n </td>\r\n </tr> \r\n <!-- <tr *ngIf=\"sttwise\" >\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{g}} &nbsp; &nbsp;\r\n Qty : {{finalGrpVal[g].length}} &nbsp; &nbsp; Carats :\r\n {{totalWeight}}\r\n\r\n &nbsp;&nbsp; Amount :{{totAmt}}\r\n </td>\r\n </tr> -->\r\n\r\n\r\n\r\n <tr *ngFor=\"let pktdtl of groupdtl['pktList'] | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n\r\n \r\n \r\n <div *ngIf=\"pkts.length > 0 && groupBypktList.length==0 \" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th> \r\n Actions\r\n </th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">{{header[hrdKey]}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td><b>Average </b></td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td>\r\n <b>{{cs.splitToTwoDecimal(TotAvgObj[hrdKey])}}</b>\r\n </td>\r\n \r\n </ng-container>\r\n \r\n </tr>\r\n <tr *ngFor=\"let pktdtl of loadResult | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td> \r\n <ng-container *ngFor=\"let lnk of links\">\r\n <i class=\"{{lnk.form_field_icon}}\" *ngIf=\"pktdtl.dsp_stt!='sold'\" (click)=\"OnLinkClick(lnk,pktdtl)\" aria-hidden=\"true\"></i>\r\n &nbsp;\r\n </ng-container>\r\n \r\n </td>\r\n\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"viewdisType=='summary' && summaryList.length>0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\"> <button class=\"btn btn-default\"\r\n style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\" data-toggle=\"tooltip\" data-placement=\"right\"\r\n title=\"Download Excel\" (click)=\"exportToCSVSummary();\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button></div>\r\n </div>\r\n <div class=\"row\">\r\n <table class=\"displayTable\" style=\"text-align: center;padding:10px ;\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th style=\"text-align: center;\">Sr. No</th>\r\n <th style=\"text-align: center;\">Attribute</th>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <th style=\"text-align: center;\" colspan=\"5\">{{hdr}}</th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"posrel\">\r\n <td style=\"text-align: center;\"></td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">Qty</td>\r\n <td style=\"text-align: center;\">Carat</td>\r\n <td style=\"text-align: center;\">Avg</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">Dis</td>\r\n <td style=\"text-align: center;\">Value</td>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let summaryDtl of summaryList | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"text-align: center;\">{{pkti+1}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['value']}}</td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">{{summaryDtl['count_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['crtwt_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['avg_'+hdr]}}</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">{{summaryDtl['dis_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['vlu_'+hdr]}}</td>\r\n </ng-container>\r\n </tr> \r\n\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actionFooter\">\r\n <div class=\"row\">\r\n <div class=\"calsec pull-left\" style=\"padding: 5px;\">\r\n <table>\r\n <tr>\r\n <td style=\"text-align: center;\">\r\n <strong> Total: &nbsp; </strong>\r\n </td>\r\n <td style=\"text-align: center;\">\r\n {{finalGrpVal[\"\"]?.length>0 ? finalGrpVal[\"\"]?.length : pkts?.length}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Weight:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{totalWeight}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Avg:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totAvg}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Dis:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totDis}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Amount:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totAmt}}</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> &nbsp;&nbsp;&nbsp;| &nbsp;&nbsp;Selected Pkts : </strong> </td>\r\n <td style=\"text-align: center;\"> {{selectedItm?.length}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Weight:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectwt}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Avg:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAvg}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Disc:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectDis}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Amount:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAmt}}</td>\r\n\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div>\r\n <button class=\"btn btn-success\" style=\"margin-right: 80px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n <div class=\"modal fade\" id=\"PiechartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\" >\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" 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=\"mailModalHead\">Top {{type}} Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\" >\r\n <div class=\"row\">\r\n <div class=\"col-md-3 pull-right\">\r\n <div class=\"form-group\">\r\n <button id=\"btnQty\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'qty')\">QTY </button>\r\n <button id=\"btnVal\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'value')\">VALUE </button>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isBuyerwise\" >\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [colors]=\"chartColors\" [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isGrpwise\" >\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n\r\n <!-- <div class=\"card-footer row\" *ngIf=\"isQtyWise\">\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('count'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal fade\" id=\"bidMd\" tabindex=\"-1\" style=\"z-index: 1400\" role=\"dialog\"\r\n aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <form name=\"appForm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title text-uppercase\" id=\"exampleModalLabel\">\r\n Price Change</h5>\r\n <button type=\"button\" 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 </div>\r\n <div class=\"modal-body\">\r\n \r\n <div class=\"row\" style=\"padding:10px\">\r\n <div class=\"col-md-12\">\r\n <span style=\"font-size: 16px;font-weight:bold\">{{cObj?.pkt_code}} {{cObj?.sh}} {{cObj?.crtwt}} {{cObj?.co}} {{cObj?.pu}} {{cObj?.ct}} {{cObj?.po}} {{cObj?.sy}} {{cObj?.fl}}</span>\r\n \r\n\r\n </div>\r\n \r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" > Rap: </label>\r\n </div>\r\n <div class=\"col-md-3\"><span class=\"clbl\">{{cObj?.benchmark_rte}}</span></div>\r\n <div class=\"col-md-7\">&nbsp;</div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n \r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" >Discount:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rap_dis}}</span>\r\n </div>\r\n <div class=\"col-md-5\" style=\"text-align: left;\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'dis')\" style=\"width:100px\" class=\"form-control\" name=\"new_rap_dis\" [(ngModel)]=\"cObj['new_rap_dis']\" />\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" style=\"text-align: right;\">Price:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rte}}</span>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'rte')\" style=\"width:100px\" class=\"form-control\" name=\"new_rte\" [(ngModel)]=\"cObj['new_rte']\" />\r\n\r\n </div>\r\n \r\n </div>\r\n \r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"ChangesPrice()\">Update Price</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div> \r\n<button id=\"bidMdBBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#bidMd\"></button>\r\n\r\n <button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n\r\n\r\n</div>", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px 10px 10px 0;background:#1b1e24}.calsec table{color:#fff}.selectedRow{background-color:#3c59983b!important}.notselectedRow{background-color:#fff!important}.legendsList{list-style:none;font-size:14px;padding:5px;display:flex;margin:0 0 0 80px}.formcontrol{height:30px;font-size:12px;line-height:18px;box-shadow:none;padding:5px 12px;border:1px solid #D5D5D5;background:#F9F9F9;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}\n"], components: [{ type: i6.SelectComponent, selector: "ng-select", inputs: ["options", "allowClear", "disabled", "multiple", "noFilter", "notFoundMsg", "placeholder", "filterPlaceholder", "label", "highlightColor", "highlightTextColor"], outputs: ["opened", "closed", "selected", "deselected", "focus", "blur", "noOptionsFound", "filterInputChanged"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i8.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: i9.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.BaseChartDirective, selector: "canvas[baseChart]", inputs: ["options", "data", "datasets", "labels", "chartType", "colors", "legend", "plugins"], outputs: ["chartClick", "chartHover"], exportAs: ["base-chart"] }, { type: i11.AppNoDblClickDirective, selector: "[appAppNoDblClick]" }], pipes: { "date": i7.DatePipe, "tableSearch": i12.TableSearchPipe } });
1100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PktDataComponent, decorators: [{
1101
+ type: Component,
1102
+ args: [{ selector: 'app-pkt-data', template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"cs.pageBck();\"> Back</span>&nbsp;&nbsp;&nbsp; Packet List\r\n <span class=\"f-12\">({{cs.cDate | date: 'medium'}})</span>\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"innerD\">\r\n <div class=\"content-frame-left\" *ngIf=\"false\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <!-- <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\" *ngFor=\"let nav of navigation;let i=index\"\r\n (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}} </a>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content-frame-body\" style=\"margin-left:0\">\r\n <div class=\"panel panel-default custom-panel\">\r\n <div class=\"panel-body\" style=\"padding:0;\">\r\n <div class=\"infoSec\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n </form>\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <div class=\"dropdown text-right\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <div class=\"\" style=\"margin-bottom: 10px;\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr>\r\n <th>Status</th>\r\n <th>Count</th>\r\n <th>Cts</th>\r\n <th>Avg</th>\r\n <th *ngIf=\"formname!='mixAnalysisReportForm'\">Disc</th>\r\n <th>Amount</th>\r\n\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let st of anaAllGrpStt;let i = index;\">\r\n <tr>\r\n <td>\r\n <!-- <label for=\"{{st}}\" class=\"text-capitalize\">S</label> -->\r\n <!-- *ngIf=\"defaultGrpList.length==0\" -->\r\n <input *ngIf=\"defaultGrpList.length==0\" type=\"checkbox\" id=\"{{st}}\" value=\"{{st}}\"\r\n name=\"{{st}}\" [(ngModel)]=\"stObj[st]\" [checked]=\"true\"\r\n (change)=\"statusWiseDisplay($event,stObj)\" />\r\n {{anaSttLbl[i]||st}}\r\n </td>\r\n <!-- anaSttLbl -->\r\n <td> {{sttWiseSummary?.get(st)?.get('count')}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('wt'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('avg'))}}</td>\r\n <td *ngIf=\"formname!='mixAnalysisReportForm'\"> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('disc'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('rate'))}}</td>\r\n\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n \r\n \r\n <div class=\"col-md-3\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"col-md-5\">\r\n \r\n <select class=\"formcontrol\" name=\"viewdisType\" (change)=\"onGrpSelect(defaultGrpList)\" [(ngModel)]=\"viewdisType\">\r\n <option value=\"group\">Group By</option>\r\n <option value=\"summary\">Summary By</option>\r\n \r\n </select>\r\n </div>\r\n <div class=\"col-md-7\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Group\" [options]=\"staticLov\" [(ngModel)]=\"defaultGrpList\"\r\n name=\"status\" [multiple]=\"true\" [allowClear]=\"true\" (selected)=\"onGrpSelect(defaultGrpList)\"\r\n (deselected)=\"onGrpSelect(defaultGrpList)\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value.toLowerCase()}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <p>\r\n <b>Buyer Pie chart</b>\r\n <i title=\"Buyer wise pie chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('buyer','value')\"></i>\r\n </p>\r\n </div>\r\n\r\n \r\n <div class=\"col-md-2\">\r\n <p *ngIf=\"defaultGrpList.length>0\">\r\n <i title=\"Group wise chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('group','value')\"></i>\r\n </p>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-3 pull-right\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search &nbsp;&nbsp;</label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;float: right;\"\r\n data-toggle=\"tooltip\" data-placement=\"left\" title=\"Download Excel\"\r\n (click)=\"exportToCSV('Packet list');\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button>\r\n\r\n </form>\r\n </div>\r\n\r\n </div>\r\n \r\n \r\n\r\n <!-- <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <button class=\"btn btn-success\" style=\"margin-left: 5px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul> \r\n </div>\r\n </div>\r\n -->\r\n <div class=\"row\">\r\n <ng-container *ngIf=\"viewdisType=='group'\">\r\n <div *ngIf=\"groupBypktList.length >0\" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"grouponScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th (click)=\"sortBy(hrdKey,g)\" style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">\r\n {{header[hrdKey]}}\r\n \r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n \r\n <ng-container *ngFor=\"let groupdtl of loadgroupBypktList let j=index;\">\r\n <tr>\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{groupdtl.value}} &nbsp; &nbsp;\r\n Qty : {{groupdtl['count']}} &nbsp; &nbsp; Carats :\r\n {{groupdtl['crtwt']}}\r\n &nbsp; &nbsp; Avg :{{groupdtl['salavg']}}\r\n &nbsp; &nbsp; Dis% : {{groupdtl['saldis']}}\r\n\r\n &nbsp;&nbsp; Amount : {{groupdtl['salvlu']}} \r\n </td>\r\n </tr> \r\n <!-- <tr *ngIf=\"sttwise\" >\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{g}} &nbsp; &nbsp;\r\n Qty : {{finalGrpVal[g].length}} &nbsp; &nbsp; Carats :\r\n {{totalWeight}}\r\n\r\n &nbsp;&nbsp; Amount :{{totAmt}}\r\n </td>\r\n </tr> -->\r\n\r\n\r\n\r\n <tr *ngFor=\"let pktdtl of groupdtl['pktList'] | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n\r\n \r\n \r\n <div *ngIf=\"pkts.length > 0 && groupBypktList.length==0 \" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th> \r\n Actions\r\n </th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">{{header[hrdKey]}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td><b>Average </b></td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td>\r\n <b>{{cs.splitToTwoDecimal(TotAvgObj[hrdKey])}}</b>\r\n </td>\r\n \r\n </ng-container>\r\n \r\n </tr>\r\n <tr *ngFor=\"let pktdtl of loadResult | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td> \r\n <ng-container *ngFor=\"let lnk of links\">\r\n <i class=\"{{lnk.form_field_icon}}\" *ngIf=\"pktdtl.dsp_stt!='sold'\" (click)=\"OnLinkClick(lnk,pktdtl)\" aria-hidden=\"true\"></i>\r\n &nbsp;\r\n </ng-container>\r\n \r\n </td>\r\n\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"viewdisType=='summary' && summaryList.length>0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\"> <button class=\"btn btn-default\"\r\n style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\" data-toggle=\"tooltip\" data-placement=\"right\"\r\n title=\"Download Excel\" (click)=\"exportToCSVSummary();\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button></div>\r\n </div>\r\n <div class=\"row\">\r\n <table class=\"displayTable\" style=\"text-align: center;padding:10px ;\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th style=\"text-align: center;\">Sr. No</th>\r\n <th style=\"text-align: center;\">Attribute</th>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <th style=\"text-align: center;\" colspan=\"5\">{{hdr}}</th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"posrel\">\r\n <td style=\"text-align: center;\"></td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">Qty</td>\r\n <td style=\"text-align: center;\">Carat</td>\r\n <td style=\"text-align: center;\">Avg</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">Dis</td>\r\n <td style=\"text-align: center;\">Value</td>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let summaryDtl of summaryList | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"text-align: center;\">{{pkti+1}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['value']}}</td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">{{summaryDtl['count_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['crtwt_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['avg_'+hdr]}}</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">{{summaryDtl['dis_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['vlu_'+hdr]}}</td>\r\n </ng-container>\r\n </tr> \r\n\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actionFooter\">\r\n <div class=\"row\">\r\n <div class=\"calsec pull-left\" style=\"padding: 5px;\">\r\n <table>\r\n <tr>\r\n <td style=\"text-align: center;\">\r\n <strong> Total: &nbsp; </strong>\r\n </td>\r\n <td style=\"text-align: center;\">\r\n {{finalGrpVal[\"\"]?.length>0 ? finalGrpVal[\"\"]?.length : pkts?.length}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Weight:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{totalWeight}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Avg:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totAvg}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Dis:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totDis}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Amount:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totAmt}}</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> &nbsp;&nbsp;&nbsp;| &nbsp;&nbsp;Selected Pkts : </strong> </td>\r\n <td style=\"text-align: center;\"> {{selectedItm?.length}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Weight:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectwt}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Avg:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAvg}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Disc:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectDis}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Amount:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAmt}}</td>\r\n\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div>\r\n <button class=\"btn btn-success\" style=\"margin-right: 80px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n <div class=\"modal fade\" id=\"PiechartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\" >\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" 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=\"mailModalHead\">Top {{type}} Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\" >\r\n <div class=\"row\">\r\n <div class=\"col-md-3 pull-right\">\r\n <div class=\"form-group\">\r\n <button id=\"btnQty\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'qty')\">QTY </button>\r\n <button id=\"btnVal\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'value')\">VALUE </button>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isBuyerwise\" >\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [colors]=\"chartColors\" [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isGrpwise\" >\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n\r\n <!-- <div class=\"card-footer row\" *ngIf=\"isQtyWise\">\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('count'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal fade\" id=\"bidMd\" tabindex=\"-1\" style=\"z-index: 1400\" role=\"dialog\"\r\n aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <form name=\"appForm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title text-uppercase\" id=\"exampleModalLabel\">\r\n Price Change</h5>\r\n <button type=\"button\" 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 </div>\r\n <div class=\"modal-body\">\r\n \r\n <div class=\"row\" style=\"padding:10px\">\r\n <div class=\"col-md-12\">\r\n <span style=\"font-size: 16px;font-weight:bold\">{{cObj?.pkt_code}} {{cObj?.sh}} {{cObj?.crtwt}} {{cObj?.co}} {{cObj?.pu}} {{cObj?.ct}} {{cObj?.po}} {{cObj?.sy}} {{cObj?.fl}}</span>\r\n \r\n\r\n </div>\r\n \r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" > Rap: </label>\r\n </div>\r\n <div class=\"col-md-3\"><span class=\"clbl\">{{cObj?.benchmark_rte}}</span></div>\r\n <div class=\"col-md-7\">&nbsp;</div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n \r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" >Discount:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rap_dis}}</span>\r\n </div>\r\n <div class=\"col-md-5\" style=\"text-align: left;\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'dis')\" style=\"width:100px\" class=\"form-control\" name=\"new_rap_dis\" [(ngModel)]=\"cObj['new_rap_dis']\" />\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" style=\"text-align: right;\">Price:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rte}}</span>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'rte')\" style=\"width:100px\" class=\"form-control\" name=\"new_rte\" [(ngModel)]=\"cObj['new_rte']\" />\r\n\r\n </div>\r\n \r\n </div>\r\n \r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"ChangesPrice()\">Update Price</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div> \r\n<button id=\"bidMdBBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#bidMd\"></button>\r\n\r\n <button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n\r\n\r\n</div>", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px 10px 10px 0;background:#1b1e24}.calsec table{color:#fff}.selectedRow{background-color:#3c59983b!important}.notselectedRow{background-color:#fff!important}.legendsList{list-style:none;font-size:14px;padding:5px;display:flex;margin:0 0 0 80px}.formcontrol{height:30px;font-size:12px;line-height:18px;box-shadow:none;padding:5px 12px;border:1px solid #D5D5D5;background:#F9F9F9;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}\n"] }]
1103
+ }], ctorParameters: function () { return [{ type: i1.CommanServiceService }, { type: i2.BiService }, { type: i3.NgxSpinnerService }, { type: i4.ToastrService }, { type: i5.Router }, { type: i5.ActivatedRoute }]; }, propDecorators: { chart: [{
1104
+ type: ViewChild,
1105
+ args: [BaseChartDirective]
1106
+ }] } });
1107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGt0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXpsaWIvc3JjL2xpYi9wa3QtZGF0YS9wa3QtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lemxpYi9zcmMvbGliL3BrdC1kYXRhL3BrdC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxpQ0FBaUM7QUFDakMsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBQ2xFLGtDQUFrQztBQU9sQyxNQUFNLE9BQU8sZ0JBQWdCO0lBd0Qz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QzlDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBQ3ZCLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO3dCQUN0QyxNQUFNLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7d0JBQzFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzt3QkFDMUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO3dCQUN6QyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO3dCQUM5RCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDL0UsSUFBSSxHQUFHLElBQUksTUFBTSxFQUFFOzRCQUNqQixHQUFHLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7NEJBQ3RDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOzRCQUMzQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDOzRCQUM5RCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzt5QkFDaEY7cUJBQ0Y7Z0JBRUgsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksUUFBUSxJQUFJLFNBQVMsRUFBRTtnQkFDbEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ25EO1lBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FFMUI7YUFBTTtZQUNMLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7YUFDdEQ7U0FDRjtJQUNILENBQUM7SUFFRCxrQkFBa0I7UUFFaEIsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXhCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JELEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN2RCxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25ELEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxDQUFDO1lBRUgsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFWCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM3QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN6QyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUVwQixJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksTUFBTSxFQUFFO29CQUN6QixNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQ3RFO3FCQUNJO29CQUNILE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDbEU7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTNDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUMzRixRQUFRLEVBQUUsQ0FBQztRQUViLENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQWFELFdBQVcsQ0FBQyxRQUFRLEVBQUUsU0FBUztRQUM3QixJQUFJLFNBQVMsSUFBSSxLQUFLLEVBQUU7WUFDdEIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xFLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRCxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0QsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2hFO2FBQ0k7WUFDSCxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbEUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFELFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RCxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDaEU7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLFNBQVMsQ0FBQztRQUNkLElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixnQkFBZ0I7UUFDaEIsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDdEIsWUFBWSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUNmO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQSxXQUFXO1NBRS9DO1FBRUQsOEJBQThCO1FBRTlCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEtBQUs7WUFDL0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVDLElBQUksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2FBQ3RDO1lBRUQsT0FBTyxJQUFJLENBQUM7WUFDWixvRkFBb0Y7UUFDdEYsQ0FBQyxDQUFDLENBQUM7UUFDSCx1QkFBdUI7UUFFdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuQixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDYixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTNCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUzSCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsZ0NBQWdDO1lBQ2pFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDWixtQ0FBbUM7WUFFbkMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFFWixnRUFBZ0U7U0FFakU7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3QixJQUFJLFNBQVMsSUFBSSxLQUFLLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNwRDthQUNJO1lBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNuRDtRQUVELHNCQUFzQjtRQUN0QixzQkFBc0I7SUFFeEIsQ0FBQztJQUdELFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLDZDQUE2QztZQUM3QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7WUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBRXJCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtnQkFDakIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLFFBQVEsR0FBRyxJQUFJLENBQUM7YUFDakI7WUFFRCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTVCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUUxQixJQUFJLENBQUMsR0FBRyxHQUFHO2dCQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUVwQyxJQUFJLENBQUMsR0FBRyxHQUFHO2dCQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7WUFFL0IsSUFBSSxDQUFDLEdBQUcsR0FBRztnQkFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFdEIsMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0Y7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVoQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2hDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbEIsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlGLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0Isa0VBQWtFO1lBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVyRSxRQUFRLEVBQUUsQ0FBQztZQUVYLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRTtnQkFDakIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNoQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2FBQ2pCO1lBQ0QsbUJBQW1CO1lBQ25CLHVCQUF1QjtRQUV6QixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUM3QixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWpCLHdCQUF3QjtJQUUxQixDQUFDO0lBNEZELE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVM7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFHdEUsSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLElBQUksSUFBSSxJQUFJLEtBQUs7Z0JBQ2YsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFFckYsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDN0QsUUFBUSxDQUFBO1lBQ1IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELElBQUksUUFBUSxHQUFHLFFBQVEsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN4QztpQkFDSTtnQkFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzNDO1NBRUY7YUFDSTtZQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDOUQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN0RixJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsa0VBQWtFO1FBQ2xFLDZEQUE2RDtRQUU3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDeEc7UUFFRCx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRTlCLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBUztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFO2dCQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUN6QjtpQkFDSTtnQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzthQUN2QjtRQUVILENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNyRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUNELFdBQVcsQ0FBQyxRQUFRO1FBQ2xCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUNuQixLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUMvQixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFDdEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksT0FBTyxHQUFHLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELFVBQVUsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxPQUFPLENBQUM7UUFDWixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xCLGdCQUFnQjtZQUNoQixtQ0FBbUM7WUFDbkMsa0JBQWtCO1lBQ2xCLElBQUk7WUFDSix1Q0FBdUM7WUFDdkMsdUJBQXVCO1lBQ3ZCLElBQUk7WUFDSix1Q0FBdUM7WUFDdkMsaUJBQWlCO1lBQ2pCLElBQUk7WUFFSixTQUFTO1lBQ1QsMkJBQTJCO1lBQzNCLElBQUk7WUFFSixzREFBc0Q7WUFDdEQsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBLEtBQUs7WUFFeEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNiLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFFaEIsdUZBQXVGO1lBQ3ZGLHVHQUF1RztZQUd2RyxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNiLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekMsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRTtnQkFDN0IsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hJO2lCQUNJO2dCQUNILElBQUksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUQ7WUFFRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7Z0JBQ25CLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQzFDO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ3JCO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBRXJDLDBGQUEwRjtZQUMxRixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUEsS0FBSztRQUV6RCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNmLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDakIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ1osSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBR2hCLDRDQUE0QztZQUM1Qyx5RUFBeUU7WUFDekUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUV4RCxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1lBQy9DLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFOUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUVyRSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFFdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLEdBQUc7UUFFTCxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRW5DLENBQUM7SUFHRCxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUk7UUFDcEIsUUFBUSxDQUFBO1FBQ1IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN2QixRQUFRLENBQUE7WUFDUixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUU7Z0JBQzNCLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxRTtpQkFDSTtnQkFDSCxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM3RDtZQUVELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDekUsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFO2dCQUMzQixJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7YUFDdEM7aUJBQ0k7Z0JBQ0gsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJO1FBQ3ZCLFFBQVEsQ0FBQTtRQUNSLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdkIsUUFBUSxDQUFBO1lBQ1IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBRWQsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsWUFBWTtRQUNWLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFRCxRQUFRO1FBQ04seUNBQXlDO1FBQ3pDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUU1QixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQzlCLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDL0IsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzFELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxRQUFRLElBQUksVUFBVSxFQUFFO2dCQUMxQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDeEI7aUJBQ0k7Z0JBQ0gsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLE9BQU8sSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLFNBQVMsSUFBSSxPQUFPLElBQUksRUFBRSxFQUFFO29CQUM1RCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztpQkFDM0I7Z0JBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBRXRCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2RyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFM0IscUhBQXFIO2dCQUNySCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BHLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFMUYsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUMxQixJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksTUFBTSxFQUFFO3dCQUM3QixNQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztxQkFDekU7eUJBQ0k7d0JBQ0gsTUFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7cUJBQ3JFO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUlILElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUd4RixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNyQyxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVk7b0JBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtnQkFDbkMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBR2pCO1FBRUgsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0RSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLG1EQUFtRDtRQUNuRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckUsSUFBSSxTQUFTLElBQUksRUFBRTtZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELFdBQVcsQ0FBQyxHQUFHO1FBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3hDLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6QyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNqQixnQkFBZ0I7WUFDaEIsb0NBQW9DO1lBQ3BDLElBQUk7WUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixHQUFHLEdBQUcsRUFBRSxDQUFDO1NBQ1Y7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDZixLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDaEIsQ0FBQyxDQUFDLENBQUM7UUFDSixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsY0FBYztRQUVaLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxzQkFBc0I7UUFDL0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztRQUM1QyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3ZFLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7Z0JBQ2hDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUU1QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNyQztRQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7bUpBMXZDVSxnQkFBZ0I7dUlBQWhCLGdCQUFnQiwyRkFxRGhCLGtCQUFrQixnREMxRS9CLGsxM0JBc2lCTTsyRkRqaEJPLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjO2lQQTBEakIsS0FBSztzQkFEWCxTQUFTO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxuaW1wb3J0IHsgTmd4U3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwibmd4LXNwaW5uZXJcIjtcclxuaW1wb3J0IHsgQmlTZXJ2aWNlIH0gZnJvbSAnLi8uLi9iaS1zZXJ2aWNlL2JpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tYW5TZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uL2NvbW1hbi1zZXJ2aWNlL2NvbW1hbi1zZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDb29raWUgfSBmcm9tICduZzItY29va2llcy9uZzItY29va2llcyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgQmFzZUNoYXJ0RGlyZWN0aXZlIH0gZnJvbSAnbmcyLWNoYXJ0cyc7XHJcbmltcG9ydCAqIGFzIHBsdWdpbkRhdGFMYWJlbHMgZnJvbSAnY2hhcnRqcy1wbHVnaW4tbGFiZWxzJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG4vLyBpbXBvcnQgKiBhcyBSeCBmcm9tICdyeGpzL1J4JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBncm91cEJ5ICwgdG9BcnJheSwgbWFwLCBtZXJnZU1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuLy8gaW1wb3J0IHsgc3VtQnkgfSBmcm9tICdsb2Rhc2gnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtcGt0LWRhdGEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wa3QtZGF0YS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGt0LWRhdGEuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQa3REYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgcGt0cyA9IFtdO1xyXG4gIGhlYWRlcktleSA9IFtdO1xyXG4gIGhlYWRlciA9IFtdO1xyXG4gIGNrO1xyXG4gIHRvdGFsV2VpZ2h0ID0gMDtcclxuICByZXFoZWFkZXI7XHJcbiAgc2Nyb2xsRGlzdGFuY2UgPSAxO1xyXG4gIHNjcm9sbFVwRGlzdGFuY2UgPSAyO1xyXG4gIHN0YXJ0SW5kZXggPSAwO1xyXG4gIGVuZEluZGV4ID0gMzA7XHJcbiAgZ3JvdXBzdGFydEluZGV4ID0gMDtcclxuICBncm91cGVuZEluZGV4ID0gMzA7XHJcbiAgbG9hZFJlc3VsdCA9IFtdO1xyXG4gIHJlc3VsdGxlbmd0aCA9IDA7XHJcbiAgdG90QXZnID0gMDtcclxuICB0b3REaXMgPSAwO1xyXG4gIHNlbGVjdGVkSXRtID0gW107XHJcbiAgc2VsZWN0d3QgPSAwO1xyXG4gIHNlbGVjdEF2ZyA9IDA7XHJcbiAgc2VsZWN0RGlzID0gMDtcclxuICBzZWxlY3RBbXQgPSAwO1xyXG4gIHNlYXJjaEY7XHJcbiAgZHJvcGRvd25TZXR0aW5ncztcclxuICBzdHRXaXNlU3VtbWFyeSA9IG5ldyBNYXAoKTtcclxuICAvLyBhbmFBbGxHcnBTdHQgPSBbJ2FzcnQnLCAnbGFiJywgJ21rdCcsICdzb2xkJ107XHJcbiAgYW5hQWxsR3JwU3R0ID0gW107XHJcbiAgZztcclxuXHJcbiAgbGVnZW5kTGlzdCA9IFtdO1xyXG4gIG5ld3dpbmRvdyA9IFwiWUVTXCI7XHJcbiAgcGFnZURlZmluYXRpb247XHJcbiAgc29ydGVkO1xyXG4gIHNvcnRPbjtcclxuICBjbG1uO1xyXG4gIHN0YXRpY0xvdiA9IFtdO1xyXG4gIGRlZmF1bHRHcnBMaXN0ID0gW107XHJcbiAgc3RPYmogPSB7fTtcclxuICB0b3RBbXQgPSAwO1xyXG4gIG5vZGF0YSA9IHRydWU7XHJcbiAgdmlld2Rpc1R5cGUgPSBcImdyb3VwXCI7XHJcbiAgc3VtbWFyeUxpc3QgPSBbXTtcclxuICBjb1B1YXR0cmlidXRlU3RyID0gW107XHJcbiAgZm9ybW5hbWU7XHJcbiAgbW9kdWxlbmFtZTtcclxuICBjVXJsO1xyXG4gIGxpbmtzO1xyXG4gIGNPYmo7XHJcbiAgZ3JvdXBCeXBrdExpc3QgPSBbXTtcclxuICBsb2FkZ3JvdXBCeXBrdExpc3QgPSBbXTtcclxuXHJcblxyXG4gIEBWaWV3Q2hpbGQoQmFzZUNoYXJ0RGlyZWN0aXZlKVxyXG4gIHB1YmxpYyBjaGFydDogQmFzZUNoYXJ0RGlyZWN0aXZlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBjczogQ29tbWFuU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJpczogQmlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc3Bpbm5lclNlcnZpY2U6IE5neFNwaW5uZXJTZXJ2aWNlICxcclxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcbiAgKSB7IH1cclxuXHJcbiAgbHBhZChsU3RyLCBsbikge1xyXG4gICAgbGV0IHN0ciA9IGxTdHI7XHJcbiAgICB3aGlsZSAoc3RyLmxlbmd0aCA8IGxuKSB7IHN0ciA9ICcwJyArIHN0cjsgfVxyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFJlc3VsdCgpIHtcclxuICAgIHRoaXMuY09iaiA9IHt9O1xyXG4gICAgdGhpcy5ncm91cEJ5cGt0TGlzdCA9IFtdO1xyXG4gICAgdGhpcy5fc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgdGhpcy5wa3RzID0gW107XHJcbiAgICB0aGlzLmdycCA9IFtdO1xyXG4gICAgdGhpcy5oZWFkZXJLZXkgPSBbXTtcclxuICAgIHRoaXMubGVnZW5kTGlzdCA9IFtdO1xyXG4gICAgdGhpcy52aWV3ZGlzVHlwZSA9IFwiZ3JvdXBcIjtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHRoaXMuZm9ybW5hbWUgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ107XHJcbiAgICByZXFPYmpbJ3NlYXJjaElkbkxpc3QnXSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzcmNJZG5zJykuc3BsaXQoJywnKTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSAwO1xyXG4gICAgdGhpcy5lbmRJbmRleCA9IDMwO1xyXG4gICAgdGhpcy5sb2FkUmVzdWx0ID0gW107XHJcbiAgICB0aGlzLmJpcy5kYXRhKHJlcU9iaiwgJ3NlYXJjaCcsICdtYXJrZXRpbmcvc2VhcmNoJylcclxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgICBsZXQgcmVzID0gZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInJlc1wiLCByZXMpO1xyXG4gICAgICAgICAgdGhpcy5wYWdlRGVmaW5hdGlvbiA9IHJlcy5wYWdlRGVmaW5hdGlvbiB8fCB7fTtcclxuICAgICAgICAgIHRoaXMubGlua3MgPSB0aGlzLnBhZ2VEZWZpbmF0aW9uLmxpbmsgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnBrdHMgPSByZXMuc2VhcmNoUmVzdWx0RHRsIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5hbmFBbGxHcnBTdHQgPSBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5wa3RzLm1hcChlbGVtZW50ID0+IGVsZW1lbnQuZHNwX3N0dCkpKTtcclxuICAgICAgICAgIHRoaXMucmVzdWx0bGVuZ3RoID0gdGhpcy5wa3RzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMuY29QdWF0dHJpYnV0ZVN0ciA9IHJlcy5jb3B1U3RydWN0dXJlRHRsIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5oZWFkZXJLZXkgPSByZXMucmVzdWx0VmlldztcclxuICAgICAgICAgIHRoaXMuaGVhZGVyID0gcmVzLnJlc3VsdFZpZXdEdGw7XHJcbiAgICAgICAgICB0aGlzLmxlZ2VuZExpc3QgPSByZXMubGVnZW5kTGlzdDtcclxuICAgICAgICAgIHRoaXMudG90YWxXZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMucGt0cy5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuICAgICAgICAgIGxldCByYXBWYWwgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMucGt0cy5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5yYXBfdmx1KSwgMCkpO1xyXG4gICAgICAgICAgbGV0IHRvdEFtdCA9IDA7XHJcbiAgICAgICAgICB0aGlzLnBrdHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnc29sZCcpIHtcclxuICAgICAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydzYWxfcnRlJ10pICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydydGUnXSkgKiBwYXJzZUZsb2F0KGVsZW1lbnRbJ2NydHd0J10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLnRvdEFtdCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10KTtcclxuICAgICAgICAgIHRoaXMudG90QXZnID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnRvdEFtdCAvIHRoaXMudG90YWxXZWlnaHQpO1xyXG4gICAgICAgICAgdGhpcy50b3REaXMgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKCgodG90QW10ICogMTAwKSAvIHBhcnNlRmxvYXQocmFwVmFsKSkgLSAxMDApO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZW5kSW5kZXggPiB0aGlzLnJlc3VsdGxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5lbmRJbmRleCA9IHRoaXMucmVzdWx0bGVuZ3RoXHJcbiAgICAgICAgICB0aGlzLmFkZEl0ZW1zKCk7XHJcbiAgICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgICAgLy8gICB0aGlzLnRvdEF2ZyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10IC8gcGFyc2VGbG9hdCh0b3R3ZWlnaHQpKTtcclxuICAgICAgICAgIC8vICB0aGlzLnRvdERpcyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKCh0b3RBbXQgKiAxMDApIC8gcGFyc2VGbG9hdCh0b3RyYXBWYWwpKSAtIDEwMCk7XHJcbiAgICAgICAgICB0aGlzLmdldFN1bW1hcnkodGhpcy5wa3RzKTtcclxuICAgICAgICAgIC8vIHRoaXMuY3JlYXRlR3JwKHRoaXMucGt0cywgdGhpcy5kZWZhdWx0R3JwTGlzdCk7XHJcbiAgICAgICAgICAvLyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnQkktUEtUX0dST1VQX0JZJyxKU09OLnN0cmluZ2lmeShyZXMucGFnZURlZmluYXRpb24uZm9ybV9maWVsZFswXS5sb3ZfcXJ5KSlcclxuICAgICAgICAgIC8vIGxldCBHUlBieSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJLVBLVF9HUk9VUF9CWScpKTtcclxuICAgICAgICAgIHRoaXMuZ2V0U3RhdGljS1YocmVzLnBhZ2VEZWZpbmF0aW9uLmZvcm1fZmllbGRbMF0ubG92X3FyeSk7XHJcbiAgICAgICAgICBsZXQgYXZnRmllbGRzID0gcmVzLnBhZ2VEZWZpbmF0aW9uLnRhYnNbMF0ubG92X3FyeS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUb3RhbHMoYXZnRmllbGRzLCB0aGlzLnBrdHMpO1xyXG4gICAgICAgICAgbGV0IHR0bEZpZWxkcyA9IHJlcy5wYWdlRGVmaW5hdGlvbi5vdGhlcnNbMF0ubG92X3FyeS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUb3RhbHNUdGwodHRsRmllbGRzLCB0aGlzLnBrdHMpO1xyXG5cclxuXHJcblxyXG4gICAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZGF0YS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgc2VsZWN0Um93KHBrdElkKSB7XHJcbiAgICB2YXIgY2hlY2tib3hJZCA9IFwiY2JfXCIgKyBwa3RJZDtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNoZWNrYm94SWQpLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBjaGVja2VkUm93KG9iaiwgc3RvY2tpZG4sIHN0YXR1cykge1xyXG4gICAgbGV0IGNiSWQgPSAnY2JfJyArIG9iai5zdG9ja19pZG47XHJcbiAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XHJcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2JJZCk7Ly9wa3RJZFxyXG4gICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwic2VsZWN0ZWRSb3dcIik7XHJcbiAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJub3RzZWxlY3RlZFJvd1wiKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0bS5mb3JFYWNoKChlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChlLnN0b2NrX2lkbiA9PSBzdG9ja2lkbikge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0bS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNiSWQpOy8vcGt0SWRcclxuICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcIm5vdHNlbGVjdGVkUm93XCIpO1xyXG4gICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRSb3dcIik7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdG0ucHVzaChvYmopO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3R3dCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5zZWxlY3RlZEl0bS5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuXHJcbiAgICAvLyBsZXQgdG90QW10ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnNlbGVjdGVkSXRtLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5zYWxfYW1vdW50LCAwKSk7XHJcbiAgICBsZXQgdG90d2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnNlbGVjdGVkSXRtLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLmNydHd0KSwgMCkpO1xyXG4gICAgbGV0IHRvdHJhcFZhbCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5zZWxlY3RlZEl0bS5yZWR1Y2UoKGEsIGIpID0+ICthICsgK2IucmFwX3ZsdSwgMCkpO1xyXG5cclxuXHJcbiAgICBsZXQgdG90QW10ID0gMDtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdG0uZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnc29sZCcpIHtcclxuICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydzYWxfcnRlJ10gfHwgMCkgKiBwYXJzZUZsb2F0KGVsZW1lbnRbJ2NydHd0J10pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRvdEFtdCArPSBwYXJzZUZsb2F0KGVsZW1lbnRbJ3J0ZSddIHx8IDApICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RBdmcgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCAvIHBhcnNlRmxvYXQodG90d2VpZ2h0KSk7XHJcbiAgICB0aGlzLnNlbGVjdERpcyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKHRvdEFtdCAvIHBhcnNlRmxvYXQodG90cmFwVmFsKSAqIDEwMCkgLSAxMDApO1xyXG4gICAgdGhpcy5zZWxlY3RBbXQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCk7XHJcblxyXG4gIH1cclxuXHJcbiAgc3R0d2lzZSA9IGZhbHNlO1xyXG4gIHN0YXR1c1dpc2VEaXNwbGF5KGUsIG0pIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICB0aGlzLnN0dHdpc2UgPSB0cnVlO1xyXG4gICAgbGV0IGdBcnIgPSBbXTtcclxuICAgIGZvciAobGV0IGtleSBpbiBtKSB7XHJcbiAgICAgIGlmIChtW2tleV0gPT0gdHJ1ZSkge1xyXG4gICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgbGV0IHBrID0gdGhpcy5wa3RzLmZpbHRlcihlID0+IGUuZ3JwX3N0dCA9PSBrZXkpO1xyXG4gICAgICAgIGdBcnIgPSBnQXJyLmNvbmNhdChwayk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IHBrID0gZ0Fyci5maWx0ZXIoZSA9PiBlLmdycF9zdHQgIT0ga2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGVidWdnZXJcclxuICAgIHRoaXMuZmluYWxHcnBWYWxbXCJcIl0gPSBnQXJyO1xyXG4gICAgdGhpcy5sb2FkUmVzdWx0ID0gZ0FycjtcclxuXHJcbiAgICBpZiAodGhpcy5maW5hbEdycFZhbFtcIlwiXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMudG90YWxXZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuZmluYWxHcnBWYWxbXCJcIl0ucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcblxyXG4gICAgICBsZXQgdG90d2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLmZpbmFsR3JwVmFsW1wiXCJdLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLmNydHd0KSwgMCkpO1xyXG4gICAgICBsZXQgdG90cmFwVmFsID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLmZpbmFsR3JwVmFsW1wiXCJdLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5yYXBfdmx1LCAwKSk7XHJcblxyXG4gICAgICBsZXQgdG90QW10ID0gMDtcclxuICAgICAgdGhpcy5maW5hbEdycFZhbFtcIlwiXS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIGlmIChlbGVtZW50LmdycF9zdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydzYWxfcnRlJ10pICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydydGUnXSkgKiBwYXJzZUZsb2F0KGVsZW1lbnRbJ2NydHd0J10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG90QW10ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3RBbXQpO1xyXG5cclxuICAgICAgdGhpcy50b3RBdmcgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCAvIHBhcnNlRmxvYXQodG90d2VpZ2h0KSk7XHJcbiAgICAgIHRoaXMudG90RGlzID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHRvdEFtdCAqIDEwMCkgLyBwYXJzZUZsb2F0KHRvdHJhcFZhbCkpIC0gMTAwKTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvLyBsZXQgZ3JwQnkgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgIC8vIGlmIChlLnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAvLyAgIGxldCBwayA9IHRoaXMucGt0cy5maWx0ZXIoZSA9PiBlLmdycF9zdHQgPT0gZ3JwQnkpO1xyXG4gICAgLy8gICB0aGlzLmZpbmFsR3JwVmFsW1wiXCJdID0gcGs7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBlbHNlIHtcclxuICAgIC8vICAgbGV0IHBrID0gdGhpcy5wa3RzLmZpbHRlcihlID0+IGUuZ3JwX3N0dCAhPT0gZ3JwQnkpO1xyXG4gICAgLy8gICB0aGlzLmZpbmFsR3JwVmFsW1wiXCJdID0gcGs7XHJcbiAgICAvLyB9XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmZpbmFsR3JwVmFsKTtcclxuXHJcbiAgfVxyXG4gIE9uTGlua0NsaWNrKGxuaywgcGt0ZHRsKSB7XHJcblxyXG4gICAgaWYgKGxuay5mb3JtX2ZpZWxkID09ICdwcmljZXVwZGF0ZScpIHtcclxuICAgICAgdGhpcy5jT2JqID0gcGt0ZHRsO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJpZE1kQkJ0blwiKS5jbGljaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRSdGVEaXMob2JqZHRsLCB0eXApIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICBpZiAodHlwID09ICdydGUnKSB7XHJcbiAgICAgIGxldCBkaXMgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKCgocGFyc2VGbG9hdChvYmpkdGwubmV3X3J0ZSkgKiAxMDApIC8gcGFyc2VGbG9hdChvYmpkdGwucmFwX3J0ZSkpIC0gMTAwKTtcclxuICAgICAgb2JqZHRsW1wibmV3X3JhcF9kaXNcIl0gPSBkaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cCA9PSAnZGlzJykge1xyXG4gICAgICBsZXQgcnRlID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgocGFyc2VGbG9hdChvYmpkdGwucmFwX3J0ZSkgKiAoMTAwICsgcGFyc2VGbG9hdChvYmpkdGwubmV3X3JhcF9kaXMpKSAvIDEwMCkpO1xyXG4gICAgICBvYmpkdGxbXCJuZXdfcnRlXCJdID0gcnRlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIENoYW5nZXNQcmljZSgpIHtcclxuXHJcblxyXG4gICAgbGV0IG5tZUlkbiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ25tZUlkbicpKTtcclxuICAgIGxldCBwa3REYXRhTGlzdCA9IFtdO1xyXG4gICAgbGV0IHVwZGF0ZU9iaiA9IHt9O1xyXG4gICAgdXBkYXRlT2JqW1wiaWRcIl0gPSB0aGlzLmNPYmoucGt0X2NvZGU7XHJcbiAgICB1cGRhdGVPYmpbXCJpc3N1ZVwiXSA9IHsgXCJydGVcIjogXCJcIiB9O1xyXG4gICAgdXBkYXRlT2JqW1wicnRuXCJdID0geyBcInJ0ZVwiOiB0aGlzLmNPYmoubmV3X3J0ZSB9O1xyXG4gICAgdXBkYXRlT2JqW1wiZW1wXCJdID0ge307XHJcbiAgICBwa3REYXRhTGlzdC5wdXNoKHVwZGF0ZU9iaik7XHJcblxyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ107Ly8nYnVsa1VwZGF0ZUZvcm0nO1xyXG4gICAgcmVxT2JqWydhdHRyJ10gPSBcInJ0ZVwiO1xyXG4gICAgcmVxT2JqWydyZWlzc3VlJ10gPSAnWSc7XHJcbiAgICByZXFPYmpbJ2VtcElkbiddID0gbm1lSWRuO1xyXG4gICAgcmVxT2JqWydncnAnXSA9IFwiYnVsa3VwZGF0ZVwiO1xyXG4gICAgcmVxT2JqWydwcm9jZXNzTmFtZSddID0gXCJidWxrTWVtUHJpY2VVcGRhdGVcIi8vJ2J1bGtQcmVwZXJ0aWVzVXBkYXRlJztcclxuICAgIHJlcU9ialsncGt0RGF0YUxpc3QnXSA9IHBrdERhdGFMaXN0O1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICB0aGlzLnJlcWhlYWRlclsnbWV0aG9kJ10gPSAncmV0dXJuSXNzdWUnO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5yZXFoZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ3ByZU1hcmtldGluZy9pc3N1ZVJldHVybicpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuXHJcbiAgICAgICAgdGhpcy5jT2JqLnJ0ZSA9IHRoaXMuY09iai5uZXdfcnRlO1xyXG4gICAgICAgIHRoaXMuY09iai5yYXBfZGlzID0gdGhpcy5jT2JqLm5ld19yYXBfZGlzO1xyXG4gICAgICAgIHRoaXMuZ2V0U3VtbWFyeSh0aGlzLnBrdHMpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGFkZEl0ZW1zKCkge1xyXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhcnRJbmRleDsgaSA8IHRoaXMuZW5kSW5kZXg7IGkrKykge1xyXG4gICAgICB0aGlzLmxvYWRSZXN1bHRbaV0gPSB0aGlzLnBrdHNbaV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSB0aGlzLmVuZEluZGV4O1xyXG4gICAgdGhpcy5lbmRJbmRleCA9IHRoaXMuZW5kSW5kZXggKyAzMDtcclxuICAgIGlmICh0aGlzLmVuZEluZGV4ID4gdGhpcy5yZXN1bHRsZW5ndGgpIHtcclxuICAgICAgdGhpcy5lbmRJbmRleCA9IHRoaXMucmVzdWx0bGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TY3JvbGxEb3duKCkge1xyXG5cclxuICAgIGlmICh0aGlzLmVuZEluZGV4IDw9IHRoaXMucmVzdWx0bGVuZ3RoKVxyXG4gICAgICB0aGlzLmFkZEl0ZW1zKClcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid3JhcFwiKS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHRyYW5zbGF0ZSA9IFwidHJhbnNsYXRlKDAsXCIgKyB0aGlzLnNjcm9sbFRvcCArIFwicHgpXCI7XHJcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvcihcInRoZWFkXCIpLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zbGF0ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBncnAgPSBbXTtcclxuICBHcnBWYWxzID0gW107XHJcbiAgZmluYWxHcnBWYWwgPSB7fVxyXG4gIGZpbmFsU3VtbWFyeUR0bCA9IHt9O1xyXG4gIGRhdGEgPSBbXTtcclxuICBzdW1tYXJ5RHRsID0ge307XHJcblxyXG4gIGNyZWF0ZUdycChkYXRhcywgc2VsZWN0ZWQpIHtcclxuICAgIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMuZGF0YSA9IFsuLi5kYXRhc107XHJcbiAgICAvLyBsZXQgZ3JwdmFsdWVzID0gXCJwdVwiO1xyXG4gICAgLy8gbGV0IGdycHZhbHVlc0FyciA9IGdycHZhbHVlcy5zcGxpdCgnLCcpO1xyXG4gICAgLy8gbGV0IHJlc3V0QXJyID0gW107XHJcblxyXG4gICAgbGV0IGdycHZhbHVlc0FyciA9IHNlbGVjdGVkO1xyXG5cclxuICAgIHZhciBmaW5hbCA9IFtdO1xyXG4gICAgdmFyIG91dHB1dCA9IF8uZ3JvdXBCeSh0aGlzLmRhdGEsIGZ1bmN0aW9uIChlbnRyeSkge1xyXG4gICAgICB2YXIgc3RycyA9ICcnO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdycHZhbHVlc0Fyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHN0cnMgKz0gZW50cnlbZ3JwdmFsdWVzQXJyW2ldXSArICcjJztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHN0cnM7XHJcbiAgICAgIC8vIHJldHVybiBlbnRyeVtncnB2YWx1ZXNBcnJbMF1dICsgJyMnICsgZW50cnlbZ3JwdmFsdWVzQXJyWzFdXTsvLyArICcjJyArIGVudHJ5LnB1O1xyXG4gICAgfSk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhvdXRwdXQpO1xyXG5cclxuICAgIGZpbmFsLnB1c2gob3V0cHV0KTtcclxuICAgIGNvbnNvbGUubG9nKGZpbmFsKTtcclxuXHJcbiAgICB2YXIgS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsWzBdKTtcclxuICAgIGNvbnNvbGUubG9nKEtleXMpO1xyXG5cclxuICAgIHZhciBWYWxzID0gT2JqZWN0LnZhbHVlcyhmaW5hbFswXSk7XHJcbiAgICBjb25zb2xlLmxvZyhWYWxzKTtcclxuXHJcbiAgICBsZXQgZ3JwTmFtZWFyciA9IFtdO1xyXG4gICAgS2V5cy5tYXAoZWxlID0+IHtcclxuICAgICAgZ3JwTmFtZWFyci5wdXNoKGVsZS5zcGxpdCgnIycpLmZpbHRlcihlID0+IGUgIT0gdW5kZWZpbmVkKS5qb2luKCcgIC8gICcpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZ3JwID0gZ3JwTmFtZWFycjtcclxuICAgIHRoaXMuR3JwVmFscyA9IFZhbHM7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdycE5hbWVhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGdycE5tZSA9IGdycE5hbWVhcnJbaV07XHJcbiAgICAgIHRoaXMuZmluYWxHcnBWYWxbZ3JwTm1lXSA9IFZhbHNbaV07XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZpbmFsR3JwVmFsW2dycE5tZV0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldFRvdGFsKCk7XHJcbiAgICB0aGlzLmdycC5zb3J0KCk7XHJcblxyXG4gICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBvbkdycFNlbGVjdChzZWxlY3RlZCkge1xyXG4gICAgaWYgKHRoaXMudmlld2Rpc1R5cGUgPT0gJ2dyb3VwJylcclxuICAgICAgdGhpcy5ncm91cFBrdHNMaXN0KHRoaXMucGt0cywgc2VsZWN0ZWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLnN1bW1hcnlEZXRhaWxzKHNlbGVjdGVkKTtcclxuICB9XHJcbiAgaGVhZExpc3QgPSBbXTtcclxuICBncm91cFBrdHNMaXN0KHBrdHMsIHNlbGVjdGVkKSB7XHJcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHtcclxuICAgICAgbGV0IGF0dHIgPSBzZWxlY3RlZFswXTtcclxuICAgICAgLy8gdGhpcy5maW5hbEdycFZhbCA9IF8uZ3JvdXBCeShwa3RzLCBhdHRyKTtcclxuICAgICAgLy90aGlzLmdycCA9IE9iamVjdC5rZXlzKHRoaXMuZmluYWxHcnBWYWwpO1xyXG4gICAgICBmcm9tKHBrdHMpLnBpcGUoXHJcbiAgICAgICAgZ3JvdXBCeSh4ID0+IHhbYXR0cl0pLFxyXG4gICAgICAgIG1lcmdlTWFwKGdyb3VwID0+IGdyb3VwLnBpcGUodG9BcnJheSgpKSksXHJcbiAgICAgICAgbWFwKGcgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmFsdWU6IGdbMF1bYXR0cl0sXHJcbiAgICAgICAgICAgIHBrdExpc3Q6IGcsXHJcbiAgICAgICAgICAgIGNvdW50OiBfLnN1bUJ5KGcsICdxdHlfb25faGFuZGludCcpLFxyXG4gICAgICAgICAgICByYXB2bHU6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAncmFwX3ZsdScpKSxcclxuICAgICAgICAgICAgY3J0d3Q6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAnY3J0d3RpbnQnKSksXHJcbiAgICAgICAgICAgIHZsdTogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdhbW91bnRpbnQnKSksXHJcbiAgICAgICAgICAgIHNhbHZsdTogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdzYWxfYW1vdW50aW50JykpLFxyXG4gICAgICAgICAgICBhdmc6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAnYW1vdW50aW50JykgLyBfLnN1bUJ5KGcsICdjcnR3dGludCcpKSxcclxuICAgICAgICAgICAgc2FsYXZnOiB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKF8uc3VtQnkoZywgJ3NhbF9hbW91bnRpbnQnKSAvIF8uc3VtQnkoZywgJ2NydHd0aW50JykpLFxyXG4gICAgICAgICAgICBkaXM6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKChfLnN1bUJ5KGcsICdhbW91bnRpbnQnKSAqIDEwMCkgLyAoXy5zdW1CeShnLCAncmFwX3ZsdScpKSkgLSAxMDApLFxyXG4gICAgICAgICAgICBzYWxkaXM6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKChfLnN1bUJ5KGcsICdzYWxfYW1vdW50aW50JykgKiAxMDApIC8gKF8uc3VtQnkoZywgJ3JhcF92bHUnKSkpIC0gMTAwKVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICB0b0FycmF5KCkpXHJcbiAgICAgICAgLnN1YnNjcmliZShkID0+IHtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBCeXBrdExpc3QgPSBkO1xyXG4gICAgICAgICAgdGhpcy5ncm91cHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgdGhpcy5ncm91cGVuZEluZGV4ID0gdGhpcy5ncm91cEJ5cGt0TGlzdC5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwYWRkSXRlbXMoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICB0aGlzLmVuZEluZGV4ID0gMzA7XHJcbiAgICAgIHRoaXMubG9hZFJlc3VsdCA9IFtdO1xyXG4gICAgICB0aGlzLmdyb3VwQnlwa3RMaXN0ID0gW107XHJcbiAgICAgIGlmICh0aGlzLmVuZEluZGV4ID4gdGhpcy5yZXN1bHRsZW5ndGgpXHJcbiAgICAgICAgdGhpcy5lbmRJbmRleCA9IHRoaXMucmVzdWx0bGVuZ3RoXHJcbiAgICAgIHRoaXMuYWRkSXRlbXMoKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ3JvdXBhZGRJdGVtcygpIHtcclxuICAgIGxldCBwa3RjbnQgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuZ3JvdXBzdGFydEluZGV4OyBpIDwgdGhpcy5ncm91cGVuZEluZGV4OyBpKyspIHtcclxuICAgICAgZGVidWdnZXJcclxuICAgICAgdGhpcy5sb2FkZ3JvdXBCeXBrdExpc3RbaV0gPSB0aGlzLmdyb3VwQnlwa3RMaXN0W2ldO1xyXG4gICAgICBsZXQgcGt0bGlzdCA9IHRoaXMuZ3JvdXBCeXBrdExpc3RbaV1bJ3BrdExpc3QnXSB8fCBbXTtcclxuICAgICAgcGt0Y250ID0gcGt0Y250ICsgcGt0bGlzdC5sZW5ndGg7XHJcbiAgICAgIGlmIChwa3RjbnQgPiAzMCkge1xyXG4gICAgICAgIHRoaXMuZ3JvdXBzdGFydEluZGV4ID0gaSArIDE7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBncm91cG9uU2Nyb2xsRG93bigpIHtcclxuXHJcbiAgICBpZiAodGhpcy5ncm91cHN0YXJ0SW5kZXggPCB0aGlzLmdyb3VwZW5kSW5kZXgpXHJcbiAgICAgIHRoaXMuZ3JvdXBhZGRJdGVtcygpXHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIndyYXBcIikuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0cmFuc2xhdGUgPSBcInRyYW5zbGF0ZSgwLFwiICsgdGhpcy5zY3JvbGxUb3AgKyBcInB4KVwiO1xyXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoXCJ0aGVhZFwiKS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2xhdGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN1bW1hcnlEZXRhaWxzKHNlbGVjdGVkKSB7XHJcblxyXG5cclxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT0gMSkge1xyXG5cclxuICAgICAgdGhpcy5oZWFkTGlzdCA9IFtdO1xyXG4gICAgICBsZXQgc3VtbWFyeURhdGEgPSBbXTtcclxuICAgICAgbGV0IGF0dHJpYnVlID0gc2VsZWN0ZWRbMF07XHJcblxyXG4gICAgICBmcm9tKHRoaXMucGt0cykucGlwZShcclxuICAgICAgICBncm91cEJ5KHggPT4geFthdHRyaWJ1ZV0gKyBcIiNcIiArIHhbJ2RzcF9zdHQnXSksXHJcbiAgICAgICAgbWVyZ2VNYXAoZ3JvdXAgPT4gZ3JvdXAucGlwZSh0b0FycmF5KCkpKSxcclxuICAgICAgICBtYXAoZyA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBrZXk6IGdbMF1bYXR0cmlidWVdICsgXCIjXCIgKyBnWzBdWydkc3Bfc3R0J10sXHJcbiAgICAgICAgICAgIHZhbHVlOiBnWzBdW2F0dHJpYnVlXSxcclxuICAgICAgICAgICAgc29ydDogZ1swXVthdHRyaWJ1ZSArIFwiX3NydFwiXSB8fCAxMDAwMCxcclxuICAgICAgICAgICAgZHNwc3R0OiBnWzBdWydkc3Bfc3R0J10sXHJcbiAgICAgICAgICAgIGNvdW50OiBfLnN1bUJ5KGcsICdxdHlfb25faGFuZGludCcpLFxyXG4gICAgICAgICAgICByYXB2bHU6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAncmFwX3ZsdScpKSxcclxuICAgICAgICAgICAgY3J0d3Q6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAnY3J0d3RpbnQnKSksXHJcbiAgICAgICAgICAgIHZsdXJ0ZTogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdhbW91bnRpbnQnKSksXHJcbiAgICAgICAgICAgIHZsdTogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdzYWxfYW1vdW50aW50JykpLFxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICB0b0FycmF5KCkpXHJcbiAgICAgICAgLnN1YnNjcmliZShkID0+IHtcclxuICAgICAgICAgIHN1bW1hcnlEYXRhID0gZDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGxldCBzdW1tYXJ5TWFwID0ge307XHJcbiAgICAgIGxldCBzaWRlTGlzdCA9IFtdO1xyXG4gICAgICBsZXQgaGVhZExpc3QgPSBbXTtcclxuICAgICAgc3VtbWFyeURhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBzdW1tYXJ5TWFwW2VsZW1lbnQua2V5XSA9IGVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gZWxlbWVudC52YWx1ZSB8fCAnJztcclxuICAgICAgICBsZXQgZHNwc3R0ID0gZWxlbWVudC5kc3BzdHQ7XHJcbiAgICAgICAgaWYgKChzZWxlY3RlZCA9PSAnc2FsX2J5cicgfHwgc2VsZWN0ZWQgPT0gJ3NhbF9lbXAnKSAmJiBkc3BzdHQgIT0gJ3NvbGQnKVxyXG4gICAgICAgICAgdmFsdWUgPSAnJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gJycpIHtcclxuXHJcblxyXG4gICAgICAgICAgaWYgKGhlYWRMaXN0LmluZGV4T2YoZHNwc3R0KSA9PSAtMSlcclxuICAgICAgICAgICAgaGVhZExpc3QucHVzaChkc3BzdHQpO1xyXG4gICAgICAgICAgaWYgKHNpZGVMaXN0LmluZGV4T2YodmFsdWUpID09IC0xKVxyXG4gICAgICAgICAgICBzaWRlTGlzdC5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLnN1bW1hcnlMaXN0ID0gW107XHJcbiAgICAgIHNpZGVMaXN0LmZvckVhY2goc2lkZSA9PiB7XHJcbiAgICAgICAgbGV0IHN1bW1yeSA9IHt9O1xyXG4gICAgICAgIGhlYWRMaXN0LmZvckVhY2goaGVhZCA9PiB7XHJcbiAgICAgICAgICBsZXQgc3VtbXJ5RGF0YSA9IHN1bW1hcnlNYXBbc2lkZSArIFwiI1wiICsgaGVhZF0gfHwgJyc7XHJcbiAgICAgICAgICBpZiAoc3VtbXJ5RGF0YSAhPSAnJykge1xyXG4gICAgICAgICAgICBsZXQgc3R0ID0gc3VtbXJ5RGF0YVsnZHNwc3R0J107XHJcblxyXG4gICAgICAgICAgICBsZXQgdmx1ID0gcGFyc2VGbG9hdChzdW1tcnlEYXRhLnZsdXJ0ZSB8fCAwKTtcclxuICAgICAgICAgICAgbGV0IHJhcHZsdSA9IHBhcnNlRmxvYXQoc3VtbXJ5RGF0YS5yYXB2bHUgfHwgMCk7XHJcbiAgICAgICAgICAgIGxldCBjcnR3dCA9IHBhcnNlRmxvYXQoc3VtbXJ5RGF0YS5jcnR3dCB8fCAwKTtcclxuICAgICAgICAgICAgc3VtbXJ5Wyd2YWx1ZSddID0gc2lkZTtcclxuICAgICAgICAgICAgc3VtbXJ5Wyd2YWx1ZVNvcnQnXSA9IHN1bW1yeURhdGEuc29ydDtcclxuICAgICAgICAgICAgc3VtbXJ5Wydjb3VudF8nICsgc3R0XSA9IHN1bW1yeURhdGEuY291bnQ7XHJcbiAgICAgICAgICAgIHN1bW1yeVsnY3J0d3RfJyArIHN0dF0gPSBzdW1tcnlEYXRhLmNydHd0O1xyXG4gICAgICAgICAgICBzdW1tcnlbJ3ZsdV8nICsgc3R0XSA9IHN1bW1yeURhdGEudmx1cnRlO1xyXG4gICAgICAgICAgICBzdW1tcnlbJ2F2Z18nICsgc3R0XSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodmx1IC8gY3J0d3QpO1xyXG4gICAgICAgICAgICBzdW1tcnlbJ2Rpc18nICsgc3R0XSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKCh2bHUgKiAxMDApIC8gcmFwdmx1KSAtIDEwMCk7XHJcbiAgICAgICAgICAgIGlmIChzdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgICAgICAgICAgdmx1ID0gcGFyc2VGbG9hdChzdW1tcnlEYXRhLnZsdSB8fCAwKTtcclxuICAgICAgICAgICAgICBzdW1tcnlbJ3ZsdV8nICsgc3R0XSA9IHZsdTtcclxuICAgICAgICAgICAgICBzdW1tcnlbJ2F2Z18nICsgc3R0XSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodmx1IC8gY3J0d3QpO1xyXG4gICAgICAgICAgICAgIHN1bW1yeVsnZGlzXycgKyBzdHRdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHZsdSAqIDEwMCkgLyByYXB2bHUpIC0gMTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdW1tYXJ5TGlzdC5wdXNoKHN1bW1yeSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdGVkID09ICdzYWxfYnlyJyB8fCBzZWxlY3RlZCA9PSAnc2FsX2VtcCcpIHtcclxuICAgICAgICB0aGlzLnN1bW1hcnlMaXN0LnNvcnQoKHZhbDEsIHZhbDIpID0+IHtcclxuICAgICAgICAgIHJldHVybiAodmFsMlsndmx1X3NvbGQnXSkgLSAodmFsMVsndmx1X3NvbGQnXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzLnN1bW1hcnlMaXN0XCIsIHRoaXMuc3VtbWFyeUxpc3QpO1xyXG4gICAgICAgIHRoaXMuc3VtbWFyeUxpc3Quc29ydCgodmFsMSwgdmFsMikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuICh2YWwxWyd2YWx1ZVNvcnQnXSkgLSAodmFsMlsndmFsdWVTb3J0J10pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidGhpcy5zdW1tYXJ5TGlzdFwiLCB0aGlzLnN1bW1hcnlMaXN0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5oZWFkTGlzdCA9IGhlYWRMaXN0O1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoXCJTdW1tYXJ5IG5lZWQgb25seSBvbmUgYXR0cmlidXRlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb0NTVlN1bW1hcnkoKSB7XHJcblxyXG4gICAgbGV0IG1vZGlmaWVkT2JqQXJyID0gW107XHJcblxyXG4gICAgdGhpcy5zdW1tYXJ5TGlzdC5mb3JFYWNoKChkYXRhLCBpbmRleCkgPT4ge1xyXG4gICAgICBsZXQgb2JqID0ge307XHJcbiAgICAgIG9ialtcIlNyLiBOb1wiXSA9IGluZGV4ICsgMTtcclxuICAgICAgb2JqW1wiQXR0cmlidXRlXCJdID0gZGF0YS52YWx1ZSB8fCAnJztcclxuICAgICAgdGhpcy5oZWFkTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcbiAgICAgICAgb2JqW1wiUXR5KFwiICsgaGRyICsgXCIpXCJdID0gZGF0YVtcImNvdW50X1wiICsgaGRyXSB8fCAnJztcclxuICAgICAgICBvYmpbXCJDYXJhdChcIiArIGhkciArIFwiKVwiXSA9IGRhdGFbXCJjcnR3dF9cIiArIGhkcl0gfHwgJyc7XHJcbiAgICAgICAgb2JqW1wiQXZnKFwiICsgaGRyICsgXCIpXCJdID0gZGF0YVtcImF2Z19cIiArIGhkcl0gfHwgJyc7XHJcbiAgICAgICAgb2JqW1wiRGlzKFwiICsgaGRyICsgXCIpXCJdID0gZGF0YVtcImRpc19cIiArIGhkcl0gfHwgJyc7XHJcbiAgICAgICAgb2JqW1wiVmFsdWUoXCIgKyBoZHIgKyBcIilcIl0gPSBkYXRhW1widmx1X1wiICsgaGRyXSB8fCAnJztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBtb2RpZmllZE9iakFyci5wdXNoKG9iaik7XHJcblxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNzLkNTVkNvbnZlcnRvcihtb2RpZmllZE9iakFyciwgXCJTdW1tYXJ5X2RldGFpbHNcIiwgdHJ1ZSlcclxuICB9XHJcblxyXG4gIGdldFRvdGFsKCkge1xyXG4gICAgbGV0IGluZGV4VmFsID0gMDtcclxuICAgIGxldCBxcyA9IDA7XHJcblxyXG4gICAgdGhpcy5HcnBWYWxzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGxldCB0b3RBbXQgPSAwO1xyXG4gICAgICBsZXQgdG90d2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChlbGVtZW50LnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLmNydHd0KSwgMCkpO1xyXG4gICAgICBsZXQgcmFwVmFsID0gXy5zdW1CeShlbGVtZW50LCAncmFwX3ZsdScpO1xyXG4gICAgICBlbGVtZW50LmZvckVhY2gocGt0ID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHBrdC5ncnBfc3R0ID09ICdzb2xkJykge1xyXG4gICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQocGt0WydzYWxfcnRlJ10gfHwgMCkgKiBwYXJzZUZsb2F0KHBrdFsnY3J0d3QnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQocGt0WydydGUnXSB8fCAwKSAqIHBhcnNlRmxvYXQocGt0WydjcnR3dCddKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdG90QW10ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3RBbXQpO1xyXG5cclxuICAgICAgdmFyIGtleSA9IHRoaXMuZ3JwW2luZGV4VmFsXTtcclxuICAgICAgdGhpcy5zdW1tYXJ5RHRsW2tleSArIFwiX0NUU1wiXSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90d2VpZ2h0KTtcclxuICAgICAgdGhpcy5zdW1tYXJ5RHRsW2tleSArIFwiX0FNVFwiXSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10KTtcclxuICAgICAgdGhpcy5zdW1tYXJ5RHRsW2tleSArIFwiX1JURVwiXSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10IC8gdG90d2VpZ2h0KTtcclxuICAgICAgdGhpcy5zdW1tYXJ5RHRsW2tleSArIFwiX0RJU1wiXSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKCh0b3RBbXQgKiAxMDApIC8gcmFwVmFsKSAtIDEwMCk7XHJcbiAgICAgIGluZGV4VmFsKys7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIEdycFZhbHNQaWUgPSBbXTtcclxuICBncnBQaWUgPSBbXTtcclxuICBmaW5hbEdycFZhbFBpZSA9IHt9O1xyXG4gIHN1bW1hcnlEdGxQaWUgPSB7fTtcclxuICBieXJ2YWxHcnAgPSBbXTsvL3t9O1xyXG4gIGlzQnV5ZXJ3aXNlID0gZmFsc2U7XHJcbiAgaXNHcnB3aXNlID0gZmFsc2U7XHJcbiAgdHlwZTtcclxuICBncnBXaXNlUXR5ID0gW107XHJcbiAgZGF0YVR5cGUgPSBcIlwiO1xyXG4gIGdlbmVyYXRlUGllKERhdGF0eXBlLCBDaGFydFR5cGUpIHtcclxuICAgIGlmIChDaGFydFR5cGUgPT0gJ3F0eScpIHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blF0eScpLmNsYXNzTGlzdC5yZW1vdmUoJ2J0bi1kZWZhdWx0Jyk7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5RdHknKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blZhbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuVmFsJykuY2xhc3NMaXN0LmFkZCgnYnRuLWRlZmF1bHQnKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuVmFsJykuY2xhc3NMaXN0LnJlbW92ZSgnYnRuLWRlZmF1bHQnKTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blZhbCcpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuUXR5JykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5RdHknKS5jbGFzc0xpc3QuYWRkKCdidG4tZGVmYXVsdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncnBXaXNlUXR5ID0gW107XHJcbiAgICB0aGlzLmJ5cnZhbEdycCA9IFtdO1xyXG5cclxuICAgIHRoaXMuZGF0YVR5cGUgPSBEYXRhdHlwZTtcclxuICAgIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMuZmluYWxHcnBWYWxQaWUgPSB7fTtcclxuICAgIHRoaXMuYnlydmFsR3JwID0gW107XHJcbiAgICB0aGlzLmRhdGEgPSBbLi4udGhpcy5wa3RzXTtcclxuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5maWx0ZXIoeCA9PiB4LmdycF9zdHQgPT0gJ3NvbGQnKTtcclxuICAgIGxldCBncnB2YWx1ZXM7XHJcbiAgICBsZXQgZ3JwdmFsdWVzQXJyO1xyXG4gICAgbGV0IHJlc3V0QXJyID0gW107XHJcbiAgICAvLyB0eXBlID0gJ3F0eSc7XHJcbiAgICBpZiAoRGF0YXR5cGUgPT0gJ2J1eWVyJykge1xyXG4gICAgICB0aGlzLnR5cGUgPSBcIkJ1eWVyXCI7XHJcbiAgICAgIHRoaXMuaXNCdXllcndpc2UgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlzR3Jwd2lzZSA9IGZhbHNlO1xyXG4gICAgICBncnB2YWx1ZXMgPSBcInNhbF9ieXJcIjtcclxuICAgICAgZ3JwdmFsdWVzQXJyID0gZ3JwdmFsdWVzLnNwbGl0KCcsJyk7XHJcbiAgICAgIHJlc3V0QXJyID0gW107XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnR5cGUgPSB0aGlzLmRlZmF1bHRHcnBMaXN0O1xyXG4gICAgICB0aGlzLmlzQnV5ZXJ3aXNlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNHcnB3aXNlID0gdHJ1ZTtcclxuICAgICAgZ3JwdmFsdWVzQXJyID0gdGhpcy5kZWZhdWx0R3JwTGlzdDsvL3NlbGVjdGVkO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL2xldCBncnB2YWx1ZXNBcnIgPSBzZWxlY3RlZDtcclxuXHJcbiAgICB2YXIgZmluYWwgPSBbXTtcclxuICAgIHZhciBvdXRwdXQgPSBfLmdyb3VwQnkodGhpcy5kYXRhLCBmdW5jdGlvbiAoZW50cnkpIHtcclxuICAgICAgdmFyIHN0cnMgPSAnJztcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncnB2YWx1ZXNBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzdHJzICs9IGVudHJ5W2dycHZhbHVlc0FycltpXV0gKyAnIyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzdHJzO1xyXG4gICAgICAvLyByZXR1cm4gZW50cnlbZ3JwdmFsdWVzQXJyWzBdXSArICcjJyArIGVudHJ5W2dycHZhbHVlc0FyclsxXV07Ly8gKyAnIycgKyBlbnRyeS5wdTtcclxuICAgIH0pO1xyXG4gICAgLy8gY29uc29sZS5sb2cob3V0cHV0KTtcclxuXHJcbiAgICBmaW5hbC5wdXNoKG91dHB1dCk7XHJcblxyXG4gICAgdmFyIEtleXMgPSBPYmplY3Qua2V5cyhmaW5hbFswXSk7XHJcblxyXG4gICAgdmFyIFZhbHMgPSBPYmplY3QudmFsdWVzKGZpbmFsWzBdKTtcclxuXHJcbiAgICBsZXQgZ3JwTmFtZWFyciA9IFtdO1xyXG4gICAgS2V5cy5tYXAoZWxlID0+IHtcclxuICAgICAgZ3JwTmFtZWFyci5wdXNoKGVsZS5zcGxpdCgnIycpLmZpbHRlcihlID0+IGUgIT0gdW5kZWZpbmVkKS5qb2luKCcgIC8gICcpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZ3JwUGllID0gZ3JwTmFtZWFycjtcclxuICAgIHRoaXMuR3JwVmFsc1BpZSA9IFZhbHM7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdycE5hbWVhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGdycE5tZSA9IGdycE5hbWVhcnJbaV07XHJcblxyXG4gICAgICB0aGlzLmZpbmFsR3JwVmFsUGllW2dycE5tZV0gPSBWYWxzW2ldO1xyXG5cclxuICAgICAgbGV0IHRvdEFtdCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5maW5hbEdycFZhbFBpZVtncnBObWVdLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLnNhbF9hbW91bnRpbnQpLCAwKSk7XHJcblxyXG4gICAgICBsZXQgYnlyT2JqID0ge307XHJcbiAgICAgIGJ5ck9ialsnayddID0gZ3JwTm1lO1xyXG4gICAgICBieXJPYmpbJ3YnXSA9IHBhcnNlRmxvYXQodG90QW10KTsvL3RoaXMuYnlydmFsR3JwW2dycE5tZV0ubGVuZ3RoO1xyXG4gICAgICB0aGlzLmJ5cnZhbEdycC5wdXNoKGJ5ck9iaik7XHJcbiAgICAgIGJ5ck9iaiA9IHt9O1xyXG4gICAgICAvLyB0aGlzLmJ5cnZhbEdycFtncnBObWVdID0gdG90QW10O1xyXG5cclxuICAgICAgbGV0IHF0eU9iaiA9IHt9O1xyXG4gICAgICBxdHlPYmpbJ2snXSA9IGdycE5tZTtcclxuICAgICAgcXR5T2JqWyd2J10gPSB0aGlzLmZpbmFsR3JwVmFsUGllW2dycE5tZV0ubGVuZ3RoO1xyXG4gICAgICB0aGlzLmdycFdpc2VRdHkucHVzaChxdHlPYmopO1xyXG4gICAgICBxdHlPYmogPSB7fTtcclxuXHJcbiAgICAgIC8vIHRoaXMuZ3JwV2lzZVF0eVtncnBObWVdID0gdGhpcy5maW5hbEdycFZhbFBpZVtncnBObWVdLmxlbmd0aDtcclxuXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmdycFdpc2VRdHkpO1xyXG5cclxuICAgIGlmIChDaGFydFR5cGUgPT0gJ3F0eScpIHtcclxuICAgICAgdGhpcy5kcmF3UGllKHRoaXMuZ3JwV2lzZVF0eSwgQ2hhcnRUeXBlLCBEYXRhdHlwZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5kcmF3UGllKHRoaXMuYnlydmFsR3JwLCBDaGFydFR5cGUsIERhdGF0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGlzLmdldFRvdGFsUGllKCk7XHJcbiAgICAvLyB0aGlzLmdycFBpZS5zb3J0KCk7XHJcblxyXG4gIH1cclxuXHJcbiAgZHluYW1pY0NvbG9ycyA9IFtdO1xyXG4gIGdlbmVyYXRlKCkge1xyXG4gICAgdGhpcy5keW5hbWljQ29sb3JzID0gW107XHJcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IDc7IGkrKykge1xyXG4gICAgICAvLyB0aGlzLkxpZ2h0ZW5EYXJrZW5Db2xvcihcIjdjYjVlY1wiLCBpICogMTApO1xyXG4gICAgICBsZXQgY29sID0gJ2M2ZTg5Nic7XHJcbiAgICAgIGxldCBhbXQgPSAoaSAqIDIwKSAqIC0xO1xyXG4gICAgICB2YXIgdXNlUG91bmQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChjb2xbMF0gPT0gXCIjXCIpIHtcclxuICAgICAgICBjb2wgPSBjb2wuc2xpY2UoMSk7XHJcbiAgICAgICAgdXNlUG91bmQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgbnVtID0gcGFyc2VJbnQoY29sLCAxNik7XHJcblxyXG4gICAgICB2YXIgciA9IChudW0gPj4gMTYpICsgYW10O1xyXG5cclxuICAgICAgaWYgKHIgPiAyNTUpIHIgPSAyNTU7XHJcbiAgICAgIGVsc2UgaWYgKHIgPCAwKSByID0gMDtcclxuXHJcbiAgICAgIHZhciBiID0gKChudW0gPj4gOCkgJiAweDAwRkYpICsgYW10O1xyXG5cclxuICAgICAgaWYgKGIgPiAyNTUpIGIgPSAyNTU7XHJcbiAgICAgIGVsc2UgaWYgKGIgPCAwKSBiID0gMDtcclxuXHJcbiAgICAgIHZhciBnID0gKG51bSAmIDB4MDAwMEZGKSArIGFtdDtcclxuXHJcbiAgICAgIGlmIChnID4gMjU1KSBnID0gMjU1O1xyXG4gICAgICBlbHNlIGlmIChnIDwgMCkgZyA9IDA7XHJcblxyXG4gICAgICAvLyByZXR1cm4gKHVzZVBvdW5kID8gXCIjXCIgOiBcIlwiKSArIChnIHwgKGIgPDwgOCkgfCAociA8PCAxNikpLnRvU3RyaW5nKDE2KTtcclxuICAgICAgdGhpcy5keW5hbWljQ29sb3JzLnB1c2goKHVzZVBvdW5kID8gXCIjXCIgOiBcIiNcIikgKyAoZyB8IChiIDw8IDgpIHwgKHIgPDwgMTYpKS50b1N0cmluZygxNikpO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codGhpcy5keW5hbWljQ29sb3JzKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5keW5hbWljQ29sb3JzO1xyXG4gIH1cclxuICBieXJWYWxBcnIgPSBbXTtcclxuICBnZXRUb3RhbFBpZSgpIHtcclxuICAgIGxldCBpbmRleFZhbCA9IDA7XHJcbiAgICBsZXQgQW10QXJyID0gW107XHJcbiAgICB0aGlzLkdycFZhbHNQaWUuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgbGV0IGJ5cndpc2VWYWwgPSB7fTtcclxuICAgICAgbGV0IHRvdEFtdCA9IDA7XHJcbiAgICAgIGxldCB0b3R3ZWlnaHQgPSAwO1xyXG4gICAgICB0b3R3ZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKGVsZW1lbnQucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcbiAgICAgIHRvdEFtdCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoZWxlbWVudC5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5zYWxfYW1vdW50aW50KSwgMCkpO1xyXG4gICAgICBBbXRBcnIucHVzaCh0b3RBbXQpO1xyXG4gICAgICB2YXIga2V5ID0gdGhpcy5ncnBbaW5kZXhWYWxdO1xyXG4gICAgICAvLyB0aGlzLnN1bW1hcnlEdGxba2V5ICsgXCJfUVRZXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChxdHkpO1xyXG4gICAgICB0aGlzLnN1bW1hcnlEdGxQaWVba2V5ICsgXCJfQ1RTXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3R3ZWlnaHQpO1xyXG4gICAgICB0aGlzLnN1bW1hcnlEdGxQaWVba2V5ICsgXCJfQU1UXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3RBbXQpO1xyXG5cclxuICAgICAgaW5kZXhWYWwrKztcclxuXHJcbiAgICAgIGlmIChpbmRleFZhbCA9PSAxKSB7XHJcbiAgICAgICAgYnlyd2lzZVZhbFt0aGlzLmdycFtpbmRleFZhbF1dID0gdG90QW10O1xyXG4gICAgICAgIHRoaXMuYnlyVmFsQXJyLnB1c2goYnlyd2lzZVZhbCk7XHJcbiAgICAgICAgYnlyd2lzZVZhbCA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHFzKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coYW1vdW50KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmJ5clZhbEFycik7XHJcblxyXG4gICAgQW10QXJyID0gQW10QXJyLm1hcChmdW5jdGlvbiAoeCkge1xyXG4gICAgICByZXR1cm4gcGFyc2VGbG9hdCh4KTtcclxuICAgIH0pO1xyXG5cclxuICAgIEFtdEFyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSk7XHJcbiAgICBjb25zb2xlLmxvZyhBbXRBcnIpO1xyXG4gICAgQW10QXJyLnJldmVyc2UoKTtcclxuXHJcbiAgICAvLyB0aGlzLmRyYXdQaWUoQW10QXJyKTtcclxuXHJcbiAgfVxyXG4gIHB1YmxpYyBwaWVDaGFydFBsdWdpbnMgPSBbcGx1Z2luRGF0YUxhYmVsc107XHJcbiAgZG91Z2hudXRDaGFydFR5cGUgPSAncGllJztcclxuICBkb3VnaG51dENoYXJ0TGFiZWxzID0gW107XHJcbiAgZG91Z2hudXRDaGFydERhdGEgPSBbXTtcclxuICBwaWVDaGFydENvbG9ycyA9IFtdO1xyXG4gIHBpZUNoYXJ0TGVnZW5kID0gdHJ1ZTtcclxuXHJcblxyXG4gIHB1YmxpYyBjaGFydENvbG9yczogYW55W10gPSBbXHJcbiAgICB7XHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5nZW5lcmF0ZSgpLFxyXG4gICAgICBmaWxsQ29sb3I6IHRoaXMuZ2VuZXJhdGUoKSxcclxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuZ2VuZXJhdGUoKVxyXG4gICAgICAvL1tcIiMwMDAwODBcIiwgXCIjMDAyMEMyXCIsIFwiIzE1NjlDN1wiLCBcIiMzNTdFQzdcIiwgXCIjMzY4QkMxXCIsXCI2NTlFQzdcIl0gXHJcbiAgICB9XTtcclxuICBsYWJlbHMgPSB7XHJcbiAgICBsYWJlbHM6IHtcclxuICAgICAgcmVuZGVyOiAncGVyY2VudGFnZScsXHJcbiAgICAgIC8vIMKgwqDCoMKgZm9udENvbG9yOiBbJ2dyZWVuJywgJ3doaXRlJywgJ3JlZCddLFxyXG4gICAgICBwcmVjaXNpb246IDJcclxuICAgIH1cclxuICB9XHJcbiAgY2hhcnRPcHRpb25zID0ge1xyXG4gICAgcGx1Z2luczoge1xyXG4gICAgICBsYWJlbHM6IHtcclxuICAgICAgICByZW5kZXI6ICdwZXJjZW50YWdlJyxcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGxlZ2VuZDoge1xyXG4gICAgICBwb3NpdGlvbjogJ3JpZ2h0JyxcclxuICAgICAgbGFiZWxzOiB7XHJcbiAgICAgICAgZm9udENvbG9yOiAnYmxhY2snLFxyXG4gICAgICAgIGJveFdpZHRoOiAxMCxcclxuICAgICAgICBwYWRkaW5nOiAxMCxcclxuICAgICAgICBmb250U2l6ZTogMTAsXHJcbiAgICAgICAgcmVuZGVyOiAncGVyY2VudGFnZScsXHJcblxyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuXHJcblxyXG4gIH1cclxuICBwaWVDaGFydE9wdGlvbnMgPSB7XHJcbiAgICAvL2xlZ2VuZDoge3Bvc2l0aW9uOiAnbGVmdCcsZm9udENvbG9yOid3aGl0ZSd9LFxyXG4gICAgLy9wbHVnaW5zOiB7bGFiZWxzOiB7IHJlbmRlcjogJ3BlcmNlbnRhZ2UnLHBvc2l0aW9uOiAnYm9yZGVyJywgdGV4dE1hcmdpbjogNH19XHJcblxyXG4gICAgbGVnZW5kOiB7XHJcbiAgICAgIHBvc2l0aW9uOiAncmlnaHQnLFxyXG4gICAgICBsYWJlbHM6IHtcclxuICAgICAgICBmb250Q29sb3I6ICdibGFjaycsXHJcbiAgICAgICAgYm94V2lkdGg6IDEwLFxyXG4gICAgICAgIHBhZGRpbmc6IDEwLFxyXG4gICAgICAgIGZvbnRTaXplOiAxMCxcclxuICAgICAgICByZW5kZXI6ICdwZXJjZW50YWdlJ1xyXG4gICAgICB9XHJcblxyXG4gICAgfSxcclxuICAgIHBsdWdpbnM6IHtcclxuICAgICAgZGF0YWxhYmVsczoge1xyXG4gICAgICAgIGZvcm1hdHRlcjogKHZhbHVlLCBjdHgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGxhYmVsID0gY3R4LmNoYXJ0LmRhdGEubGFiZWxzW2N0eC5kYXRhSW5kZXhdO1xyXG4gICAgICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9XHJcbiAgfTtcclxuICBwaWUgPSB7XHJcbiAgICBsZWdlbmQ6IHsgcG9zaXRpb246ICdsZWZ0JywgZm9udENvbG9yOiAnd2hpdGUnIH0sXHJcbiAgICBwbHVnaW5zOiB7XHJcbiAgICAgIGxhYmVsczoge1xyXG4gICAgICAgIC8vIHJlbmRlciAnbGFiZWwnLCAndmFsdWUnLCAncGVyY2VudGFnZScsICdpbWFnZScgb3IgY3VzdG9tIGZ1bmN0aW9uLCBkZWZhdWx0IGlzICdwZXJjZW50YWdlJ1xyXG4gICAgICAgIHJlbmRlcjogJ3BlcmNlbnRhZ2UnLFxyXG4gICAgICAgIHByZWNpc2lvbjogMCxcclxuICAgICAgICBhcmM6IHRydWUsXHJcbiAgICAgICAgc2hvd0FjdHVhbFBlcmNlbnRhZ2VzOiB0cnVlLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnb3V0c2lkZSdcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHRvb2x0aXBzOiB7XHJcbiAgICAgIG1vZGU6ICdsYWJlbCcsXHJcbiAgICAgIGNhbGxiYWNrczoge1xyXG4gICAgICAgIGxhYmVsOiBmdW5jdGlvbiAodG9vbHRpcEl0ZW0sIGRhdGEpIHtcclxuICAgICAgICAgIC8vICBsZXQgbGFiZWwgPSBkYXRhLmRhdGFzZXRzW3Rvb2x0aXBJdGVtLmRhdGFzZXRJbmRleF0ubGFiZWw7XHJcbiAgICAgICAgICAvLyAgbGV0IHZhbHVlID0gZGF0YS5kYXRhc2V0c1t0b29sdGlwSXRlbS5kYXRhc2V0SW5kZXhdLmRhdGFbdG9vbHRpcEl0ZW0uaW5kZXhdO1xyXG4gICAgICAgICAgcmV0dXJuIFtkYXRhLmxhYmVsc1t0b29sdGlwSXRlbS5pbmRleF1cclxuICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGRyYXdQaWUoc2FsZXNEYXRhLCB0eXBlLCBDaGFydFR5cGUpIHtcclxuICAgIHRoaXMuZG91Z2hudXRDaGFydERhdGEgPSBbXTtcclxuICAgIHRoaXMuZG91Z2hudXRDaGFydExhYmVscyA9IFtdO1xyXG5cclxuICAgIGxldCBBbXRBcnIgPSBzYWxlc0RhdGEuc29ydCgoYSwgYikgPT4gKGEudiA+IGIudikgPyAxIDogLTEpLnJldmVyc2UoKTtcclxuXHJcblxyXG4gICAgaWYgKENoYXJ0VHlwZSA9PSBcImJ1eWVyXCIpIHtcclxuICAgICAgdGhpcy5kb3VnaG51dENoYXJ0RGF0YSA9IEFtdEFyci5zbGljZSgwLCA1KS5tYXAoYSA9PiBhLnYpO1xyXG4gICAgICB0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHMgPSBBbXRBcnIuc2xpY2UoMCwgNSkubWFwKGEgPT4gYS5rKTtcclxuICAgICAgbGV0IHN1bXMgPSAwO1xyXG4gICAgICBsZXQgb3RoZXJTdW0gPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuc3R0V2lzZVN1bW1hcnkuZ2V0KCdzb2xkJykuZ2V0KCdyYXRlJykpO1xyXG4gICAgICBpZiAodHlwZSA9PSAncXR5JylcclxuICAgICAgICBvdGhlclN1bSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5zdHRXaXNlU3VtbWFyeS5nZXQoJ3NvbGQnKS5nZXQoJ2NvdW50JykpO1xyXG5cclxuICAgICAgbGV0IHRBcnIgPSBbXTtcclxuICAgICAgdEFyciA9IEFtdEFyci5zbGljZSgwLCA1KS5tYXAoZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh4LnYpO1xyXG4gICAgICB9KTtcclxuICAgICAgc3VtcyA9IF8uc3VtQnkodEFycik7XHJcbiAgICAgIGxldCBtYXhpbkFyciA9IE1hdGgubWF4KE1hdGgubWF4KC4uLnRoaXMuZG91Z2hudXRDaGFydERhdGEpKTtcclxuICAgICAgZGVidWdnZXJcclxuICAgICAgbGV0IG90aGVydmFsID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChvdGhlclN1bSAtIHN1bXMpIHx8IDA7XHJcbiAgICAgIGlmIChtYXhpbkFyciA+IG90aGVydmFsKSB7XHJcbiAgICAgICAgdGhpcy5kb3VnaG51dENoYXJ0RGF0YS5wdXNoKG90aGVydmFsKTtcclxuICAgICAgICB0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHMucHVzaCgnT3RoZXInKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmRvdWdobnV0Q2hhcnREYXRhLnVuc2hpZnQob3RoZXJ2YWwpO1xyXG4gICAgICAgIHRoaXMuZG91Z2hudXRDaGFydExhYmVscy51bnNoaWZ0KCdPdGhlcicpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZG91Z2hudXRDaGFydERhdGEgPSBBbXRBcnIubWFwKGEgPT4gYS52KTtcclxuICAgICAgdGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzID0gQW10QXJyLm1hcChhID0+IGEuayk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwidGhpcy5kb3VnaG51dENoYXJ0RGF0YVwiLCB0aGlzLmRvdWdobnV0Q2hhcnREYXRhKTtcclxuICAgICAgbGV0IHN1bXMgPSAwO1xyXG4gICAgICBsZXQgb3RoZXJTdW0gPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuc3R0V2lzZVN1bW1hcnkuZ2V0KCdzb2xkJykuZ2V0KCdyYXRlJykpO1xyXG4gICAgICBzdW1zID0gXy5zdW1CeShPYmplY3QudmFsdWVzKEFtdEFyciksICd2Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5kb3VnaG51dENoYXJ0RGF0YS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSk7XHJcbiAgICAvLyB0aGlzLmRvdWdobnV0Q2hhcnREYXRhID0gdGhpcy5kb3VnaG51dENoYXJ0RGF0YS5yZXZlcnNlKCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzW2ldID0gdGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzW2ldICsgXCIgXCIgKyB0aGlzLmRvdWdobnV0Q2hhcnREYXRhW2ldLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzKTtcclxuICAgIHRoaXMucmVmcmVzaENoYXJ0KENoYXJ0VHlwZSk7XHJcbiAgICB0aGlzLmRvdWdobnV0Q2hhcnRUeXBlID0gJ3BpZSc7XHJcbiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUGllY2hhcnRNb2RlbEJ0bicpLmNsaWNrKCk7XHJcbiAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaENoYXJ0KENoYXJ0VHlwZSkge1xyXG4gICAgdGhpcy5pc0J1eWVyd2lzZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0dycHdpc2UgPSBmYWxzZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoQ2hhcnRUeXBlID09IFwiYnV5ZXJcIikge1xyXG4gICAgICAgIHRoaXMuaXNCdXllcndpc2UgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaXNHcnB3aXNlID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgIH0sIDEpO1xyXG4gIH1cclxuXHJcbiAgc29ydEJ5KGtleSwgZykge1xyXG4gICAgdGhpcy5zb3J0ZWQgPSB0aGlzLnNvcnRlZCA9PSAnZGVzYycgPyAnYXNjJyA6ICdkZXNjJztcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuc29ydGVkKTtcclxuICAgIGxldCBzcnRlZCA9IF8ub3JkZXJCeSh0aGlzLmZpbmFsR3JwVmFsW2ddLCBrZXksIFt0aGlzLnNvcnRlZF0pO1xyXG4gICAgdGhpcy5maW5hbEdycFZhbFtnXSA9IHNydGVkO1xyXG4gICAgdGhpcy5zb3J0T24gPSBnO1xyXG4gICAgdGhpcy5jbG1uID0ga2V5O1xyXG4gIH1cclxuICBleHBvcnRUb0NTVihGaWxlTmFtZSkge1xyXG4gICAgbGV0IGQgPSB0aGlzLmNzLmNEYXRlLFxyXG4gICAgICBtb250aCA9ICcnICsgKGQuZ2V0TW9udGgoKSArIDEpLFxyXG4gICAgICBkYXkgPSAnJyArIGQuZ2V0RGF0ZSgpLFxyXG4gICAgICB5ZWFyID0gZC5nZXRGdWxsWWVhcigpO1xyXG4gICAgbGV0IGR0ID0gW2RheSwgbW9udGgsIHllYXJdLmpvaW4oJy0nKTtcclxuICAgIGxldCBmaWxlTm1lID0gRmlsZU5hbWUgKyAnX18nICsgZHQ7XHJcbiAgICB0aGlzLmhlYWRlcktleSA9IFtcImRzcF9zdHRcIiwgLi4udGhpcy5oZWFkZXJLZXldO1xyXG4gICAgbGV0IG1vZGlmaWVkT2JqQXJyID0gdGhpcy5jcy5tb2RpZnlEYXRhQnlIZWFkZXIodGhpcy5wa3RzLCB0aGlzLmhlYWRlcktleSwgdGhpcy5oZWFkZXIpO1xyXG4gICAgdGhpcy5jcy5DU1ZDb252ZXJ0b3IobW9kaWZpZWRPYmpBcnIsIGZpbGVObWUsIHRydWUpO1xyXG4gIH1cclxuICBnZXRTdW1tYXJ5KHApIHtcclxuICAgIGxldCBzdW1tYXJ5O1xyXG4gICAgcC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAvLyBsZXQgc3R0ID0gJyc7XHJcbiAgICAgIC8vIGlmIChlbGVtZW50LmdycF9zdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgIC8vICAgc3R0ID0gJ1NvbGQnO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGVsc2UgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnbWt0Jykge1xyXG4gICAgICAvLyAgIHN0dCA9ICdNYXJrZXRpbmcnO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGVsc2UgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnbGFiJykge1xyXG4gICAgICAvLyAgIHN0dCA9ICdMYWInO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICAvLyBlbHNlIHtcclxuICAgICAgLy8gICBzdHQgPSBlbGVtZW50LmdycF9zdHQ7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIC8vIHN1bW1hcnkgPSB0aGlzLnN0dFdpc2VTdW1tYXJ5LmdldChlbGVtZW50LmdycF9zdHQpO1xyXG4gICAgICBzdW1tYXJ5ID0gdGhpcy5zdHRXaXNlU3VtbWFyeS5nZXQoZWxlbWVudC5ncnBfc3R0KTsvL3N0dFxyXG5cclxuICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgbGV0IGdyaWRXdCA9IDA7XHJcbiAgICAgIGxldCBncmlkYXZnID0gMDtcclxuICAgICAgbGV0IGRpc2MgPSAwO1xyXG4gICAgICBsZXQgZ3JpZFJhdGUgPSAwO1xyXG4gICAgICBsZXQgdG90QW10ID0gMDtcclxuICAgICAgbGV0IGdyaWRSYXAgPSAwO1xyXG5cclxuICAgICAgLy8gdGhpcy50b3RBdmcgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHBhcnNlRmxvYXQodG90QW10KSAvIHBhcnNlRmxvYXQodG90d2VpZ2h0KSk7XHJcbiAgICAgIC8vIHRoaXMudG90RGlzID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHBhcnNlRmxvYXQodG90QW10KSAqIDEwMCkgLyBwYXJzZUZsb2F0KHRvdHJhcFZhbCkpIC0gMTAwKTtcclxuXHJcblxyXG4gICAgICBsZXQgd3QgPSBwYXJzZUZsb2F0KGVsZW1lbnQuY3J0d3QpO1xyXG4gICAgICBsZXQgcmF0ZSA9IDA7XHJcbiAgICAgIGxldCByYXB2YWwgPSBwYXJzZUZsb2F0KGVsZW1lbnQucmFwX3ZsdSk7XHJcbiAgICAgIGlmIChlbGVtZW50LmdycF9zdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgICAgcmF0ZSA9IHBhcnNlRmxvYXQoKGVsZW1lbnQuc2FsX3J0ZSA9PSB1bmRlZmluZWQgfHwgZWxlbWVudC5zYWxfcnRlID09IFwiXCIpID8gZWxlbWVudC5ydGUgOiBlbGVtZW50LnNhbF9ydGUpICogcGFyc2VGbG9hdChlbGVtZW50LmNydHd0KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByYXRlID0gcGFyc2VGbG9hdChlbGVtZW50LnJ0ZSkgKiBwYXJzZUZsb2F0KGVsZW1lbnQuY3J0d3QpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3VtbWFyeSAhPSBudWxsKSB7XHJcbiAgICAgICAgY291bnQgPSBwYXJzZUludChzdW1tYXJ5LmdldCgnY291bnQnKSk7XHJcbiAgICAgICAgZ3JpZFd0ID0gcGFyc2VGbG9hdChzdW1tYXJ5LmdldCgnd3QnKSk7XHJcbiAgICAgICAgZ3JpZFJhdGUgPSBwYXJzZUZsb2F0KHN1bW1hcnkuZ2V0KCdyYXRlJykpO1xyXG4gICAgICAgIGdyaWRSYXAgPSBwYXJzZUZsb2F0KHN1bW1hcnkuZ2V0KCdyYXAnKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3VtbWFyeSA9IG5ldyBNYXAoKTtcclxuICAgICAgfVxyXG4gICAgICBzdW1tYXJ5LnNldCgnY291bnQnLCBjb3VudCArIDEpO1xyXG4gICAgICBzdW1tYXJ5LnNldCgnd3QnLCBncmlkV3QgKyB3dCk7XHJcbiAgICAgIHN1bW1hcnkuc2V0KCdyYXRlJywgZ3JpZFJhdGUgKyByYXRlKTtcclxuICAgICAgc3VtbWFyeS5zZXQoJ3JhcCcsIGdyaWRSYXAgKyByYXB2YWwpO1xyXG5cclxuICAgICAgLy8gdGhpcy5zdHRXaXNlU3VtbWFyeS5zZXQoZWxlbWVudC5ncnBfc3R0ID09ICdzb2xkJyA/ICdTb2xkJyA6IGVsZW1lbnQuZ3JwX3N0dCwgc3VtbWFyeSk7XHJcbiAgICAgIHRoaXMuc3R0V2lzZVN1bW1hcnkuc2V0KGVsZW1lbnQuZ3JwX3N0dCwgc3VtbWFyeSk7Ly9zdHRcclxuXHJcbiAgICB9KTtcclxuICAgIGNvbnNvbGUubG9nKCdAcHJlc3VtOicsIHRoaXMuc3R0V2lzZVN1bW1hcnkpO1xyXG5cclxuICAgIHRoaXMuYW5hQWxsR3JwU3R0LmZvckVhY2goZWxlID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZWxlKTtcclxuICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgbGV0IGdyaWRXdCA9IDA7XHJcbiAgICAgIGxldCBncmlkYXZnID0gMDtcclxuICAgICAgbGV0IGRpc2MgPSAwO1xyXG4gICAgICBsZXQgZ3JpZFJhdGUgPSAwO1xyXG4gICAgICBsZXQgdG90QW10ID0gMDtcclxuICAgICAgbGV0IHJhcCA9IDA7XHJcbiAgICAgIGxldCBncmlkUmFwID0gMDtcclxuXHJcblxyXG4gICAgICAvL2lmIChlbGUgPT0gJ01hcmtldGluZycgfHwgZWxlID09ICdTb2xkJykge1xyXG4gICAgICAvLyBlbGUgPSAoZWxlID09ICdNYXJrZXRpbmcnIHx8IGVsZSA9PSAnU29sZCcpID8gZWxlIDogZWxlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGxldCBzdW1tYXJ5ID0gdGhpcy5zdHRXaXNlU3VtbWFyeS5nZXQoZWxlKSB8fCBuZXcgTWFwKCk7XHJcblxyXG4gICAgICBjb3VudCA9IHBhcnNlSW50KHN1bW1hcnkuZ2V0KCdjb3VudCcpKSB8fCAwO1xyXG4gICAgICBncmlkV3QgPSBwYXJzZUZsb2F0KHN1bW1hcnkuZ2V0KCd3dCcpKSB8fCAwLjAwO1xyXG4gICAgICBncmlkUmF0ZSA9IHBhcnNlRmxvYXQoc3VtbWFyeS5nZXQoJ3JhdGUnKSkgfHwgMDtcclxuICAgICAgZ3JpZFJhcCA9IHBhcnNlRmxvYXQoc3VtbWFyeS5nZXQoJ3JhcCcpKSB8fCAxO1xyXG5cclxuICAgICAgZGlzYyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKChncmlkUmF0ZSAqIDEwMCkgLyBncmlkUmFwKSAtIDEwMCk7XHJcblxyXG4gICAgICBncmlkYXZnID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChncmlkUmF0ZSAvIGdyaWRXdCk7XHJcblxyXG4gICAgICBzdW1tYXJ5LnNldCgnZGlzYycsIGRpc2MpO1xyXG4gICAgICBzdW1tYXJ5LnNldCgnYXZnJywgZ3JpZGF2Zyk7XHJcblxyXG4gICAgICB0aGlzLnN0dFdpc2VTdW1tYXJ5LnNldChlbGUsIHN1bW1hcnkpO1xyXG4gICAgICAvL31cclxuXHJcbiAgICB9KVxyXG4gICAgY29uc29sZS5sb2codGhpcy5zdHRXaXNlU3VtbWFyeSk7XHJcblxyXG4gIH1cclxuXHJcbiAgVG90QXZnT2JqID0ge307XHJcbiAgZ2V0VG90YWxzKGZpZWxkcywgcGt0cykge1xyXG4gICAgZGVidWdnZXJcclxuICAgIGZpZWxkcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBkZWJ1Z2dlclxyXG4gICAgICBsZXQgdGF2ZyA9IDA7XHJcbiAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgIGlmIChlbGVtZW50LnRyaW0oKSA9PSAnYWdlJykge1xyXG4gICAgICAgIHRvdGFsID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChwa3RzLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5hZ2UsIDApKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0b3RhbCA9IF8uc3VtQnkocGt0cywgaXRlbSA9PiBOdW1iZXIoaXRlbVtlbGVtZW50LnRyaW0oKV0pKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHplcm9WYWxzID0gcGt0cy5maWx0ZXIoeCA9PiAoeFtlbGVtZW50LnRyaW0oKV0gPT09IFwiMFwiIHx8IDApKS5sZW5ndGg7XHJcbiAgICAgIGlmIChlbGVtZW50LnRyaW0oKSAhPSAnYWdlJykge1xyXG4gICAgICAgIHRhdmcgPSB0b3RhbCAvIF8uc3VtQnkocGt0cywgaXRlbSA9PiBOdW1iZXIoaXRlbVsnY3J0d3QnXSkpO1xyXG4gICAgICAgIHRhdmcgPSB0aGlzLmNzLm51bWJlcnRvZml4ZWQodGF2ZywgMilcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0YXZnID0gdG90YWwgLyBwa3RzLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLlRvdEF2Z09ialtlbGVtZW50LnRyaW0oKV0gPSB0YXZnO1xyXG4gICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLlRvdEF2Z09iaik7XHJcbiAgfVxyXG5cclxuICBnZXRUb3RhbHNUdGwoZmllbGRzLCBwa3RzKSB7XHJcbiAgICBkZWJ1Z2dlclxyXG4gICAgZmllbGRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGRlYnVnZ2VyXHJcbiAgICAgIGxldCB0b3RhbCA9IDA7XHJcblxyXG4gICAgICB0b3RhbCA9IF8uc3VtQnkocGt0cywgaXRlbSA9PiBOdW1iZXIoaXRlbVtlbGVtZW50LnRyaW0oKV0pKTtcclxuXHJcbiAgICAgIHRoaXMuVG90QXZnT2JqW2VsZW1lbnQudHJpbSgpXSA9IHRoaXMuY3MubnVtYmVydG9maXhlZCh0b3RhbCwgMik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgbW9kaWZ5U2VhcmNoKCkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0JJY2FsbCcsICdCSW1vZGlmeScpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMubW9kdWxlbmFtZSArICcvYW5hbHlzaXMtc2VhcmNoLycgKyB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ11dKTtcclxuICB9XHJcbiAgYW5hU3R0TGJsID0gW107XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyB0aGlzLkxpZ2h0ZW5EYXJrZW5Db2xvcihcIjdjYjVlY1wiLCAxMCk7XHJcbiAgICBsZXQgbWRsayA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21kbEtleScpKTtcclxuICAgIHRoaXMuY09iaiA9IHt9O1xyXG4gICAgdGhpcy5jVXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG5cclxuICAgIHRoaXMucmVxaGVhZGVyID0ge1xyXG4gICAgICAnY2xpZW50a2V5JzogQ29va2llLmdldCgnX2NrJyksXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdtb2R1bGVrZXknOiBtZGxrW3RoaXMuY1VybC5zcGxpdCgnLycpWzFdXSxcclxuICAgICAgJ2xvZ2luaWQnOiBDb29raWUuZ2V0KCdfbG9naWQnKSxcclxuICAgICAgJ3NvdXJjZSc6ICdxcydcclxuICAgIH07XHJcbiAgICB0aGlzLnZpZXdkaXNUeXBlID0gXCJncm91cFwiO1xyXG4gICAgdGhpcy5uZXd3aW5kb3cgPSBcIllFU1wiO1xyXG4gICAgdGhpcy5ncnAgPSBbXTtcclxuICAgIHRoaXMubG9hZFJlc3VsdCA9IFtdO1xyXG4gICAgdGhpcy5zdGFydEluZGV4ID0gMDtcclxuICAgIHRoaXMuZW5kSW5kZXggPSAzMDtcclxuICAgIHRoaXMuY1VybCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgIHRoaXMubW9kdWxlbmFtZSA9IHRoaXMuY1VybC5zcGxpdCgnLycpWzFdO1xyXG4gICAgdGhpcy5jayA9IGVuY29kZVVSSUNvbXBvbmVudChDb29raWUuZ2V0KCdfY2snKSk7XHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUobWFwID0+IHtcclxuICAgICAgdGhpcy5sb2FkRGVmaW5hdGlvbigpO1xyXG4gICAgICBsZXQgdmlld1R5cGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndmlld1R5cGUnKTtcclxuICAgICAgbGV0IGFuYUFyciA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJYW5hU3R0JykpO1xyXG4gICAgICBsZXQgYW5hc3R0TGJsID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklhbmFTdHRMQkwnKSk7XHJcbiAgICAgIGlmIChhbmFBcnIgIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuYW5hQWxsR3JwU3R0ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklhbmFTdHQnKSk7XHJcbiAgICAgICAgdGhpcy5hbmFTdHRMYmwgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSWFuYVN0dExCTCcpKTtcclxuICAgICAgICB0aGlzLmFuYUFsbEdycFN0dC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdE9ialtlbGVtZW50XSA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZpZXdUeXBlID09ICdsaXN0VmlldycpIHtcclxuICAgICAgICB0aGlzLmdldFNlYXJjaFJlc3VsdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBwa3RzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGt0RGF0YScpKTtcclxuICAgICAgICB0aGlzLmhlYWRlcktleSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Jlc3VsdFZpZXcnKSk7XHJcbiAgICAgICAgdGhpcy5oZWFkZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZXN1bHRWaWV3RHRsJykpO1xyXG4gICAgICAgIHRoaXMuaGVhZGVyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVzdWx0Vmlld0R0bCcpKTtcclxuICAgICAgICBsZXQgbGVnZW5kcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJTGVnZW5kcycpKTtcclxuICAgICAgICBpZiAobGVnZW5kcyAhPSBudWxsICYmIGxlZ2VuZHMgIT0gdW5kZWZpbmVkICYmIGxlZ2VuZHMgIT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5sZWdlbmRMaXN0ID0gbGVnZW5kcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wa3RzID0gWy4uLnBrdHNdO1xyXG5cclxuICAgICAgICB0aGlzLnRvdGFsV2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnBrdHMucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0U3VtbWFyeSh0aGlzLnBrdHMpO1xyXG5cclxuICAgICAgICAvLyAgbGV0IHRvdEFtdCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5wa3RzLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5zYWxfcmVjX3J0ZSAqIHBhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuICAgICAgICBsZXQgdG90d2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnBrdHMucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcbiAgICAgICAgbGV0IHRvdHJhcFZhbCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5wa3RzLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5yYXBfdmx1LCAwKSk7XHJcblxyXG4gICAgICAgIGxldCB0b3RBbXQgPSAwO1xyXG4gICAgICAgIHRoaXMucGt0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnc29sZCcpIHtcclxuICAgICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQoZWxlbWVudFsnc2FsX3J0ZSddKSAqIHBhcnNlRmxvYXQoZWxlbWVudFsnY3J0d3QnXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQoZWxlbWVudFsncnRlJ10pICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAgICAgICB0aGlzLnRvdEF2ZyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10IC8gcGFyc2VGbG9hdCh0b3R3ZWlnaHQpKTtcclxuICAgICAgICB0aGlzLnRvdERpcyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKCh0b3RBbXQgKiAxMDApIC8gcGFyc2VGbG9hdCh0b3RyYXBWYWwpKSAtIDEwMCk7XHJcblxyXG5cclxuICAgICAgICB0aGlzLnJlc3VsdGxlbmd0aCA9IHRoaXMucGt0cy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5kSW5kZXggPiB0aGlzLnJlc3VsdGxlbmd0aClcclxuICAgICAgICAgIHRoaXMuZW5kSW5kZXggPSB0aGlzLnJlc3VsdGxlbmd0aFxyXG4gICAgICAgIHRoaXMuYWRkSXRlbXMoKTtcclxuXHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgICBsZXQgR1JQYnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSS1QS1RfR1JPVVBfQlknKSkgfHwgJyc7XHJcbiAgICB0aGlzLmdldFN0YXRpY0tWKEdSUGJ5KTtcclxuICAgIC8vICB0aGlzLmNyZWF0ZUdycCh0aGlzLnBrdHMsIHRoaXMuZGVmYXVsdEdycExpc3QpO1xyXG4gICAgbGV0IGF2Z0ZpZWxkcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJLWdyaWRBdmcnKSkgfHwgJyc7XHJcbiAgICBpZiAoYXZnRmllbGRzICE9ICcnKVxyXG4gICAgICB0aGlzLmdldFRvdGFscyhhdmdGaWVsZHMsIHRoaXMucGt0cyk7XHJcbiAgfVxyXG4gIGdldFN0YXRpY0tWKHFyeSkge1xyXG4gICAgdGhpcy5zdGF0aWNMb3YgPSBbXTtcclxuICAgIGxldCBhcnJrdiA9IHFyeS5zcGxpdCgnLCcpO1xyXG4gICAgbGV0IG9iaiA9IHt9LCBzdGF0aWNMb3YgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJya3YubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgICAgbGV0IGtleSA9IGFycmt2W2ldLCB2YWx1ZSA9IGFycmt2W2kgKyAxXTtcclxuICAgICAgb2JqWydrJ10gPSBrZXk7XHJcbiAgICAgIG9ialsndiddID0gdmFsdWU7XHJcbiAgICAgIC8vIGlmIChpID09IDApIHtcclxuICAgICAgLy8gICBxcnkuZGVmYXVsdF92YWx1ZSA9IHZhbHVlOy8va2V5XHJcbiAgICAgIC8vIH1cclxuICAgICAgdGhpcy5zdGF0aWNMb3YucHVzaChvYmopO1xyXG4gICAgICBvYmogPSB7fTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGljTG92ID0gdGhpcy5zdGF0aWNMb3YubWFwKG9wdGlvbiA9PiAoe1xyXG4gICAgICB2YWx1ZTogb3B0aW9uLnYsXHJcbiAgICAgIGxhYmVsOiBvcHRpb24ua1xyXG4gICAgfSkpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5zdGF0aWNMb3YpO1xyXG4gIH1cclxuXHJcbiAgbG9hZERlZmluYXRpb24oKSB7XHJcblxyXG4gICAgdGhpcy5fc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ107Ly8nc2VhcmNoRHRsRHNjckZvcm0nO1xyXG4gICAgdGhpcy5yZXFoZWFkZXJbJ21ldGhvZCddID0gJ2xvYWREZWZpbmF0aW9uJztcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMucmVxaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsICdtYXJrZXRpbmcvc2VhcmNoJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5wYWdlRGVmaW5hdGlvbiA9IHJlc3VsdC5wYWdlRGVmaW5hdGlvbiB8fCB7fTtcclxuICAgICAgICB0aGlzLmxpbmtzID0gdGhpcy5wYWdlRGVmaW5hdGlvbi5saW5rIHx8IFtdO1xyXG5cclxuICAgICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwibXRcIj5cclxuICA8ZGl2IGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIj5cclxuICAgICAgPGgzIGNsYXNzPVwicGFuZWwtdGl0bGVcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdCBjcFwiIChjbGljayk9XCJjcy5wYWdlQmNrKCk7XCI+IEJhY2s8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFBhY2tldCBMaXN0XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmLTEyXCI+KHt7Y3MuY0RhdGUgfCBkYXRlOiAnbWVkaXVtJ319KTwvc3Bhbj5cclxuICAgICAgPC9oMz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjb250ZW50LWZyYW1lXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaW5uZXJEXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZyYW1lLWxlZnRcIiAqbmdJZj1cImZhbHNlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgYm9yZGVyLWJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJyA6aSA9PSBjTGlua31cIiAqbmdGb3I9XCJsZXQgbmF2IG9mIG5hdmlnYXRpb247bGV0IGk9aW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRpb25GdW4obmF2LGkpO1wiPnt7bmF2LmZvcm1fZmllbGRfdGl0bGV9fSA8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZnJhbWUtYm9keVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IGN1c3RvbS1wYW5lbFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MDtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm9TZWNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cclxuICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duIHRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTBweDtcIj5cclxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImRpc3BsYXlUYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoPlN0YXR1czwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+Q291bnQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoPkN0czwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+QXZnPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImZvcm1uYW1lIT0nbWl4QW5hbHlzaXNSZXBvcnRGb3JtJ1wiPkRpc2M8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoPkFtb3VudDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3Qgb2YgYW5hQWxsR3JwU3R0O2xldCBpID0gaW5kZXg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxsYWJlbCBmb3I9XCJ7e3N0fX1cIiBjbGFzcz1cInRleHQtY2FwaXRhbGl6ZVwiPlM8L2xhYmVsPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICpuZ0lmPVwiZGVmYXVsdEdycExpc3QubGVuZ3RoPT0wXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiZGVmYXVsdEdycExpc3QubGVuZ3RoPT0wXCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ7e3N0fX1cIiB2YWx1ZT1cInt7c3R9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tzdH19XCIgWyhuZ01vZGVsKV09XCJzdE9ialtzdF1cIiBbY2hlY2tlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic3RhdHVzV2lzZURpc3BsYXkoJGV2ZW50LHN0T2JqKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3thbmFTdHRMYmxbaV18fHN0fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhbmFTdHRMYmwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4ge3tzdHRXaXNlU3VtbWFyeT8uZ2V0KHN0KT8uZ2V0KCdjb3VudCcpfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IHt7dGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChzdHRXaXNlU3VtbWFyeT8uZ2V0KHN0KT8uZ2V0KCd3dCcpKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiB7e3RoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoc3R0V2lzZVN1bW1hcnk/LmdldChzdCk/LmdldCgnYXZnJykpfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj4ge3t0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHN0dFdpc2VTdW1tYXJ5Py5nZXQoc3QpPy5nZXQoJ2Rpc2MnKSl9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4ge3t0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHN0dFdpc2VTdW1tYXJ5Py5nZXQoc3QpPy5nZXQoJ3JhdGUnKSl9fTwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtY29udHJvbFwiIG5hbWU9XCJ2aWV3ZGlzVHlwZVwiIChjaGFuZ2UpPVwib25HcnBTZWxlY3QoZGVmYXVsdEdycExpc3QpXCIgWyhuZ01vZGVsKV09XCJ2aWV3ZGlzVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJncm91cFwiPkdyb3VwIEJ5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN1bW1hcnlcIj5TdW1tYXJ5IEJ5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBHcm91cFwiIFtvcHRpb25zXT1cInN0YXRpY0xvdlwiIFsobmdNb2RlbCldPVwiZGVmYXVsdEdycExpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInN0YXR1c1wiIFttdWx0aXBsZV09XCJ0cnVlXCIgW2FsbG93Q2xlYXJdPVwidHJ1ZVwiIChzZWxlY3RlZCk9XCJvbkdycFNlbGVjdChkZWZhdWx0R3JwTGlzdClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGRlc2VsZWN0ZWQpPVwib25HcnBTZWxlY3QoZGVmYXVsdEdycExpc3QpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI29wdGlvblRlbXBsYXRlIGxldC1vcHRpb249XCJvcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZhbWZhbWZhbS1mbGFncyB7e29wdGlvbj8udmFsdWUudG9Mb3dlckNhc2UoKX19XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICA8Yj5CdXllciBQaWUgY2hhcnQ8L2I+XHJcbiAgICAgICAgICAgICAgICA8aSB0aXRsZT1cIkJ1eWVyIHdpc2UgcGllIGNoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7cGFkZGluZzogNXB4O21hcmdpbi1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1zaXplOiAyMHB4O2NvbG9yOiAjM2E1ODk4O1wiXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZhIGZhLXBpZS1jaGFydFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLXRhcmdldD1cIiNQaWVjaGFydE1vZGVsXCIgKGNsaWNrKT1cImdlbmVyYXRlUGllKCdidXllcicsJ3ZhbHVlJylcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgPHAgKm5nSWY9XCJkZWZhdWx0R3JwTGlzdC5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICAgICAgPGkgdGl0bGU9XCJHcm91cCB3aXNlIGNoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7cGFkZGluZzogNXB4O21hcmdpbi1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1zaXplOiAyMHB4O2NvbG9yOiAjM2E1ODk4O1wiXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZhIGZhLXBpZS1jaGFydFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLXRhcmdldD1cIiNQaWVjaGFydE1vZGVsXCIgKGNsaWNrKT1cImdlbmVyYXRlUGllKCdncm91cCcsJ3ZhbHVlJylcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImN1bFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBsZWdlbmQgb2YgbGVnZW5kTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cFxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6IGxlZ2VuZC5rICwnaGVpZ2h0JzonOXB4JywgJ3dpZHRoJzonOXB4JywgJ21hcmdpbic6ICcwJywgJ2Rpc3BsYXknIDogJ2lubGluZS1ibG9jayd9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAge3tsZWdlbmQudn19XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1pbmxpbmUgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dE5hbWUyXCI+U2VhcmNoICZuYnNwOyZuYnNwOzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJleGFtcGxlSW5wdXROYW1lMlwiIG5hbWU9XCJzY2h0eHRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaEZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTVweCA0cHggMjBweDttYXJnaW4tbGVmdDogMTBweDtmbG9hdDogcmlnaHQ7XCJcclxuICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJsZWZ0XCIgdGl0bGU9XCJEb3dubG9hZCBFeGNlbFwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRUb0NTVignUGFja2V0IGxpc3QnKTtcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIiBzdHlsZT1cImNvbG9yOmdyZWVuO1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA1cHg7XCIgKGNsaWNrKT1cIm1vZGlmeVNlYXJjaCgpXCI+TW9kaWZ5XHJcbiAgICAgICAgICAgICAgICAgIFNlYXJjaDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjdWxcIj5cclxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgbGVnZW5kIG9mIGxlZ2VuZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgPHBcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOiBsZWdlbmQuayAsJ2hlaWdodCc6JzlweCcsICd3aWR0aCc6JzlweCcsICdtYXJnaW4nOiAnMCcsICdkaXNwbGF5JyA6ICdpbmxpbmUtYmxvY2snfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgIHt7bGVnZW5kLnZ9fVxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICA8L3VsPiBcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdkaXNUeXBlPT0nZ3JvdXAnXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdyb3VwQnlwa3RMaXN0Lmxlbmd0aCA+MFwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIGlkPVwid3JhcFwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87d2lkdGg6IDEwMCU7aGVpZ2h0OiBjYWxjKDEwMHZoIC0gMjUwcHgpO1wiXHJcbiAgICAgICAgICAgICAgICAgIGluZmluaXRlLXNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCJzY3JvbGxEaXN0YW5jZVwiIFtpbmZpbml0ZVNjcm9sbFVwRGlzdGFuY2VdPVwic2Nyb2xsVXBEaXN0YW5jZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCIgKHNjcm9sbGVkKT1cImdyb3Vwb25TY3JvbGxEb3duKClcIiBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZGlzcGxheVRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInBvc3JlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNUaFwiIHN0eWxlPVwid2lkdGg6NzVweDtcIiAqbmdJZj1cImZvcm1uYW1lIT0nbWl4QW5hbHlzaXNSZXBvcnRGb3JtJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgRE5BPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+U3RhdHVzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKGNsaWNrKT1cInNvcnRCeShocmRLZXksZylcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIiAqbmdGb3I9XCJsZXQgaHJkS2V5IG9mIGhlYWRlcktleVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3toZWFkZXJbaHJkS2V5XX19XHJcbiAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwZHRsIG9mIGxvYWRncm91cEJ5cGt0TGlzdCBsZXQgaj1pbmRleDtcIj5cclxuICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiaGVhZGVyS2V5Lmxlbmd0aCsxXCIgc3R5bGU9XCJmb250LXdlaWdodDpib2xkO3RleHQtYWxpZ246IGxlZnQ7IFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2dyb3VwZHRsLnZhbHVlfX0gJm5ic3A7ICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgUXR5IDoge3tncm91cGR0bFsnY291bnQnXX19ICZuYnNwOyAmbmJzcDsgQ2FyYXRzIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAge3tncm91cGR0bFsnY3J0d3QnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyAmbmJzcDsgQXZnIDp7e2dyb3VwZHRsWydzYWxhdmcnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyAmbmJzcDsgRGlzJSA6IHt7Z3JvdXBkdGxbJ3NhbGRpcyddfX1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyBBbW91bnQgOiB7e2dyb3VwZHRsWydzYWx2bHUnXX19IFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPiBcclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ciAqbmdJZj1cInN0dHdpc2VcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJoZWFkZXJLZXkubGVuZ3RoKzFcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1hbGlnbjogbGVmdDsgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Z319ICZuYnNwOyAmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgUXR5IDoge3tmaW5hbEdycFZhbFtnXS5sZW5ndGh9fSAmbmJzcDsgJm5ic3A7IENhcmF0cyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7dG90YWxXZWlnaHR9fVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7IEFtb3VudCA6e3t0b3RBbXR9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPiAtLT5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHBrdGR0bCBvZiBncm91cGR0bFsncGt0TGlzdCddIHwgdGFibGVTZWFyY2g6c2VhcmNoRjpwa3RzO2xldCBwa3RpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydldmVuJzpwa3RpJTI9PTAsJ29kZCc6cGt0aSUyPT0xfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6NzVweDtwb3NpdGlvbjogcmVsYXRpdmU7XCIgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8va2FwdWdlbXMuY29tL2t3ZWIvIy9kbmEve3twa3RkdGwuc3RvY2tfaWRufX0vP2tleT17e2NrfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRpYW1vbmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwie3twa3RkdGwuc3RvY2tfaWRufX1cIiBbaGlkZGVuXT1cInRydWVcIiBpZD1cImNiX3t7cGt0ZHRsLnN0b2NrX2lkbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hlY2tlZFJvdyhwa3RkdGwscGt0ZHRsLnN0b2NrX2lkbiwkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiIFtuZ1N0eWxlXT1cInsnY29sb3InOiBwa3RkdGwuZHNwX3N0dH1cIj57e3BrdGR0bC5kc3Bfc3R0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaHJkS2V5IG9mIGhlYWRlcktleVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJocmRLZXkhPSdjbycgJiYgaHJkS2V5IT0ncHUnXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0X2NvbG9yID09ICcjRkZGRkZGJyA/ICdibGFjayc6cGt0ZHRsLmRzcF9zdHRfY29sb3J9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3twa3RkdGxbaHJkS2V5XX19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCIgKm5nSWY9XCJocmRLZXk9PSdjbydcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0X2NvbG9yID09ICcjRkZGRkZGJyA/ICdibGFjayc6cGt0ZHRsLmRzcF9zdHRfY29sb3J9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3twa3RkdGxbaHJkS2V5K1wiX3BcIl19fTwvdGQ+XHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCIgKm5nSWY9XCJocmRLZXk9PSdwdSdcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0X2NvbG9yID09ICcjRkZGRkZGJyA/ICdibGFjayc6cGt0ZHRsLmRzcF9zdHRfY29sb3J9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3twa3RkdGxbaHJkS2V5K1wiX3BcIl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgIFxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGt0cy5sZW5ndGggPiAwICYmIGdyb3VwQnlwa3RMaXN0Lmxlbmd0aD09MCBcIiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIiBpZD1cIndyYXBcIiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvO3dpZHRoOiAxMDAlO2hlaWdodDogY2FsYygxMDB2aCAtIDI1MHB4KTtcIlxyXG4gICAgICAgICAgICAgIGluZmluaXRlLXNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCJzY3JvbGxEaXN0YW5jZVwiIFtpbmZpbml0ZVNjcm9sbFVwRGlzdGFuY2VdPVwic2Nyb2xsVXBEaXN0YW5jZVwiXHJcbiAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIiAoc2Nyb2xsZWQpPVwib25TY3JvbGxEb3duKClcIiBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZGlzcGxheVRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInBvc3JlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNUaFwiIHN0eWxlPVwid2lkdGg6NzVweDtcIiAqbmdJZj1cImZvcm1uYW1lIT0nbWl4QW5hbHlzaXNSZXBvcnRGb3JtJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgRE5BPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlN0YXR1czwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0Zvcj1cImxldCBocmRLZXkgb2YgaGVhZGVyS2V5XCI+e3toZWFkZXJbaHJkS2V5XX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxiPkF2ZXJhZ2UgPC9iPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhyZEtleSBvZiBoZWFkZXJLZXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj57e2NzLnNwbGl0VG9Ud29EZWNpbWFsKFRvdEF2Z09ialtocmRLZXldKX19PC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcGt0ZHRsIG9mIGxvYWRSZXN1bHQgfCB0YWJsZVNlYXJjaDpzZWFyY2hGOnBrdHM7bGV0IHBrdGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydldmVuJzpwa3RpJTI9PTAsJ29kZCc6cGt0aSUyPT0xfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOjc1cHg7cG9zaXRpb246IHJlbGF0aXZlO1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9rYXB1Z2Vtcy5jb20va3dlYi8jL2RuYS97e3BrdGR0bC5zdG9ja19pZG59fS8/a2V5PXt7Y2t9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRpYW1vbmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9XCJ7e3BrdGR0bC5zdG9ja19pZG59fVwiIFtoaWRkZW5dPVwidHJ1ZVwiIGlkPVwiY2Jfe3twa3RkdGwuc3RvY2tfaWRufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hlY2tlZFJvdyhwa3RkdGwscGt0ZHRsLnN0b2NrX2lkbiwkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAgKm5nRm9yPVwibGV0IGxuayBvZiBsaW5rc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tsbmsuZm9ybV9maWVsZF9pY29ufX1cIiAqbmdJZj1cInBrdGR0bC5kc3Bfc3R0IT0nc29sZCdcIiAoY2xpY2spPVwiT25MaW5rQ2xpY2sobG5rLHBrdGR0bClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogcGt0ZHRsLmRzcF9zdHR9XCI+e3twa3RkdGwuZHNwX3N0dH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBocmRLZXkgb2YgaGVhZGVyS2V5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJocmRLZXkhPSdjbycgJiYgaHJkS2V5IT0ncHUnXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY29sb3InOiBwa3RkdGwuZHNwX3N0dF9jb2xvciA9PSAnI0ZGRkZGRicgPyAnYmxhY2snOnBrdGR0bC5kc3Bfc3R0X2NvbG9yfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3BrdGR0bFtocmRLZXldfX08L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCIgKm5nSWY9XCJocmRLZXk9PSdjbydcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY29sb3InOiBwa3RkdGwuZHNwX3N0dF9jb2xvciA9PSAnI0ZGRkZGRicgPyAnYmxhY2snOnBrdGR0bC5kc3Bfc3R0X2NvbG9yfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3BrdGR0bFtocmRLZXkrXCJfcFwiXX19PC90ZD5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIiAgKm5nSWY9XCJocmRLZXk9PSdwdSdcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY29sb3InOiBwa3RkdGwuZHNwX3N0dF9jb2xvciA9PSAnI0ZGRkZGRicgPyAnYmxhY2snOnBrdGR0bC5kc3Bfc3R0X2NvbG9yfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3BrdGR0bFtocmRLZXkrXCJfcFwiXX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3ZGlzVHlwZT09J3N1bW1hcnknICYmIHN1bW1hcnlMaXN0Lmxlbmd0aD4wXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+IDxidXR0b24gIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDRweCAxNXB4IDRweCAyMHB4O21hcmdpbi1sZWZ0OiAxMHB4O1wiIGRhdGEtdG9nZ2xlPVwidG9vbHRpcFwiIGRhdGEtcGxhY2VtZW50PVwicmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRG93bmxvYWQgRXhjZWxcIiAoY2xpY2spPVwiZXhwb3J0VG9DU1ZTdW1tYXJ5KCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIiBzdHlsZT1cImNvbG9yOmdyZWVuO1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJkaXNwbGF5VGFibGVcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtwYWRkaW5nOjEwcHggO1wiPlxyXG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJwb3NyZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+U3IuIE5vPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+QXR0cmlidXRlPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZHIgb2YgaGVhZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiIGNvbHNwYW49XCI1XCI+e3toZHJ9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInBvc3JlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGRyIG9mIGhlYWRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5RdHk8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+Q2FyYXQ8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+QXZnPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+RGlzPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlZhbHVlPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBzdW1tYXJ5RHRsIG9mIHN1bW1hcnlMaXN0IHwgdGFibGVTZWFyY2g6c2VhcmNoRjpwa3RzO2xldCBwa3RpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZXZlbic6cGt0aSUyPT0wLCdvZGQnOnBrdGklMj09MX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+e3twa3RpKzF9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPnt7c3VtbWFyeUR0bFsndmFsdWUnXX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZHIgb2YgaGVhZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+e3tzdW1tYXJ5RHRsWydjb3VudF8nK2hkcl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPnt7c3VtbWFyeUR0bFsnY3J0d3RfJytoZHJdfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj57e3N1bW1hcnlEdGxbJ2F2Z18nK2hkcl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+e3tzdW1tYXJ5RHRsWydkaXNfJytoZHJdfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj57e3N1bW1hcnlEdGxbJ3ZsdV8nK2hkcl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+IFxyXG5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuICAgICAgICAgIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbkZvb3RlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbHNlYyBwdWxsLWxlZnRcIiBzdHlsZT1cInBhZGRpbmc6IDVweDtcIj5cclxuICAgICAgICAgIDx0YWJsZT5cclxuICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IFRvdGFsOiAmbmJzcDsgPC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICB7e2ZpbmFsR3JwVmFsW1wiXCJdPy5sZW5ndGg+MCA/IGZpbmFsR3JwVmFsW1wiXCJdPy5sZW5ndGggOiBwa3RzPy5sZW5ndGh9fSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gV2VpZ2h0OiZuYnNwOzwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3RvdGFsV2VpZ2h0fX0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IEF2ZzombmJzcDs8L3N0cm9uZz4gPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7dG90QXZnfX0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxyXG5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCIgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IERpczombmJzcDs8L3N0cm9uZz4gPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7dG90RGlzfX0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxyXG5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPiBBbW91bnQ6Jm5ic3A7PC9zdHJvbmc+IDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3RvdEFtdH19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gJm5ic3A7Jm5ic3A7Jm5ic3A7fCAmbmJzcDsmbmJzcDtTZWxlY3RlZCBQa3RzIDogPC9zdHJvbmc+IDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3NlbGVjdGVkSXRtPy5sZW5ndGh9fSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IFdlaWdodDombmJzcDs8L3N0cm9uZz5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj4ge3tzZWxlY3R3dH19Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gQXZnOiZuYnNwOzwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3NlbGVjdEF2Z319Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPiBEaXNjOiZuYnNwOzwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3NlbGVjdERpc319Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPiBBbW91bnQ6Jm5ic3A7PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7c2VsZWN0QW10fX08L3RkPlxyXG5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDgwcHg7XCIgKGNsaWNrKT1cIm1vZGlmeVNlYXJjaCgpXCI+TW9kaWZ5XHJcbiAgICAgICAgICAgIFNlYXJjaDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cIlBpZWNoYXJ0TW9kZWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cImV4YW1wbGVNb2RhbExhYmVsXCJcclxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiIHJvbGU9XCJkb2N1bWVudFwiICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgPlxyXG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIm1haWxNb2RhbEhlYWRcIj5Ub3Age3t0eXBlfX0gUGllIENoYXJ0PC9oND5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIHB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImJ0blF0eVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJnZW5lcmF0ZVBpZShkYXRhVHlwZSwncXR5JylcIj5RVFkgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuVmFsXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdlbmVyYXRlUGllKGRhdGFUeXBlLCd2YWx1ZScpXCI+VkFMVUUgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIFxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciByb3dcIiAqbmdJZj1cImlzQnV5ZXJ3aXNlXCIgPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+PGI+Jm5ic3A7Jm5ic3A7ICZuYnNwO1RvdGFsIHNvbGQgdmFsdWU6XHJcbiAgICAgICAgICAgICAgICB7e3RoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoc3R0V2lzZVN1bW1hcnk/LmdldCgnc29sZCcpPy5nZXQoJ3JhdGUnKSl9fTwvYj48L2xhYmVsPlxyXG4gICAgICAgICAgICA8Y2FudmFzIGJhc2VDaGFydCBbZGF0YV09XCJkb3VnaG51dENoYXJ0RGF0YVwiICBbbGFiZWxzXT1cImRvdWdobnV0Q2hhcnRMYWJlbHNcIiAgW2xlZ2VuZF09XCJwaWVDaGFydExlZ2VuZFwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yc109XCJjaGFydENvbG9yc1wiICBbY2hhcnRUeXBlXT1cImRvdWdobnV0Q2hhcnRUeXBlXCIgW29wdGlvbnNdPVwicGllXCI+PC9jYW52YXM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgXHJcbiAgICAgICAgIFxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciByb3dcIiAqbmdJZj1cImlzR3Jwd2lzZVwiICA+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj48Yj4mbmJzcDsmbmJzcDsgJm5ic3A7VG90YWwgc29sZCB2YWx1ZTpcclxuICAgICAgICAgICAgICAgIHt7dGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChzdHRXaXNlU3VtbWFyeT8uZ2V0KCdzb2xkJyk/LmdldCgncmF0ZScpKX19PC9iPjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxjYW52YXMgYmFzZUNoYXJ0IFtkYXRhXT1cImRvdWdobnV0Q2hhcnREYXRhXCIgW2xhYmVsc109XCJkb3VnaG51dENoYXJ0TGFiZWxzXCIgW2xlZ2VuZF09XCJwaWVDaGFydExlZ2VuZFwiXHJcbiAgICAgICAgICAgICAgW2NoYXJ0VHlwZV09XCJkb3VnaG51dENoYXJ0VHlwZVwiIFtvcHRpb25zXT1cInBpZVwiPjwvY2FudmFzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIFxyXG5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHJvd1wiICpuZ0lmPVwiaXNRdHlXaXNlXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj48Yj4mbmJzcDsmbmJzcDsgJm5ic3A7VG90YWwgc29sZCB2YWx1ZTpcclxuICAgICAgICAgICAgICAgIHt7dGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChzdHRXaXNlU3VtbWFyeT8uZ2V0KCdzb2xkJyk/LmdldCgnY291bnQnKSl9fTwvYj48L2xhYmVsPlxyXG4gICAgICAgICAgICA8Y2FudmFzIGJhc2VDaGFydCBbZGF0YV09XCJkb3VnaG51dENoYXJ0RGF0YVwiIFtsYWJlbHNdPVwiZG91Z2hudXRDaGFydExhYmVsc1wiIFtsZWdlbmRdPVwicGllQ2hhcnRMZWdlbmRcIlxyXG4gICAgICAgICAgICAgIFtjaGFydFR5cGVdPVwiZG91Z2hudXRDaGFydFR5cGVcIiBbb3B0aW9uc109XCJwaWVcIj48L2NhbnZhcz5cclxuICAgICAgICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCIgaWQ9XCJiaWRNZFwiIHRhYmluZGV4PVwiLTFcIiBzdHlsZT1cInotaW5kZXg6IDE0MDBcIiByb2xlPVwiZGlhbG9nXCJcclxuICBhcmlhLWxhYmVsbGVkYnk9XCJleGFtcGxlTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiByb2xlPVwiZG9jdW1lbnRcIj5cclxuICAgIDxmb3JtIG5hbWU9XCJhcHBGb3JtXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgdGV4dC11cHBlcmNhc2VcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+XHJcbiAgICAgICAgICBQcmljZSBDaGFuZ2U8L2g1PlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgPlxyXG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgIFxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIHN0eWxlPVwicGFkZGluZzoxMHB4XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiAgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7Zm9udC13ZWlnaHQ6Ym9sZFwiPnt7Y09iaj8ucGt0X2NvZGV9fSB7e2NPYmo/LnNofX0ge3tjT2JqPy5jcnR3dH19IHt7Y09iaj8uY299fSB7e2NPYmo/LnB1fX0ge3tjT2JqPy5jdH19IHt7Y09iaj8ucG99fSAge3tjT2JqPy5zeX19ICB7e2NPYmo/LmZsfX08L3NwYW4+XHJcbiAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDIwcHg7cGFkZGluZy10b3A6IDNweFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjbGJsXCIgPiBSYXA6ICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+PHNwYW4gY2xhc3M9XCJjbGJsXCI+e3tjT2JqPy5iZW5jaG1hcmtfcnRlfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPiZuYnNwOzwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDIwcHg7cGFkZGluZy10b3A6IDNweFwiPlxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjbGJsXCIgPkRpc2NvdW50OjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsYmxcIj57e2NPYmo/LnJhcF9kaXN9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDtcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCAgdHlwZT1cInRleHRcIiAgKGNoYW5nZSk9XCJjYWxjdWxhdFJ0ZURpcyhjT2JqLCdkaXMnKVwiIHN0eWxlPVwid2lkdGg6MTAwcHhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJuZXdfcmFwX2Rpc1wiIFsobmdNb2RlbCldPVwiY09ialsnbmV3X3JhcF9kaXMnXVwiIC8+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAyMHB4O3BhZGRpbmctdG9wOiAzcHhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2xibFwiIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCI+UHJpY2U6PC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xibFwiPnt7Y09iaj8ucnRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCAgdHlwZT1cInRleHRcIiAgKGNoYW5nZSk9XCJjYWxjdWxhdFJ0ZURpcyhjT2JqLCdydGUnKVwiIHN0eWxlPVwid2lkdGg6MTAwcHhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJuZXdfcnRlXCIgWyhuZ01vZGVsKV09XCJjT2JqWyduZXdfcnRlJ11cIiAvPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiID5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFwcEFwcE5vRGJsQ2xpY2tcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiQ2hhbmdlc1ByaWNlKClcIj5VcGRhdGUgUHJpY2U8L2J1dHRvbj5cclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4gXHJcbjxidXR0b24gaWQ9XCJiaWRNZEJCdG5cIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjYmlkTWRcIj48L2J1dHRvbj5cclxuXHJcbiAgPGJ1dHRvbiBpZD1cIlBpZWNoYXJ0TW9kZWxCdG5cIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjUGllY2hhcnRNb2RlbFwiPjwvYnV0dG9uPlxyXG5cclxuXHJcbjwvZGl2PiJdfQ==