tango-app-ui-manage-tickets 3.7.0-beta.27 → 3.7.0-beta.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/filter-options/filter-options.component.mjs +41 -0
- package/esm2022/lib/components/footfall-dic/footfall-dic.component.mjs +3 -3
- package/esm2022/lib/components/footfall-popup/footfall-popup.component.mjs +15 -0
- package/esm2022/lib/components/tango-manage-tickets/tango-manage-tickets.component.mjs +4 -3
- package/esm2022/lib/components/ticket-footfall-new/ticket-footfall-new.component.mjs +902 -0
- package/esm2022/lib/services/ticket.service.mjs +20 -3
- package/esm2022/lib/tango-manage-tickets.module.mjs +11 -2
- package/fesm2022/tango-app-ui-manage-tickets.mjs +986 -22
- package/fesm2022/tango-app-ui-manage-tickets.mjs.map +1 -1
- package/lib/components/filter-options/filter-options.component.d.ts +15 -0
- package/lib/components/footfall-popup/footfall-popup.component.d.ts +8 -0
- package/lib/components/ticket-footfall-new/ticket-footfall-new.component.d.ts +151 -0
- package/lib/services/ticket.service.d.ts +7 -2
- package/lib/tango-manage-tickets.module.d.ts +9 -6
- package/package.json +1 -1
|
@@ -0,0 +1,902 @@
|
|
|
1
|
+
import { Component, EventEmitter, Output, ViewChild, } from "@angular/core";
|
|
2
|
+
import * as am4core from "@amcharts/amcharts4/core";
|
|
3
|
+
import am4themes_animated from "@amcharts/amcharts4/themes/animated";
|
|
4
|
+
import { FootfallPopupComponent } from "../footfall-popup/footfall-popup.component";
|
|
5
|
+
import { Subject, takeUntil } from "rxjs";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
8
|
+
import * as i2 from "tango-app-ui-global";
|
|
9
|
+
import * as i3 from "../../services/ticket.service";
|
|
10
|
+
import * as i4 from "../../services/excel.service";
|
|
11
|
+
import * as i5 from "tango-app-ui-shared";
|
|
12
|
+
import * as i6 from "@angular/forms";
|
|
13
|
+
import * as i7 from "@angular/common";
|
|
14
|
+
am4core.useTheme(am4themes_animated);
|
|
15
|
+
export class TicketFootfallNewComponent {
|
|
16
|
+
modalService;
|
|
17
|
+
gs;
|
|
18
|
+
service;
|
|
19
|
+
cd;
|
|
20
|
+
excelService;
|
|
21
|
+
ts;
|
|
22
|
+
fb;
|
|
23
|
+
searchValue = "";
|
|
24
|
+
sortedColumn = "";
|
|
25
|
+
sortDirection = 1;
|
|
26
|
+
destroy$ = new Subject();
|
|
27
|
+
constructor(modalService, gs, service, cd, excelService, ts, fb) {
|
|
28
|
+
this.modalService = modalService;
|
|
29
|
+
this.gs = gs;
|
|
30
|
+
this.service = service;
|
|
31
|
+
this.cd = cd;
|
|
32
|
+
this.excelService = excelService;
|
|
33
|
+
this.ts = ts;
|
|
34
|
+
this.fb = fb;
|
|
35
|
+
}
|
|
36
|
+
headerFilters;
|
|
37
|
+
footfallList_req;
|
|
38
|
+
ngOnInit() {
|
|
39
|
+
this.imageUrl = this.service?.footfallCDN;
|
|
40
|
+
this.gs.dataRangeValue?.pipe(takeUntil(this.destroy$))?.subscribe({
|
|
41
|
+
next: (data) => {
|
|
42
|
+
if (data) {
|
|
43
|
+
this.headerFilters = data;
|
|
44
|
+
this.footfallList_req = {
|
|
45
|
+
client: this.headerFilters.clients.toString(),
|
|
46
|
+
fromDate: this.headerFilters?.date?.startDate,
|
|
47
|
+
toDate: this.headerFilters?.date?.endDate,
|
|
48
|
+
};
|
|
49
|
+
this.getTicketSummary();
|
|
50
|
+
this.getTicketList();
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
getFootfallSummaryData;
|
|
56
|
+
getTicketSummary() {
|
|
57
|
+
this.service
|
|
58
|
+
.getTicketSummaryApi(this.footfallList_req.client, this.footfallList_req.fromDate, this.footfallList_req.toDate)
|
|
59
|
+
.pipe(takeUntil(this.destroy$))
|
|
60
|
+
.subscribe({
|
|
61
|
+
next: (res) => {
|
|
62
|
+
if (res && res?.data && res?.data?.result) {
|
|
63
|
+
this.getFootfallSummaryData = res?.data?.result;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.getFootfallSummaryData = [];
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
error: (err) => {
|
|
70
|
+
this.getFootfallSummaryData = [];
|
|
71
|
+
},
|
|
72
|
+
complete: () => {
|
|
73
|
+
this.getFootfallSummaryData.length === 0;
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
this.cd.detectChanges();
|
|
77
|
+
}
|
|
78
|
+
offset = 0;
|
|
79
|
+
limit = 10;
|
|
80
|
+
isExport = false;
|
|
81
|
+
footfallListData;
|
|
82
|
+
totalItems;
|
|
83
|
+
paginationSizes = [10, 20, 30];
|
|
84
|
+
loading = true;
|
|
85
|
+
noData = false;
|
|
86
|
+
tangoType = "store";
|
|
87
|
+
getTicketList() {
|
|
88
|
+
this.loading = true;
|
|
89
|
+
this.searchValue = this.searchValue?.trim() || "";
|
|
90
|
+
this.offset = this.offset || 1;
|
|
91
|
+
this.limit = this.limit || 10;
|
|
92
|
+
this.isExport = false;
|
|
93
|
+
this.service
|
|
94
|
+
.getTicketListApi(this.footfallList_req.client, this.footfallList_req.fromDate, this.footfallList_req.toDate, this.searchValue, this.limit, this.offset, this.isExport, this.sortedColumn, this.sortDirection, this.tangoType)
|
|
95
|
+
.pipe(takeUntil(this.destroy$))
|
|
96
|
+
.subscribe({
|
|
97
|
+
next: (res) => {
|
|
98
|
+
if (res && res.code === 200) {
|
|
99
|
+
this.noData = false;
|
|
100
|
+
this.loading = false;
|
|
101
|
+
this.footfallListData = res?.data?.result;
|
|
102
|
+
this.totalItems = res?.data?.count;
|
|
103
|
+
if (this.totalItems < 10) {
|
|
104
|
+
this.paginationSizes = [this.totalItems];
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
this.paginationSizes = [10, 20, 30];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.noData = true;
|
|
112
|
+
this.loading = false;
|
|
113
|
+
this.footfallListData = [];
|
|
114
|
+
}
|
|
115
|
+
this.cd.detectChanges();
|
|
116
|
+
},
|
|
117
|
+
error: (err) => {
|
|
118
|
+
this.noData = true;
|
|
119
|
+
this.loading = false;
|
|
120
|
+
},
|
|
121
|
+
complete: () => {
|
|
122
|
+
this.loading = false;
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
currentPage = 1;
|
|
127
|
+
pageSize = 10;
|
|
128
|
+
onPageChange(pageOffset) {
|
|
129
|
+
this.currentPage = Number(pageOffset);
|
|
130
|
+
this.offset = Number(pageOffset);
|
|
131
|
+
// this.limit = 10;
|
|
132
|
+
this.getTicketList();
|
|
133
|
+
}
|
|
134
|
+
onPageSizeChange(pageSize) {
|
|
135
|
+
this.pageSize = Number(pageSize);
|
|
136
|
+
this.limit = Number(pageSize);
|
|
137
|
+
this.currentPage = 1;
|
|
138
|
+
this.offset = 1;
|
|
139
|
+
this.getTicketList();
|
|
140
|
+
}
|
|
141
|
+
setpageSize() {
|
|
142
|
+
if (this.totalItems < 10) {
|
|
143
|
+
return this.totalItems;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
return this.pageSize;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
searchData() {
|
|
150
|
+
this.currentPage = 1;
|
|
151
|
+
this.offset = 1;
|
|
152
|
+
this.limit = 10;
|
|
153
|
+
this.getTicketList();
|
|
154
|
+
}
|
|
155
|
+
exportXLSX() {
|
|
156
|
+
this.searchValue = this.searchValue?.trim() || "";
|
|
157
|
+
this.offset = 1;
|
|
158
|
+
this.limit = 10000;
|
|
159
|
+
this.isExport = true;
|
|
160
|
+
this.service
|
|
161
|
+
.getTicketListExportApi(this.footfallList_req.client, this.footfallList_req.fromDate, this.footfallList_req.toDate, this.searchValue, this.limit, this.offset, this.isExport, this.sortedColumn, this.sortDirection, this.tangoType)
|
|
162
|
+
.pipe(takeUntil(this.destroy$))
|
|
163
|
+
.subscribe({
|
|
164
|
+
next: (res) => {
|
|
165
|
+
this.excelService.saveAsExcelFile(res, "footfall directory ticket ");
|
|
166
|
+
},
|
|
167
|
+
error: (err) => {
|
|
168
|
+
this.ts.getErrorToast("Error exporting data:" + err.error ? err.error : err.message);
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
onSort(column) {
|
|
173
|
+
if (this.sortedColumn === column) {
|
|
174
|
+
this.sortDirection = this.sortDirection === 1 ? -1 : 1;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
this.sortedColumn = column;
|
|
178
|
+
this.sortDirection = 1;
|
|
179
|
+
}
|
|
180
|
+
this.getTicketList();
|
|
181
|
+
}
|
|
182
|
+
select = "ticketList";
|
|
183
|
+
ticketData;
|
|
184
|
+
startAudit() {
|
|
185
|
+
const data = {
|
|
186
|
+
totalfiles: this.ticketData?.footfall,
|
|
187
|
+
filedetails: {
|
|
188
|
+
clientId: this.headerFilters?.client,
|
|
189
|
+
storeId: this.ticketData?.storeId,
|
|
190
|
+
Date: this.ticketData?.issueDate,
|
|
191
|
+
auditId: "",
|
|
192
|
+
userId: "",
|
|
193
|
+
nextToken: "",
|
|
194
|
+
},
|
|
195
|
+
auditId: "",
|
|
196
|
+
storedetails: {
|
|
197
|
+
storeName: this.ticketData?.storeName,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
sessionStorage.setItem("totalfiles", JSON.stringify(data));
|
|
201
|
+
}
|
|
202
|
+
backToNavigation() {
|
|
203
|
+
this.select = "ticketList";
|
|
204
|
+
this.footfallTicketsData = [];
|
|
205
|
+
this.getTicketList();
|
|
206
|
+
this.closeBtn = false;
|
|
207
|
+
this.isCheckboxEnable = false;
|
|
208
|
+
}
|
|
209
|
+
isCollapsed = false;
|
|
210
|
+
toggleSidebar() {
|
|
211
|
+
this.isCollapsed = !this.isCollapsed;
|
|
212
|
+
}
|
|
213
|
+
toggleFilter() {
|
|
214
|
+
this.isFilterOpen = !this.isFilterOpen;
|
|
215
|
+
}
|
|
216
|
+
isFilterOpen = false; // controls show/hide panel
|
|
217
|
+
filterForm;
|
|
218
|
+
filterChange = new EventEmitter();
|
|
219
|
+
newForm() {
|
|
220
|
+
this.filterForm = this.fb.group({
|
|
221
|
+
status: [""],
|
|
222
|
+
reviewerCondition: [""],
|
|
223
|
+
reviewerValue: [""],
|
|
224
|
+
approverCondition: [""],
|
|
225
|
+
approverValue: [""],
|
|
226
|
+
tangoCondition: [""],
|
|
227
|
+
tangoValue: [""],
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
applyFilter() {
|
|
231
|
+
this.filterChange.emit(this.filterForm.value);
|
|
232
|
+
this.isFilterOpen = false; // close after apply
|
|
233
|
+
}
|
|
234
|
+
resetFilter() {
|
|
235
|
+
this.filterForm.reset();
|
|
236
|
+
this.filterChange.emit(this.filterForm.value);
|
|
237
|
+
}
|
|
238
|
+
close() {
|
|
239
|
+
this.isFilterOpen = false;
|
|
240
|
+
}
|
|
241
|
+
StoresSearchValue = "";
|
|
242
|
+
sortedColumn1 = "";
|
|
243
|
+
sortDirection1 = 1;
|
|
244
|
+
searchStoresData() { }
|
|
245
|
+
sortValue(column) { }
|
|
246
|
+
openTicketsList = [];
|
|
247
|
+
selectedStores = []; // holds selected rows
|
|
248
|
+
allSelected = false; // top "Select All" checkbox
|
|
249
|
+
get storeCount() {
|
|
250
|
+
return this.openTicketsList?.length || 0;
|
|
251
|
+
}
|
|
252
|
+
// check if a row is selected (used in template)
|
|
253
|
+
isSelected(store) {
|
|
254
|
+
return this.selectedStores.includes(store);
|
|
255
|
+
}
|
|
256
|
+
// 🔹 common handler when a store becomes selected
|
|
257
|
+
handleStoreSelected(store) {
|
|
258
|
+
// your API/detail call for that ticket
|
|
259
|
+
this.dataStoreView(store); // or store.ticketId if needed
|
|
260
|
+
}
|
|
261
|
+
// when user clicks on a single store checkbox
|
|
262
|
+
toggleStoreSelection(store) {
|
|
263
|
+
if (this.isSelected(store)) {
|
|
264
|
+
// remove
|
|
265
|
+
this.selectedStores = this.selectedStores.filter(s => s !== store);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
// add (if you want single select, use: this.selectedStores = [store];)
|
|
269
|
+
this.selectedStores = [...this.selectedStores, store];
|
|
270
|
+
// call API for this store
|
|
271
|
+
this.handleStoreSelected(store);
|
|
272
|
+
}
|
|
273
|
+
// keep "Select All" in sync
|
|
274
|
+
this.allSelected =
|
|
275
|
+
this.selectedStores.length === this.openTicketsList.length &&
|
|
276
|
+
this.openTicketsList.length > 0;
|
|
277
|
+
}
|
|
278
|
+
// when user clicks on "Select All"
|
|
279
|
+
toggleSelectAll() {
|
|
280
|
+
if (this.allSelected) {
|
|
281
|
+
// unselect everything
|
|
282
|
+
this.selectedStores = [];
|
|
283
|
+
this.allSelected = false;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// select all visible stores
|
|
287
|
+
this.selectedStores = [...this.openTicketsList];
|
|
288
|
+
this.allSelected = true;
|
|
289
|
+
// usually no need to call detail API here, but you can if you want
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
originalImage = {
|
|
293
|
+
id: 4,
|
|
294
|
+
entryTime: "10:00 AM",
|
|
295
|
+
};
|
|
296
|
+
ticket = [];
|
|
297
|
+
imageUrl;
|
|
298
|
+
getFormattedEntryTime(entryTime) {
|
|
299
|
+
if (!entryTime)
|
|
300
|
+
return "-";
|
|
301
|
+
const [hours, minutes, seconds] = entryTime.split(":").map(Number);
|
|
302
|
+
const date = new Date();
|
|
303
|
+
date.setHours(hours, minutes, seconds);
|
|
304
|
+
return date.toLocaleTimeString("en-US", {
|
|
305
|
+
hour: "2-digit",
|
|
306
|
+
minute: "2-digit",
|
|
307
|
+
// second: '2-digit',
|
|
308
|
+
hour12: true,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
duplicates;
|
|
312
|
+
// key = parent original.tempId, value = array of selected duplicate tempIds
|
|
313
|
+
selectedDuplicatesByParent = {};
|
|
314
|
+
// is one duplicate selected?
|
|
315
|
+
isDuplicateSelected(parentId, duplicateId) {
|
|
316
|
+
return (this.selectedDuplicatesByParent[parentId]?.includes(duplicateId) || false);
|
|
317
|
+
}
|
|
318
|
+
// select / unselect single duplicate
|
|
319
|
+
onDuplicateCheckboxChange(parentId, duplicateId, event) {
|
|
320
|
+
const checked = event.target.checked;
|
|
321
|
+
if (!this.selectedDuplicatesByParent[parentId]) {
|
|
322
|
+
this.selectedDuplicatesByParent[parentId] = [];
|
|
323
|
+
}
|
|
324
|
+
const list = this.selectedDuplicatesByParent[parentId];
|
|
325
|
+
if (checked) {
|
|
326
|
+
if (!list.includes(duplicateId)) {
|
|
327
|
+
list.push(duplicateId);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
this.selectedDuplicatesByParent[parentId] = list.filter((id) => id !== duplicateId);
|
|
332
|
+
}
|
|
333
|
+
this.updateOverallSelectedIds();
|
|
334
|
+
console.log("Selected duplicates map:", this.selectedDuplicatesByParent);
|
|
335
|
+
}
|
|
336
|
+
// are *all* duplicates under this parent selected?
|
|
337
|
+
areAllDuplicatesSelected(original) {
|
|
338
|
+
const parentId = original.tempId;
|
|
339
|
+
const duplicates = original?.duplicateImage || [];
|
|
340
|
+
const selected = this.selectedDuplicatesByParent[parentId] || [];
|
|
341
|
+
return duplicates.length > 0 && selected.length === duplicates.length;
|
|
342
|
+
}
|
|
343
|
+
// handle "Select All" toggle for this original
|
|
344
|
+
onToggleSelectAllDuplicates(original, event) {
|
|
345
|
+
const checked = event.target.checked;
|
|
346
|
+
const parentId = original.tempId;
|
|
347
|
+
const duplicates = original?.duplicateImage || [];
|
|
348
|
+
if (checked) {
|
|
349
|
+
this.selectedDuplicatesByParent[parentId] = duplicates.map((d) => d.tempId);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
this.selectedDuplicatesByParent[parentId] = [];
|
|
353
|
+
}
|
|
354
|
+
this.updateOverallSelectedIds();
|
|
355
|
+
console.log("Selected duplicates map:", this.selectedDuplicatesByParent);
|
|
356
|
+
}
|
|
357
|
+
// comments: any;
|
|
358
|
+
commentModal(obj) {
|
|
359
|
+
const modalRef = this.modalService.open(FootfallPopupComponent, {
|
|
360
|
+
centered: true,
|
|
361
|
+
size: "md",
|
|
362
|
+
scrollable: true,
|
|
363
|
+
backdrop: "static",
|
|
364
|
+
});
|
|
365
|
+
modalRef.componentInstance.ticketId = obj.ticketId;
|
|
366
|
+
modalRef.result.then((result) => { });
|
|
367
|
+
}
|
|
368
|
+
commentsAccordionOpen = false;
|
|
369
|
+
toggleCommentsAccordion() {
|
|
370
|
+
this.commentsAccordionOpen = !this.commentsAccordionOpen;
|
|
371
|
+
}
|
|
372
|
+
ngOnDestroy() {
|
|
373
|
+
this.destroy$.next(true);
|
|
374
|
+
this.destroy$.complete();
|
|
375
|
+
}
|
|
376
|
+
comments = [
|
|
377
|
+
{
|
|
378
|
+
email: "ryan@lenskart.com",
|
|
379
|
+
avatar: "assets/avatars/ryan.png",
|
|
380
|
+
time: "2025-01-20T10:53:34",
|
|
381
|
+
mainText: "All the three are same.",
|
|
382
|
+
statusLabel: null,
|
|
383
|
+
statusType: null,
|
|
384
|
+
note: null,
|
|
385
|
+
images: [
|
|
386
|
+
{
|
|
387
|
+
url: "assets/img1.jpg",
|
|
388
|
+
tangoId: 4,
|
|
389
|
+
entryTime: "10:10 AM",
|
|
390
|
+
status: "reject",
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
url: "assets/img2.jpg",
|
|
394
|
+
tangoId: 4,
|
|
395
|
+
entryTime: "10:10 AM",
|
|
396
|
+
status: "reject",
|
|
397
|
+
},
|
|
398
|
+
// more images if you want
|
|
399
|
+
],
|
|
400
|
+
moreCount: 12, // for the +12 card
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
email: "drew@lenskart.com",
|
|
404
|
+
avatar: "assets/avatars/drew.png",
|
|
405
|
+
time: "2025-01-20T10:53:34",
|
|
406
|
+
mainText: null,
|
|
407
|
+
statusLabel: "Reject",
|
|
408
|
+
statusType: "danger",
|
|
409
|
+
note: "Not agreed, seems not duplicate.",
|
|
410
|
+
images: [
|
|
411
|
+
{
|
|
412
|
+
url: "assets/img1.jpg",
|
|
413
|
+
tangoId: 4,
|
|
414
|
+
entryTime: "10:10 AM",
|
|
415
|
+
status: "reject",
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
url: "assets/img2.jpg",
|
|
419
|
+
tangoId: 4,
|
|
420
|
+
entryTime: "10:10 AM",
|
|
421
|
+
status: "reject",
|
|
422
|
+
},
|
|
423
|
+
],
|
|
424
|
+
moreCount: 12,
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
email: "orlando@lenskart.com",
|
|
428
|
+
avatar: "assets/avatars/orlando.png",
|
|
429
|
+
time: "2025-01-20T10:53:34",
|
|
430
|
+
mainText: null,
|
|
431
|
+
statusLabel: "Approved",
|
|
432
|
+
statusType: "success",
|
|
433
|
+
note: "Agreed, hence approving the 3",
|
|
434
|
+
images: [
|
|
435
|
+
{
|
|
436
|
+
url: "assets/img1.jpg",
|
|
437
|
+
tangoId: 4,
|
|
438
|
+
entryTime: "10:10 AM",
|
|
439
|
+
status: "approve",
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
url: "assets/img2.jpg",
|
|
443
|
+
tangoId: 4,
|
|
444
|
+
entryTime: "10:10 AM",
|
|
445
|
+
status: "approve",
|
|
446
|
+
},
|
|
447
|
+
],
|
|
448
|
+
moreCount: 0,
|
|
449
|
+
},
|
|
450
|
+
];
|
|
451
|
+
showRevisedDetails = false;
|
|
452
|
+
footfallNoData = false;
|
|
453
|
+
footfallLoading = false;
|
|
454
|
+
footfalloffset = 1;
|
|
455
|
+
footfalllimit = 1;
|
|
456
|
+
totalItemsFootfall = 0;
|
|
457
|
+
dataIndexId = "";
|
|
458
|
+
dateString = "";
|
|
459
|
+
storeIdValue = [];
|
|
460
|
+
lastSelectedTicket;
|
|
461
|
+
selecteValues = "";
|
|
462
|
+
hasInitialStoreSynced = false;
|
|
463
|
+
pageSizeFootfall = 10;
|
|
464
|
+
paginationSizesFootfall = [10, 20, 30];
|
|
465
|
+
addStoreIfNotExists(store) {
|
|
466
|
+
if (this.hasInitialStoreSynced)
|
|
467
|
+
return;
|
|
468
|
+
const storeId = store?.storeId;
|
|
469
|
+
if (storeId && !this.selectedStores.includes(storeId)) {
|
|
470
|
+
this.selectedStores.push(storeId);
|
|
471
|
+
}
|
|
472
|
+
this.hasInitialStoreSynced = true;
|
|
473
|
+
this.allSelected = this.selectedStores.length === this.openTicketsList.length;
|
|
474
|
+
}
|
|
475
|
+
hasRevopsType(type) {
|
|
476
|
+
if (!this.footfallTicketsData || !Array.isArray(this.footfallTicketsData)) {
|
|
477
|
+
return false;
|
|
478
|
+
}
|
|
479
|
+
return this.footfallTicketsData.some((ticket) => ticket?._source?.mappingInfo?.some((mapping) => (mapping?.revisedDetail || []).some((r) => r?.revopsType === type)));
|
|
480
|
+
}
|
|
481
|
+
overallSelectedIds;
|
|
482
|
+
overallSelect(event) {
|
|
483
|
+
const checked = event.target.checked;
|
|
484
|
+
const parents = this.getAllParentItems();
|
|
485
|
+
if (checked) {
|
|
486
|
+
["junk", "employee", "houseKeeping"].forEach((type) => {
|
|
487
|
+
const list = this.getListByType(type);
|
|
488
|
+
this.selectedByType[type] = list.map((i) => i.tempId);
|
|
489
|
+
this.selectAllByType[type] = list.length > 0;
|
|
490
|
+
});
|
|
491
|
+
this.selectedDuplicatesByParent = {}; // reset first
|
|
492
|
+
parents
|
|
493
|
+
.filter((p) => p.revopsType === "duplicate")
|
|
494
|
+
.forEach((p) => {
|
|
495
|
+
const parentId = p.tempId;
|
|
496
|
+
const duplicates = p.duplicateImage || [];
|
|
497
|
+
this.selectedDuplicatesByParent[parentId] = duplicates.map((d) => d.tempId);
|
|
498
|
+
});
|
|
499
|
+
// 🔹 build IDs
|
|
500
|
+
this.updateOverallSelectedIds();
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
// clear all
|
|
504
|
+
this.selectedByType.junk = [];
|
|
505
|
+
this.selectedByType.employee = [];
|
|
506
|
+
this.selectedByType.houseKeeping = [];
|
|
507
|
+
this.selectedDuplicatesByParent = {};
|
|
508
|
+
this.selectAllByType.junk = false;
|
|
509
|
+
this.selectAllByType.employee = false;
|
|
510
|
+
this.selectAllByType.houseKeeping = false;
|
|
511
|
+
this.selectAllByType.duplicate = false;
|
|
512
|
+
this.overallSelectedIds = [];
|
|
513
|
+
}
|
|
514
|
+
console.log("selectedByType:", this.selectedByType);
|
|
515
|
+
console.log("selectedDuplicatesByParent:", this.selectedDuplicatesByParent);
|
|
516
|
+
}
|
|
517
|
+
getAllParentItems() {
|
|
518
|
+
if (!this.footfallTicketsData) {
|
|
519
|
+
return [];
|
|
520
|
+
}
|
|
521
|
+
const allMappings = [];
|
|
522
|
+
const allRevised = [];
|
|
523
|
+
// first level: collect all mappingInfo arrays
|
|
524
|
+
this.footfallTicketsData.forEach((ticket) => {
|
|
525
|
+
const mappings = ticket?._source?.mappingInfo || [];
|
|
526
|
+
allMappings.push.apply(allMappings, mappings); // concat
|
|
527
|
+
});
|
|
528
|
+
// second level: collect all revisedDetail arrays
|
|
529
|
+
allMappings.forEach((mapping) => {
|
|
530
|
+
const details = mapping?.revisedDetail || [];
|
|
531
|
+
allRevised.push.apply(allRevised, details); // concat
|
|
532
|
+
});
|
|
533
|
+
return allRevised;
|
|
534
|
+
}
|
|
535
|
+
isCheckboxEnable = false;
|
|
536
|
+
closeBtn = false;
|
|
537
|
+
startReview() {
|
|
538
|
+
this.isCheckboxEnable = true; // call this on your "Review" button click
|
|
539
|
+
this.closeBtn = true;
|
|
540
|
+
}
|
|
541
|
+
stopReview() {
|
|
542
|
+
this.isCheckboxEnable = false;
|
|
543
|
+
this.closeBtn = false;
|
|
544
|
+
}
|
|
545
|
+
ticketView(data) {
|
|
546
|
+
this.getOpenTicketList(data);
|
|
547
|
+
this.ticketData = data;
|
|
548
|
+
this.select = "ticketMethod";
|
|
549
|
+
}
|
|
550
|
+
dataStoreView(data) {
|
|
551
|
+
this.footfallTicketsData = [];
|
|
552
|
+
this.footfallNoData = false;
|
|
553
|
+
this.footfallLoading = true;
|
|
554
|
+
const ticket = data?.ticketId;
|
|
555
|
+
// if (!ticket || !ticket._source) {
|
|
556
|
+
// this.footfallLoading = false;
|
|
557
|
+
// this.footfallNoData = true;
|
|
558
|
+
// this.ts.getErrorToast("No ticket data available");
|
|
559
|
+
// return;
|
|
560
|
+
// }
|
|
561
|
+
this.lastSelectedTicket = ticket;
|
|
562
|
+
this.addStoreIfNotExists(ticket);
|
|
563
|
+
this.imageUrl = this.service?.footfallCDN;
|
|
564
|
+
this.storeIdValue = this.selectedStores;
|
|
565
|
+
this.service
|
|
566
|
+
.getTicketsNewApi(ticket)
|
|
567
|
+
.pipe(takeUntil(this.destroy$))
|
|
568
|
+
.subscribe({
|
|
569
|
+
next: (res) => {
|
|
570
|
+
if (res && res.code === 200) {
|
|
571
|
+
if (res?.data?.result?.length === 0) {
|
|
572
|
+
this.footfallTicketsData = [];
|
|
573
|
+
this.footfallNoData = true;
|
|
574
|
+
this.footfallLoading = false;
|
|
575
|
+
this.ts.getErrorToast("No data found for the selected filters");
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
this.footfallTicketsData = res?.data?.result ?? [];
|
|
579
|
+
this.totalItemsFootfall = res?.data?.count;
|
|
580
|
+
if (this.footfalllimit === 1) {
|
|
581
|
+
this.paginationSizes = [1];
|
|
582
|
+
this.pageSizeFootfall = 1;
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
const limit = this.totalItemsFootfall < 10 ? this.totalItemsFootfall : 10;
|
|
586
|
+
this.paginationSizes = [limit];
|
|
587
|
+
this.pageSizeFootfall = limit;
|
|
588
|
+
}
|
|
589
|
+
this.footfallNoData = false;
|
|
590
|
+
this.footfallLoading = false;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
this.footfallTicketsData = [];
|
|
595
|
+
this.footfallNoData = true;
|
|
596
|
+
this.footfallLoading = false;
|
|
597
|
+
}
|
|
598
|
+
},
|
|
599
|
+
error: (err) => {
|
|
600
|
+
if (err?.error?.code === 400)
|
|
601
|
+
this.ts.getErrorToast(err?.error?.message ? err?.error?.message : err?.error?.error);
|
|
602
|
+
this.footfallTicketsData = [];
|
|
603
|
+
this.footfallNoData = true;
|
|
604
|
+
this.footfallLoading = false;
|
|
605
|
+
},
|
|
606
|
+
complete: () => {
|
|
607
|
+
this.cd.detectChanges();
|
|
608
|
+
},
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
footfallTicketsData = [];
|
|
612
|
+
// ---- SELECTION STATE ----
|
|
613
|
+
selectedByType = {
|
|
614
|
+
junk: [],
|
|
615
|
+
employee: [],
|
|
616
|
+
houseKeeping: [],
|
|
617
|
+
duplicate: [],
|
|
618
|
+
};
|
|
619
|
+
selectAllByType = {
|
|
620
|
+
junk: false,
|
|
621
|
+
employee: false,
|
|
622
|
+
houseKeeping: false,
|
|
623
|
+
duplicate: false,
|
|
624
|
+
};
|
|
625
|
+
// ---- HELPERS ----
|
|
626
|
+
// Get all revisedDetail items of a given type from footfallTicketsData
|
|
627
|
+
getListByType(type) {
|
|
628
|
+
if (!this.footfallTicketsData) {
|
|
629
|
+
return [];
|
|
630
|
+
}
|
|
631
|
+
const allMappings = [];
|
|
632
|
+
const allRevised = [];
|
|
633
|
+
// collect mappingInfo
|
|
634
|
+
this.footfallTicketsData.forEach((ticket) => {
|
|
635
|
+
const mappings = ticket?._source?.mappingInfo || [];
|
|
636
|
+
allMappings.push.apply(allMappings, mappings);
|
|
637
|
+
});
|
|
638
|
+
// collect revisedDetail
|
|
639
|
+
allMappings.forEach((mapping) => {
|
|
640
|
+
const details = mapping?.revisedDetail || [];
|
|
641
|
+
allRevised.push.apply(allRevised, details);
|
|
642
|
+
});
|
|
643
|
+
// filter by type
|
|
644
|
+
return allRevised.filter((original) => original?.revopsType === type);
|
|
645
|
+
}
|
|
646
|
+
updateOverallSelectedIds() {
|
|
647
|
+
const ids = [];
|
|
648
|
+
const parents = this.getAllParentItems();
|
|
649
|
+
// ---- 1) normal types: junk / employee / houseKeeping ----
|
|
650
|
+
["junk", "employee", "houseKeeping"].forEach((type) => {
|
|
651
|
+
const list = this.getListByType(type); // all items of that type
|
|
652
|
+
const selectedTemps = this.selectedByType[type] || []; // selected tempIds
|
|
653
|
+
list.forEach((item) => {
|
|
654
|
+
if (selectedTemps.includes(item.tempId) && item.id) {
|
|
655
|
+
ids.push(item.id); // e.g. "11-1716_2025-11-20_4"
|
|
656
|
+
}
|
|
657
|
+
});
|
|
658
|
+
});
|
|
659
|
+
// ---- 2) duplicates: children inside parent.data ----
|
|
660
|
+
parents
|
|
661
|
+
.filter((p) => p.revopsType === "duplicate")
|
|
662
|
+
.forEach((parent) => {
|
|
663
|
+
const parentId = parent.tempId;
|
|
664
|
+
const selectedChildTemps = this.selectedDuplicatesByParent[parentId] || [];
|
|
665
|
+
(parent.duplicateImage || []).forEach((child) => {
|
|
666
|
+
if (selectedChildTemps.includes(child.tempId)) {
|
|
667
|
+
// if child has its own id, use that. otherwise fallback to parent.id
|
|
668
|
+
ids.push(child.id || parent.id);
|
|
669
|
+
}
|
|
670
|
+
});
|
|
671
|
+
});
|
|
672
|
+
this.overallSelectedIds = ids;
|
|
673
|
+
console.log("overallSelectedIds:", this.overallSelectedIds);
|
|
674
|
+
}
|
|
675
|
+
type;
|
|
676
|
+
// "Select all" / "Unselect all" for a type
|
|
677
|
+
popupvalue = '';
|
|
678
|
+
// or just: popupvalue: string = '';
|
|
679
|
+
onSelectAll(type, event) {
|
|
680
|
+
const checked = event?.target?.checked;
|
|
681
|
+
this.selectAllByType[type] = checked;
|
|
682
|
+
this.type = type;
|
|
683
|
+
this.popupvalue = type; // 🔴 IMPORTANT
|
|
684
|
+
const list = this.getListByType(type);
|
|
685
|
+
this.selectedByType[type] = checked ? list.map((x) => x.tempId) : [];
|
|
686
|
+
this.updateOverallSelectedIds();
|
|
687
|
+
console.log(this.selectedByType);
|
|
688
|
+
}
|
|
689
|
+
// Single checkbox change for one image
|
|
690
|
+
onImageCheckboxChange(type, id) {
|
|
691
|
+
const arr = this.selectedByType[type];
|
|
692
|
+
const index = arr.indexOf(id);
|
|
693
|
+
if (index > -1) {
|
|
694
|
+
arr.splice(index, 1); // remove
|
|
695
|
+
}
|
|
696
|
+
else {
|
|
697
|
+
arr.push(id); // add
|
|
698
|
+
}
|
|
699
|
+
// Update "select all" state
|
|
700
|
+
const total = this.getListByType(type).length;
|
|
701
|
+
this.selectAllByType[type] = total > 0 && arr.length === total;
|
|
702
|
+
this.updateOverallSelectedIds();
|
|
703
|
+
this.popupvalue = type; // 🔴 also update here
|
|
704
|
+
}
|
|
705
|
+
remarks;
|
|
706
|
+
zoomPopup;
|
|
707
|
+
popupType;
|
|
708
|
+
popupIds = [];
|
|
709
|
+
popupOpen(type, value) {
|
|
710
|
+
// store type
|
|
711
|
+
this.popupType = type;
|
|
712
|
+
this.popupIds = this.overallSelectedIds || [];
|
|
713
|
+
// build ids from current selection
|
|
714
|
+
console.log("popupType:", this.popupType);
|
|
715
|
+
console.log("popupIds:", this.popupIds); // ["11-1716_2025-11-12_11AM-12PM_6", ...]
|
|
716
|
+
const modalRef = this.modalService.open(this.zoomPopup, {
|
|
717
|
+
centered: true,
|
|
718
|
+
size: "md",
|
|
719
|
+
backdrop: "static",
|
|
720
|
+
keyboard: false,
|
|
721
|
+
});
|
|
722
|
+
}
|
|
723
|
+
houseKeepingACCount;
|
|
724
|
+
employeeACCount;
|
|
725
|
+
duplicateACCount;
|
|
726
|
+
junkACCount;
|
|
727
|
+
selectedDuplicateImagesList = [];
|
|
728
|
+
selectedHousekeepingImagesList = [];
|
|
729
|
+
selectedEmployeeImagesList = [];
|
|
730
|
+
selectedJunkImagesList = [];
|
|
731
|
+
submitValue(status = "approved", category = "duplicate") {
|
|
732
|
+
// Step 1: Validate based on current category
|
|
733
|
+
let obj = {
|
|
734
|
+
id: this.popupIds,
|
|
735
|
+
status: status,
|
|
736
|
+
type: "review",
|
|
737
|
+
};
|
|
738
|
+
this.service
|
|
739
|
+
.getUpdateTempStatusApi(obj)
|
|
740
|
+
.pipe(takeUntil(this.destroy$))
|
|
741
|
+
.subscribe({
|
|
742
|
+
next: (res) => {
|
|
743
|
+
if (res && res?.code === 200) {
|
|
744
|
+
this.ts.getSuccessToast("Status updated successfully");
|
|
745
|
+
this.resetSelections();
|
|
746
|
+
this.cancel();
|
|
747
|
+
this.dataStoreView(this.ticketData);
|
|
748
|
+
this.remarks = "";
|
|
749
|
+
}
|
|
750
|
+
else {
|
|
751
|
+
this.ts.getErrorToast("Error updating status");
|
|
752
|
+
}
|
|
753
|
+
},
|
|
754
|
+
error: (err) => {
|
|
755
|
+
const errorMsg = err?.error?.message ||
|
|
756
|
+
err?.error?.error ||
|
|
757
|
+
err?.error ||
|
|
758
|
+
err?.message ||
|
|
759
|
+
"Error updating status";
|
|
760
|
+
this.ts.getErrorToast(errorMsg);
|
|
761
|
+
},
|
|
762
|
+
complete: () => {
|
|
763
|
+
this.cd.detectChanges();
|
|
764
|
+
},
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
resetSelections() {
|
|
768
|
+
// completely replace the object so change detection sees it
|
|
769
|
+
this.selectedByType = {
|
|
770
|
+
junk: [],
|
|
771
|
+
employee: [],
|
|
772
|
+
houseKeeping: [],
|
|
773
|
+
duplicate: []
|
|
774
|
+
};
|
|
775
|
+
this.selectAllByType = {
|
|
776
|
+
junk: false,
|
|
777
|
+
employee: false,
|
|
778
|
+
houseKeeping: false,
|
|
779
|
+
duplicate: false
|
|
780
|
+
};
|
|
781
|
+
this.selectedDuplicatesByParent = {};
|
|
782
|
+
this.overallSelectedIds = [];
|
|
783
|
+
this.popupIds = [];
|
|
784
|
+
console.log('RESET selections:', this.selectedByType, this.selectedDuplicatesByParent);
|
|
785
|
+
}
|
|
786
|
+
cancel() {
|
|
787
|
+
this.modalService.dismissAll();
|
|
788
|
+
// this.footfallTicketsData = [];
|
|
789
|
+
}
|
|
790
|
+
arrowshow = true;
|
|
791
|
+
openArrow() {
|
|
792
|
+
this.arrowshow = false;
|
|
793
|
+
}
|
|
794
|
+
closeArrow() {
|
|
795
|
+
this.arrowshow = true;
|
|
796
|
+
}
|
|
797
|
+
getOpenTicketList(data) {
|
|
798
|
+
console.log('getOpenTicketList data:', data);
|
|
799
|
+
// support passing either whole store object or just ticketId
|
|
800
|
+
const selectedTicketId = data?.ticketId ?? data;
|
|
801
|
+
const obj = {
|
|
802
|
+
clientId: [this.headerFilters?.client],
|
|
803
|
+
fromDate: this.headerFilters?.date?.startDate,
|
|
804
|
+
toDate: this.headerFilters?.date?.endDate,
|
|
805
|
+
};
|
|
806
|
+
this.service.getOpenTicketListApi(obj)
|
|
807
|
+
.pipe(takeUntil(this.destroy$))
|
|
808
|
+
.subscribe({
|
|
809
|
+
next: (res) => {
|
|
810
|
+
if (res && res?.code === 200) {
|
|
811
|
+
this.openTicketsList = res?.data ?? [];
|
|
812
|
+
// reset selection
|
|
813
|
+
this.selectedStores = [];
|
|
814
|
+
this.allSelected = false;
|
|
815
|
+
if (!this.openTicketsList.length) {
|
|
816
|
+
return;
|
|
817
|
+
}
|
|
818
|
+
let storeToSelect;
|
|
819
|
+
// 👉 1) if data passed, try to match in NEW list by ticketId
|
|
820
|
+
if (selectedTicketId) {
|
|
821
|
+
storeToSelect = this.openTicketsList.find((s) => s.ticketId === selectedTicketId);
|
|
822
|
+
}
|
|
823
|
+
// 👉 2) if no match or no data → fallback to 0 index
|
|
824
|
+
if (!storeToSelect) {
|
|
825
|
+
storeToSelect = this.openTicketsList[0];
|
|
826
|
+
}
|
|
827
|
+
// 👉 3) set selection + call handler
|
|
828
|
+
this.selectedStores = [storeToSelect];
|
|
829
|
+
this.handleStoreSelected(storeToSelect);
|
|
830
|
+
}
|
|
831
|
+
else {
|
|
832
|
+
this.openTicketsList = [];
|
|
833
|
+
this.selectedStores = [];
|
|
834
|
+
this.allSelected = false;
|
|
835
|
+
}
|
|
836
|
+
},
|
|
837
|
+
error: () => {
|
|
838
|
+
this.openTicketsList = [];
|
|
839
|
+
this.selectedStores = [];
|
|
840
|
+
this.allSelected = false;
|
|
841
|
+
},
|
|
842
|
+
complete: () => {
|
|
843
|
+
this.cd.detectChanges();
|
|
844
|
+
}
|
|
845
|
+
});
|
|
846
|
+
}
|
|
847
|
+
isApproved(original) {
|
|
848
|
+
const actions = original?.actions || [];
|
|
849
|
+
return actions.some((a) => a.actionType === 'review' && a.action === 'approved');
|
|
850
|
+
}
|
|
851
|
+
isRejected(original) {
|
|
852
|
+
const actions = original?.actions || [];
|
|
853
|
+
return actions.some((a) => a.actionType === 'review' && a.action === 'rejected');
|
|
854
|
+
}
|
|
855
|
+
resetCheckbox(type, original) {
|
|
856
|
+
if (!original?.actions) {
|
|
857
|
+
return;
|
|
858
|
+
}
|
|
859
|
+
// 1) remove ONLY the review action (approved/rejected)
|
|
860
|
+
original.actions = original.actions.filter((a) => a.actionType !== 'review');
|
|
861
|
+
// after this, example becomes:
|
|
862
|
+
// [ { actionType: 'tagging', action: 'submitted' } ]
|
|
863
|
+
// 2) remove from selected list if present
|
|
864
|
+
const tempId = original.tempId;
|
|
865
|
+
const arr = this.selectedByType[type] || [];
|
|
866
|
+
const index = arr.indexOf(tempId);
|
|
867
|
+
if (index > -1) {
|
|
868
|
+
arr.splice(index, 1);
|
|
869
|
+
}
|
|
870
|
+
// 3) uncheck "select all" for that type
|
|
871
|
+
this.selectAllByType[type] = false;
|
|
872
|
+
}
|
|
873
|
+
viewMode = 'tagging';
|
|
874
|
+
getAction(original, type) {
|
|
875
|
+
return original?.actions?.find((a) => a.actionType === type) || null;
|
|
876
|
+
}
|
|
877
|
+
getInitialsFromEmail(email) {
|
|
878
|
+
if (!email)
|
|
879
|
+
return '';
|
|
880
|
+
// take text before @
|
|
881
|
+
const namePart = email.split('@')[0];
|
|
882
|
+
// split by . or space (e.g. "sandeep.pal" -> ["sandeep", "pal"])
|
|
883
|
+
const parts = namePart.split(/[.\s_-]+/).filter(Boolean);
|
|
884
|
+
if (parts.length >= 2) {
|
|
885
|
+
return (parts[0][0] + parts[1][0]).toUpperCase(); // S + P = SP
|
|
886
|
+
}
|
|
887
|
+
// fallback: first two chars of whole namePart
|
|
888
|
+
return namePart.substring(0, 2).toUpperCase();
|
|
889
|
+
}
|
|
890
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TicketFootfallNewComponent, deps: [{ token: i1.NgbModal }, { token: i2.GlobalStateService }, { token: i3.TicketService }, { token: i0.ChangeDetectorRef }, { token: i4.ExcelService }, { token: i5.ToastService }, { token: i6.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
891
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TicketFootfallNewComponent, selector: "lib-ticket-footfall-new", outputs: { filterChange: "filterChange" }, viewQueries: [{ propertyName: "zoomPopup", first: true, predicate: ["zoomPopup"], descendants: true }], ngImport: i0, template: "<section *ngIf=\"select ==='ticketList'\">\r\n <div class=\"row ms-3 my-3\">\r\n <!-- <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link cursor-pointer no-border me-3\">\r\n Tickets\r\n </a>\r\n \r\n </li>\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link cursor-pointer no-border me-3\"> Internal audit\r\n </a>\r\n </li>\r\n </ul> -->\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-9 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title my-0\">{{ getFootfallSummaryData?.totalTickets !== null ?\r\n getFootfallSummaryData?.totalTickets : '--' }}</h5>\r\n <span class=\"sub-header\">Total tickets</span>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title my-0\">{{ getFootfallSummaryData?.averageAccuracyOverAll !== null ?\r\n getFootfallSummaryData?.averageAccuracyOverAll + '%' : '--' }}</h5>\r\n <span class=\"sub-header\">Average accuracy (Overall)</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openTickets !== null ?\r\n getFootfallSummaryData?.openTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open</span>\r\n </div>\r\n <div class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openInfraIssues !== null ?\r\n getFootfallSummaryData?.openInfraIssues : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open-Infra Issue</span>\r\n </div>\r\n <div class=\"col my-3 ps-20\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.inprogress !== null ?\r\n getFootfallSummaryData?.inprogress : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">In-progress</span>\r\n </div>\r\n <div class=\"col my-3 text-end\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.closedTickets !== null ?\r\n getFootfallSummaryData?.closedTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Closed</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-3 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 py-1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title mt-0\">{{ getFootfallSummaryData?.ticketAccuracyAbove !== null ?\r\n getFootfallSummaryData?.ticketAccuracyAbove : '--' }}</h5>\r\n <div class=\"sub-header\">Tickets with Accuracy Above 85%</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 col-xl-12 col-md-12 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.ticketAccuracyBelow !== null ?\r\n getFootfallSummaryData?.ticketAccuracyBelow : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Tickets with Accuracy Below 85%</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Showing tickets with Accuracy Below 85% <span\r\n class=\"ms-2 px-3 badge badge-light-primary\">{{totalItems}} Total</span></span>\r\n <span class=\"text-sub mb-2\">Based on {{headerFilters?.date?.startDate | date:'dd MMM, yyyy'}} \u2013 {{headerFilters?.date?.endDate | date:'dd MMM, yyyy'}} </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control ps-14 me-2\" placeholder=\"Search by store\"\r\n autocomplete=\"off\" (change)=\"searchData()\" [(ngModel)]=\"searchValue\" />\r\n\r\n <button type=\"button\" (click)=\"exportXLSX()\"\r\n class=\"btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">Export</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table bottom-border text-nowrap \">\r\n <thead>\r\n <tr>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('storeName')\">Store (200)<svg\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'storeName' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <!-- <th class=\"cursor-pointer\" (click)=\"onSort('ticketId')\">Ticket ID<svg\r\n [ngClass]=\"sortedColumn === 'ticketId' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'ticketId' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th> -->\r\n <th class=\"cursor-pointer\" (click)=\"onSort('createdAt')\">Ticket raised on\r\n <svg [ngClass]=\"sortedColumn === 'createdAt' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'createdAt' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('dateString')\">Issue Date\r\n <svg [ngClass]=\"sortedColumn === 'dateString' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'dateString' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('type')\">Ticket type\r\n <svg [ngClass]=\"sortedColumn === 'type' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'type' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('footfallCount')\">Actual FF\r\n <svg [ngClass]=\"sortedColumn === 'footfallCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'footfallCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('duplicateCount')\">Store (%)\r\n <svg [ngClass]=\"sortedColumn === 'duplicateCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'duplicateCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('employeeCount')\">Reviewer (%)\r\n <svg [ngClass]=\"sortedColumn === 'employeeCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'employeeCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('junkCount')\">Approver (%)\r\n <svg [ngClass]=\"sortedColumn === 'junkCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'junkCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('houseKeepingCount')\">Tango (%)\r\n <svg [ngClass]=\"sortedColumn === 'houseKeepingCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'houseKeepingCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n\r\n <th class=\"cursor-pointer\" (click)=\"onSort('status')\">Status<svg\r\n [ngClass]=\"sortedColumn === 'status' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'status' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <!-- <th >Actions</th> -->\r\n <th>Comments</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let obj of footfallListData\">\r\n <td>\r\n <div class=\"text-primary ellipsis-underline\" (click)=\"ticketView(obj)\">\r\n {{ obj?.ticketId }}\r\n </div>\r\n\r\n <div class=\"pt-2\">{{ obj?.storeName }}</div>\r\n </td>\r\n <td class=\"pt-7\">{{obj?.ticketRaised | date:'dd MMM, yyyy'}}</td>\r\n <td class=\"pt-7\">{{obj?.issueDate | date:'dd MMM, yyyy'}}</td>\r\n <td class=\"pt-7\">{{obj?.type ? obj?.type: '-'}}</td>\r\n <td class=\"pt-7\">{{obj?.footfall ?? '-'}}</td>\r\n <td class=\"pt-7\">{{obj?.storeRevisedAccuracy ? obj?.storeRevisedAccuracy:'-'}}</td>\r\n <td class=\"pt-7\">{{obj?.reviewerRevisedAccuracy ? obj?.reviewerRevisedAccuracy:'-'}}</td>\r\n <td class=\"pt-7\">{{obj?.approverRevisedAccuracy ? obj?.approverRevisedAccuracy:'-'}}</td>\r\n <td class=\"pt-7\">{{obj?.tangoRevisedAccuracy ? obj?.tangoRevisedAccuracy:'-'}}</td>\r\n <td class=\"pt-7\">\r\n <span *ngIf=\"obj?.status ==='Open'\" class=\"badge badge-light-primary mx-2\">Open\r\n </span>\r\n <span *ngIf=\"obj?.status ==='Closed'\" class=\"badge badge-light-default mx-2\">Closed\r\n </span>\r\n <span *ngIf=\"obj?.status !=='Closed' && obj?.status !=='Open'\"\r\n class=\"badge badge-light-warning mx-2\">\r\n {{obj?.status}}</span>\r\n </td>\r\n <td class=\"pt-7\">{{obj?.comments ? obj?.comments:'--' }}</td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div *ngIf=\"!loading && !noData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"setpageSize()\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n<!-- -->\r\n<section *ngIf=\"select ==='ticketMethod'\">\r\n <div class=\"row my-2\">\r\n <div class=\"position-relative\" [ngClass]=\"isCollapsed ? 'd-none' : 'col-md-3 h-auto'\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-header border-0 pt-3 px-5\">\r\n <span class=\"ms-2 cursor-pointer\" (click)=\"backToNavigation()\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"44\" viewBox=\"0 0 56 44\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_887_4505)\">\r\n <rect x=\"2\" y=\"1\" width=\"52\" height=\"40\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"51\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M30.5 26L25.5 21L30.5 16\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_887_4505\" x=\"0\" y=\"0\" width=\"56\" height=\"44\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_887_4505\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_887_4505\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg><span class=\"card-title-foot pt-15 ms-3\">Tickets</span></span>\r\n <span class=\"cursor-pointer\" (click)=\"toggleSidebar()\"\r\n style=\"position: absolute; top: 15px; right: -25px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"68\" height=\"68\" viewBox=\"0 0 68 68\" fill=\"none\">\r\n <g filter=\"url(#filter0_dd_778_34282)\">\r\n <rect x=\"12\" width=\"44\" height=\"44\" rx=\"22\" fill=\"white\" />\r\n <path d=\"M33 27L28 22L33 17M40 27L35 22L40 17\" stroke=\"#101828\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_dd_778_34282\" x=\"0\" y=\"0\" width=\"68\" height=\"68\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feMorphology radius=\"2\" operator=\"erode\" in=\"SourceAlpha\"\r\n result=\"effect1_dropShadow_778_34282\" />\r\n <feOffset dy=\"4\" />\r\n <feGaussianBlur stdDeviation=\"3\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.03 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_778_34282\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feMorphology radius=\"4\" operator=\"erode\" in=\"SourceAlpha\"\r\n result=\"effect2_dropShadow_778_34282\" />\r\n <feOffset dy=\"12\" />\r\n <feGaussianBlur stdDeviation=\"8\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.08 0\" />\r\n <feBlend mode=\"normal\" in2=\"effect1_dropShadow_778_34282\"\r\n result=\"effect2_dropShadow_778_34282\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_778_34282\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"p-4 w-100 overflow-auto\">\r\n <div class=\"row my-1\">\r\n <div class=\"col-8\">\r\n\r\n <span class=\"svg-icon svg-icon-1 position-absolute py-2 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input class=\"form-control form-control-sm mb-2 ps-14 pe-2 w-100\" type=\"text\"\r\n placeholder=\"Search\" [(ngModel)]=\"StoresSearchValue\" (change)=\"searchStoresData()\" />\r\n </div>\r\n <div class=\"col-4 p-0 btn\">\r\n <button class=\"btn-filter btn btn-sm btn-outline\" (click)=\"toggleFilter()\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n Filter\r\n </button>\r\n\r\n <!-- Overlay (click outside to close) -->\r\n <div class=\"overlay\" *ngIf=\"isFilterOpen\" (click)=\"close()\"></div>\r\n\r\n <form [formGroup]=\"filterForm\">\r\n <!-- Filter card -->\r\n <div class=\"filter-card text-start\" *ngIf=\"isFilterOpen\"\r\n (click)=\"$event.stopPropagation()\">\r\n <h3 class=\"mb-3\">Filter Options</h3>\r\n\r\n <!-- Status -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label mb-1\">Status</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"status\">\r\n <option value=\"\">Select</option>\r\n <option>Open</option>\r\n <option>In-Progress</option>\r\n <option>Close</option>\r\n <option>Under tange review</option>\r\n <option>Tange review done</option>\r\n <option>Expired</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Reviewer accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n <!-- TODO: same block for Approver & Tango -->\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Approver accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Tango accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\"\r\n (click)=\"resetFilter()\">Reset</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\"\r\n (click)=\"applyFilter()\">Apply</button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n </div>\r\n </div>\r\n\r\n<div *ngIf=\"openTicketsList.length\" class=\"mb-2 border-selectall\">\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n\r\n <!-- LEFT: checkbox + text -->\r\n <div class=\"d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"me-2\"\r\n [checked]=\"allSelected\"\r\n (change)=\"toggleSelectAll()\" />\r\n <label class=\"m-0 font-semibold\">\r\n Select all {{ storeCount }} stores\r\n </label>\r\n </div>\r\n\r\n <!-- RIGHT: Reviewer(%) + optional sort icon -->\r\n <div class=\"d-flex align-items-center reviewer-label\">\r\n <span class=\"me-1\">Reviewer(%)</span>\r\n <!-- if you want arrow icon -->\r\n <span class=\"sort-arrow cursor-pointer\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n<path d=\"M6.83464 1L6.83463 12.6667M6.83463 12.6667L12.668 6.83333M6.83463 12.6667L1.0013 6.83333\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n <!-- or use an <i> from font-awesome/bootstrap icon instead -->\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n<ul class=\"list-unstyled ps-0\">\r\n<li *ngFor=\"let store of openTicketsList\"\r\n class=\"mb-2\"\r\n [ngClass]=\"{ 'store-item-active': isSelected(store), 'store-item': true }\">\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n <!-- LEFT: checkbox + text -->\r\n <div class=\"d-flex align-items-start\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"me-2 my-3\"\r\n [checked]=\"isSelected(store)\"\r\n (change)=\"toggleStoreSelection(store)\" />\r\n\r\n <div class=\"store-text ms-1\">\r\n <div class=\"ticket-id\" [ngClass]=\"{ 'active-text': isSelected(store) }\">\r\n {{ store?.ticketId }}\r\n </div>\r\n <div class=\"store-name mt-1\">\r\n {{ store?.storeName }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT: pill badge -->\r\n <span\r\n class=\"ms-2 px-3 py-1 rounded-pill d-inline-flex align-items-center justify-content-center perc-badge\"\r\n [ngClass]=\"{\r\n 'perc-badge-active': isSelected(store),\r\n 'perc-badge-normal': !isSelected(store)\r\n }\">\r\n {{ store?.revicedPerc }}\r\n </span>\r\n </div>\r\n</li>\r\n\r\n</ul>\r\n\r\n\r\n\r\n <div *ngIf=\"!openTicketsList.length\" class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n\r\n <div class=\"card-body mx-0 d-flex justify-content-center align-items-center flex-column \"\r\n style=\"margin: 64px;border-radius: 8px;\r\n background: var(--Gray-50, #F9FAFB);\">\r\n <svg class=\"my-5\" xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\"\r\n viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\"\r\n stroke-width=\"13.3333\" />\r\n <g clip-path=\"url(#clip0_730_75095)\">\r\n <path\r\n d=\"M55.3327 62V58.6667C55.3327 56.8986 54.6303 55.2029 53.3801 53.9526C52.1298 52.7024 50.4341 52 48.666 52H35.3327C33.5646 52 31.8689 52.7024 30.6186 53.9526C29.3684 55.2029 28.666 56.8986 28.666 58.6667V62M65.3327 62V58.6667C65.3316 57.1895 64.8399 55.7546 63.935 54.5872C63.03 53.4198 61.7629 52.5859 60.3327 52.2167M53.666 32.2167C55.1 32.5838 56.3711 33.4178 57.2787 34.5872C58.1864 35.7565 58.6791 37.1947 58.6791 38.675C58.6791 40.1553 58.1864 41.5935 57.2787 42.7628C56.3711 43.9322 55.1 44.7662 53.666 45.1333M48.666 38.6667C48.666 42.3486 45.6812 45.3333 41.9993 45.3333C38.3174 45.3333 35.3327 42.3486 35.3327 38.6667C35.3327 34.9848 38.3174 32 41.9993 32C45.6812 32 48.666 34.9848 48.666 38.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"4\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_75095\">\r\n <rect width=\"40\" height=\"40\" fill=\"white\" transform=\"translate(27 27)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <div class=\"nodata-title my-3\">No Stores Found</div>\r\n <div class=\"nodata-sub mb-3\">Looks like there is no stores </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div [ngClass]=\"isCollapsed ? 'col-12' : 'col-md-9'\">\r\n <div class=\"card bg-light-primary p-1 h-100\">\r\n <div class=\"card-header border-0 pt-3 px-5\">\r\n <div class=\"d-flex justify-content-start\">\r\n <div *ngIf=\"isCollapsed\" class=\"cursor-pointer\"><span (click)=\"toggleSidebar()\"\r\n style=\"position: absolute; top: 10px; left: 10px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"\r\n fill=\"none\">\r\n <path d=\"M22.5 25L17.5 20L22.5 15\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> </span>\r\n <span class=\"card-title-foot ms-15\">Footfall Directory</span>\r\n </div>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <span *ngIf=\"ticketData.status === 'raised'\">\r\n\r\n <button *ngIf=\"!closeBtn\" class=\"btn btn-sm btn-primary mx-2\" (click)=\"startReview()\">Start\r\n Review</button>\r\n <button *ngIf=\"closeBtn\" disabled class=\"btn btn-sm btn-primary mx-2\" (click)=\"stopReview()\">Close\r\n Ticket</button>\r\n </span>\r\n <span *ngIf=\"ticketData.status !== 'raised'\"><button class=\"btn btn-sm btn-primary mx-2\" (click)=\"startAudit()\">Start\r\n Audit</button></span>\r\n <span>\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5C11 5.55228 11.4477 6 12 6Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-4 \">\r\n <div class=\"row mb-6\">\r\n\r\n <div class=\"col-2 card-title-label my-2\">Store Name</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{ticketData?.storeName}}</div>\r\n <div class=\"col-2 card-title-label my-2\">Ticket ID</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{ticketData?.ticketId}}</div>\r\n <div class=\"col-2 card-title-label my-2\">Status</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n \r\n <div class=\"col-3 my-2\"><span class=\"badge\" [ngClass]=\"{\r\n 'badge-light-primary': ticketData.status === 'open',\r\n 'badge-secondary': ticketData.status === 'closed',\r\n 'badge-light-warning': ticketData.status === 'pending' || ticketData.status === 'Reviewer-Closed',\r\n 'badge-light-danger': ticketData.status === 'rejected',\r\n 'badge-light-info': ticketData.status === 'raised', \r\n\r\n }\"> {{ ticketData.status ? (ticketData.status | titlecase) : '-' }}\r\n </span></div>\r\n\r\n <div class=\"col-2 card-title-label my-2\">Due Date</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">04 Dec 2025</div>\r\n </div>\r\n\r\n <!-- <div class=\"border-primary-layers my-3 h-100px\">\r\n\r\n <div class=\"label-title w-175px p-4 mb-2\">Tango response</div>\r\n <div class=\"label-desc ps-4\"><span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M12 16V12M12 8H12.01M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\"\r\n stroke=\"#008EDF\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>Tango audit completed \u2014 found 3% discrepancies difference between Tango and\r\n revisions.</div>\r\n\r\n </div> -->\r\n <div class=\"card-layer\">\r\n <div class=\"d-flex justify-content-between align-items-start w-100\">\r\n\r\n <!-- LEFT SIDE -->\r\n <h3 class=\"card-title align-items-start flex-column mb-0\">\r\n <div class=\"card-label\">Ticket Status</div>\r\n <div class=\"text-sub mb-2\">Logs for each revision of the ticket.</div>\r\n </h3>\r\n\r\n <!-- RIGHT SIDE -->\r\n <div class=\"cursor-pointer\">\r\n <span *ngIf=\"arrowshow\" (click)=\"openArrow()\"> <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\"\r\n height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_486_91902)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M15 16.5L20 21.5L25 16.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_486_91902\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_486_91902\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_486_91902\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span>\r\n <span *ngIf=\"!arrowshow\" (click)=\"closeArrow()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"\r\n fill=\"none\">\r\n <g filter=\"url(#filter0_d_486_91893)\">\r\n <rect x=\"38\" y=\"37\" width=\"36\" height=\"36\" rx=\"8\"\r\n transform=\"rotate(180 38 37)\" fill=\"white\" />\r\n <rect x=\"37.5\" y=\"36.5\" width=\"35\" height=\"35\" rx=\"7.5\"\r\n transform=\"rotate(180 37.5 36.5)\" stroke=\"#D0D5DD\" />\r\n <path d=\"M25 21.5L20 16.5L15 21.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_486_91893\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_486_91893\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_486_91893\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n </div>\r\n\r\n \r\n <section *ngIf=\"!arrowshow\">\r\n\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n \r\n <div *ngIf=\"ticket?._source as source\" class=\"ticket-container\">\r\n \r\n <!-- Actual Footfall Header -->\r\n <div class=\"ticket-header\">\r\n <div class=\"footfall-value\">{{source?.footfallCount}} <span class=\"footfall-label ms-3\">Actual Footfall</span>\r\n </div>\r\n <div class=\"issue-date\">Issue date : {{source?.createdAt | date:'dd MMM yyyy'}}</div>\r\n </div>\r\n \r\n <!-- Timeline Line -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n \r\n <!-- When ticket is CLOSED, skip the tagging row -->\r\n <ng-container *ngIf=\"mapping?.status !== 'closed' || mapping?.type !== 'tagging'\">\r\n \r\n <div *ngIf=\"mapping?.type === 'tagging' || mapping?.type === 'review'\" class=\"timeline\"></div>\r\n <div *ngIf=\"mapping?.type === 'tagging' || mapping?.type === 'review'\" class=\"user-info ms-4\">\r\n\r\n <div\r\n class=\"avatar avatar-text light-primary p-3\"\r\n \r\n >\r\n {{ getInitialsFromEmail(mapping?.createdByEmail || source?.createdByEmail) }}\r\n </div>\r\n\r\n <div>\r\n <div class=\"user-name\">\r\n <span *ngIf=\"mapping?.type === 'tagging'\">\r\n Ticket created by\r\n </span>\r\n <span *ngIf=\"mapping?.type === 'review'\">\r\n Reviewed by\r\n </span>\r\n\r\n \r\n </div>\r\n\r\n <div class=\"user-email\">\r\n {{ mapping?.createdByEmail || source?.createdByEmail }} \u2022\r\n {{ (mapping?.createdAt || source?.createdAt) | date:'HH:mm:ss \u2013 dd MMM yyyy' }}\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n\r\n <div class=\"timeline\"></div>\r\n\r\n <!-- Show revision card only when NOT closed & type is tagging -->\r\n <div class=\"revision-card\"\r\n *ngIf=\"mapping?.type === 'tagging' || mapping?.type === 'review'\">\r\n <div class=\"values-row\">\r\n <div class=\"value-block\">\r\n <div class=\"value\">\r\n {{ mapping?.revicedFootfall === null ? '--' : mapping?.revicedFootfall }}\r\n </div>\r\n <div class=\"label fw-bold\">Revised Footfall</div>\r\n </div>\r\n\r\n <div class=\"value-block\">\r\n <div class=\"value accuracy down\">\r\n {{ mapping?.revicedPerc || source?.revicedPerc || '--' }}\r\n <span class=\"ms-1\">\r\n <!-- arrow svg -->\r\n </span>\r\n </div>\r\n <div class=\"label fw-bold pt-1\">Accuracy</div>\r\n </div>\r\n\r\n <div class=\"timeline-new my-2\"></div>\r\n\r\n <div class=\"value-block\" *ngFor=\"let item of mapping?.count\">\r\n <div class=\"value\">\r\n {{ item?.value ?? '--' }}\r\n </div>\r\n <div class=\"label\">\r\n {{ item?.name }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n <div class=\"timeline\"></div>\r\n \r\n <!-- <div class=\"timeline\"></div> -->\r\n <!-- Tango by row -->\r\n <!-- <div class=\"user-info ms-4 d-flex align-items-center mb-2\">\r\n <img src=\"assets/user2.png\" class=\"avatar me-2\" />\r\n <div>\r\n <div class=\"user-name\">Tango by</div>\r\n <div class=\"user-email\">\r\n orlandolenskart.com \u2022 10:53:34 AM \u2013 20 Jan 2025\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"timeline\"></div> -->\r\n \r\n <!-- MAIN CARD -->\r\n <!-- <div class=\"revision-card px-0\">\r\n \r\n <div class=\"values-row d-flex align-items-stretch px-5\">\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value\">89</div>\r\n <div class=\"label fw-bold\">Revised Footfall</div>\r\n </div>\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value accuracy up\">\r\n 89%\r\n <span class=\"ms-1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M7.9987 12.6666L7.9987 3.33329M7.9987 3.33329L12.6654 7.99996M7.9987 3.33329L3.33203 7.99996\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"label fw-bold\">Accuracy</div>\r\n </div>\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value\">10</div>\r\n <div class=\"label\">Duplicates</div>\r\n </div>\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value\">3</div>\r\n <div class=\"label\">Employee/Staff</div>\r\n </div>\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value\">2</div>\r\n <div class=\"label\">Junk</div>\r\n </div>\r\n \r\n <div class=\"value-block\">\r\n <div class=\"value\">1</div>\r\n <div class=\"label\">House Keeping</div>\r\n </div>\r\n \r\n </div>\r\n \r\n <div class=\"card-footer py-1 bg-light-primary\">\r\n \r\n <div class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"showRevisedDetails = !showRevisedDetails\">\r\n <span class=\"text-primary \">\r\n {{ showRevisedDetails ? 'Hide details' : 'Show in details' }}\r\n </span>\r\n <span class=\"chevron ms-3\" [class.rotate-180]=\"showRevisedDetails\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M18 9L12 15L6 9\" stroke=\"#101828\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n </div>\r\n \r\n \r\n <div class=\"details-body mt-2\" *ngIf=\"showRevisedDetails\">\r\n \r\n \r\n <div class=\"small text-muted\">\r\n \r\n Detailed breakdown of revised footfall goes here\u2026\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </section>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6 position-relative\">\r\n <div *ngIf=\"isCheckboxEnable\" class=\"pb-3 my-3 h-100 rounded-3 position-relative\">\r\n\r\n <input type=\"checkbox\" class=\"position-absolute absolute1 form-check-input\"\r\n (change)=\"overallSelect($event)\" /><span class=\"ms-12\"> Select\r\n All</span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"col-md-6 pe-8\">\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <select class=\"form-select\" aria-placeholder=\"show all\">\r\n <option value=\"all\">Show all</option>\r\n <option value=\"accept\">Accept</option>\r\n <option value=\"reject\">Reject</option>\r\n <option value=\"pending\">Pending</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\" (click)=\"popupOpen('rejected')\">Reject</button>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\"\r\n (click)=\"popupOpen('approved')\">Accept</button>\r\n </div>\r\n <!-- <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\" (click)=\"popupOpen('rejected')\">Deny</button>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\"\r\n (click)=\"popupOpen('approved')\">Approve</button>\r\n </div> -->\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"bg-white\">\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-5\">\r\n\r\n <div *ngIf=\"hasRevopsType('duplicates')\" class=\"layers\">\r\n <!-- Header Section -->\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <h3 class=\"text-lg font-semibold mb-4\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n Duplicates\r\n </h3>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <ng-container *ngIf=\"mapping?.type ===viewMode\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.isParent && original?.revopsType ==='duplicate'\"\r\n class=\"card-body bg-white layers py-5 px-0 m-3\">\r\n <div class=\"my-4\">\r\n <!-- Original Image -->\r\n <div class=\"duplicate-head px-5 my-3\">Original image\r\n </div>\r\n <div class=\"row px-5\">\r\n <div class=\"col-md-4 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"separator separator-dashed mt-3 mb-5\"></div>\r\n <div class=\"row px-5\">\r\n <h5 class=\"duplicate-head my-3 fs-6\">Tagged Duplicates</h5>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"my-3\">\r\n <input type=\"checkbox\"\r\n [checked]=\"areAllDuplicatesSelected(original)\"\r\n (change)=\"onToggleSelectAllDuplicates(original, $event)\" />\r\n <label class=\"ms-2\">Select All</label>\r\n </div>\r\n <div *ngFor=\"let duplicate of original?.duplicateImage; let i = index\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div\r\n class=\"pb-3 h-100 rounded-3 position-relative\"\r\n [ngClass]=\"{\r\n 'layer-approved': isApproved(original),\r\n 'layer-rejected': isRejected(original),\r\n 'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n <!-- Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n <input type=\"checkbox\" *ngIf=\"!isApproved(original) && !isRejected(original)\"\r\n style=\"right: 5px ; margin: 10px 5px 4px !important;\"\r\n [checked]=\"isDuplicateSelected(original.tempId, duplicate.tempId)\"\r\n (change)=\"onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)\"\r\n class=\"position-absolute form-check-input duplicate-checkbox\" />\r\n <span \r\n class=\"position-absolute absolute\"\r\n *ngIf=\"isApproved(original) || isRejected(original)\"\r\n (click)=\"resetCheckbox('employee', original)\" >\r\n\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\">\r\n<g filter=\"url(#filter0_d_2023_13718)\">\r\n<rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\" fill=\"white\"/>\r\n<rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\"/>\r\n<path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\" stroke-width=\"0.927778\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feOffset dy=\"0.555556\"/>\r\n<feGaussianBlur stdDeviation=\"0.555556\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2023_13718\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_2023_13718\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n </div>\r\n <!-- (change)=\"onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')\" -->\r\n <!-- Duplicate Image -->\r\n <img [src]=\"imageUrl + duplicate.filePath\" alt=\"\"\r\n class=\"w-100 rounded border duplicate-image\" />\r\n\r\n <!-- Duplicate Info -->\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ duplicate.tempId }}\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(duplicate.entryTime) }}</div>\r\n\r\n <!-- Duplicate Reason -->\r\n <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ duplicate.reason }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Status Icons -->\r\n \r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n <div *ngFor=\"let c of comments\" class=\"comment-thread d-flex mb-4\">\r\n <!-- avatar -->\r\n <img class=\"comment-avatar me-3\" [src]=\"c.avatar\" alt=\"avatar\" />\r\n\r\n <!-- content -->\r\n <div>\r\n <div class=\"fw-semibold\">{{ c.email }}</div>\r\n <div class=\"text-muted small\">\r\n {{ c.time | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional main line -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.mainText\">\r\n {{ c.mainText }}\r\n </p>\r\n\r\n <!-- Marked as \u201C\u2026\u201D line -->\r\n <p class=\"mb-1\" *ngIf=\"c.statusLabel\">\r\n Marked as\r\n <span [ngClass]=\"'text-' + c.statusType\">\r\n \u201C{{ c.statusLabel }}\u201D\r\n </span>\r\n </p>\r\n\r\n <!-- note -->\r\n <p class=\"mb-2\" *ngIf=\"c.note\">\r\n {{ c.note }}\r\n </p>\r\n\r\n <!-- image cards -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div *ngFor=\"let img of c.images\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + img.url + ')'\"></div>\r\n\r\n <div class=\"tango-meta\">\r\n <div class=\"small\">Tango ID: {{ img.tangoId }}\r\n <span *ngIf=\"img.status === 'approve'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"img.status === 'reject'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"small text-muted\">Entry time: {{\r\n img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- +N more card -->\r\n <div *ngIf=\"c.moreCount > 0\"\r\n class=\"tango-card more-card d-flex align-items-center justify-content-center\">\r\n +{{ c.moreCount }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- \r\n <div *ngIf=\"source?.duplicateImages?.length\" class=\"my-7 d-flex justify-content-end\"\r\n role=\"group\">\r\n <button [disabled]=\"!duplicateACCount\" class=\"btn btn-outline me-1\"\r\n (click)=\"popupOpen('rejected','duplicate')\">Reject</button>\r\n <button [disabled]=\"!duplicateACCount\" class=\"btn btn-primary ms-1\"\r\n (click)=\"popupOpen('approved','duplicate')\">Approve</button>\r\n </div> -->\r\n <!-- <div *ngIf=\"source?.duplicateImages?.length\" class=\"separator separator-dashed mt-3 mb-5\"></div> -->\r\n\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType('employee')\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\">\r\n <!-- icon here -->\r\n Employee/Staff\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType.employee\"\r\n (change)=\"onSelectAll('employee', $event)\">\r\n <label>Select All</label>\r\n </div>\r\n\r\n <!-- loop over tickets -->\r\n\r\n\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <div *ngIf=\"mapping?.type === viewMode\" class=\"card-body bg-white layers p-5 m-3\"\r\n>\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n\r\n <div *ngIf=\"original?.revopsType === 'employee'\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n\r\n <div\r\n class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n 'layer-approved': isApproved(original),\r\n 'layer-rejected': isRejected(original),\r\n 'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n<div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isApproved(original) && !isRejected(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"selectedByType.employee.includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange('employee', original.tempId)\" />\r\n <span \r\n class=\"position-absolute absolute\"\r\n *ngIf=\"isApproved(original) || isRejected(original)\"\r\n (click)=\"resetCheckbox('employee', original)\" >\r\n\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\">\r\n<g filter=\"url(#filter0_d_2023_13718)\">\r\n<rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\" fill=\"white\"/>\r\n<rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\"/>\r\n<path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\" stroke-width=\"0.927778\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feOffset dy=\"0.555556\"/>\r\n<feGaussianBlur stdDeviation=\"0.555556\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2023_13718\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_2023_13718\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n\r\n</div>\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ original.tempId }}\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">\r\n Entry Time: {{ getFormattedEntryTime(original?.entryTime) }}\r\n </div>\r\n </div>\r\n \r\n</div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n <div *ngFor=\"let c of comments\" class=\"comment-thread d-flex mb-4\">\r\n <!-- avatar -->\r\n <img class=\"comment-avatar me-3\" [src]=\"c.avatar\" alt=\"avatar\" />\r\n\r\n <!-- content -->\r\n <div>\r\n <div class=\"fw-semibold\">{{ c.email }}</div>\r\n <div class=\"text-muted small\">\r\n {{ c.time | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional main line -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.mainText\">\r\n {{ c.mainText }}\r\n </p>\r\n\r\n <!-- Marked as \u201C\u2026\u201D line -->\r\n <p class=\"mb-1\" *ngIf=\"c.statusLabel\">\r\n Marked as\r\n <span [ngClass]=\"'text-' + c.statusType\">\r\n \u201C{{ c.statusLabel }}\u201D\r\n </span>\r\n </p>\r\n\r\n <!-- note -->\r\n <p class=\"mb-2\" *ngIf=\"c.note\">\r\n {{ c.note }}\r\n </p>\r\n\r\n <!-- image cards -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div *ngFor=\"let img of c.images\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + img.url + ')'\"></div>\r\n\r\n <div class=\"tango-meta\">\r\n <div class=\"small\">Tango ID: {{ img.tangoId }}\r\n <span *ngIf=\"img.status === 'approve'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"img.status === 'reject'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"small text-muted\">Entry time: {{\r\n img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- +N more card -->\r\n <div *ngIf=\"c.moreCount > 0\"\r\n class=\"tango-card more-card d-flex align-items-center justify-content-center\">\r\n +{{ c.moreCount }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType('houseKeeping')\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> House Keeping\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType.houseKeeping\"\r\n (change)=\"onSelectAll('houseKeeping',$event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.revopsType ==='houseKeeping'\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div\r\n class=\"pb-3 h-100 rounded-3 position-relative\"\r\n [ngClass]=\"{\r\n 'layer-approved': isApproved(original),\r\n 'layer-rejected': isRejected(original),\r\n 'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n \r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isApproved(original) && !isRejected(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"selectedByType.houseKeeping.includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange('houseKeeping', original.tempId)\" />\r\n <span \r\n class=\"position-absolute absolute\"\r\n *ngIf=\"isApproved(original) || isRejected(original)\"\r\n (click)=\"resetCheckbox('employee', original)\" >\r\n\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\">\r\n<g filter=\"url(#filter0_d_2023_13718)\">\r\n<rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\" fill=\"white\"/>\r\n<rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\"/>\r\n<path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\" stroke-width=\"0.927778\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feOffset dy=\"0.555556\"/>\r\n<feGaussianBlur stdDeviation=\"0.555556\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2023_13718\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_2023_13718\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n </div>\r\n\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{ original.tempId\r\n }}\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n <div *ngFor=\"let c of comments\" class=\"comment-thread d-flex mb-4\">\r\n <!-- avatar -->\r\n <img class=\"comment-avatar me-3\" [src]=\"c.avatar\" alt=\"avatar\" />\r\n\r\n <!-- content -->\r\n <div>\r\n <div class=\"fw-semibold\">{{ c.email }}</div>\r\n <div class=\"text-muted small\">\r\n {{ c.time | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional main line -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.mainText\">\r\n {{ c.mainText }}\r\n </p>\r\n\r\n <!-- Marked as \u201C\u2026\u201D line -->\r\n <p class=\"mb-1\" *ngIf=\"c.statusLabel\">\r\n Marked as\r\n <span [ngClass]=\"'text-' + c.statusType\">\r\n \u201C{{ c.statusLabel }}\u201D\r\n </span>\r\n </p>\r\n\r\n <!-- note -->\r\n <p class=\"mb-2\" *ngIf=\"c.note\">\r\n {{ c.note }}\r\n </p>\r\n\r\n <!-- image cards -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div *ngFor=\"let img of c.images\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + img.url + ')'\"></div>\r\n\r\n <div class=\"tango-meta\">\r\n <div class=\"small\">Tango ID: {{ img.tangoId }}\r\n <span *ngIf=\"img.status === 'approve'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"img.status === 'reject'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"small text-muted\">Entry time: {{\r\n img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- +N more card -->\r\n <div *ngIf=\"c.moreCount > 0\"\r\n class=\"tango-card more-card d-flex align-items-center justify-content-center\">\r\n +{{ c.moreCount }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType('junk')\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> Junk\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType.junk\"\r\n (change)=\"onSelectAll('junk',$event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n\r\n <!-- One card for all junk images in this mapping -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <!-- Loop through all items in revisedDetail -->\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n\r\n <!-- Show only junk items as columns -->\r\n <div *ngIf=\"original?.revopsType === 'junk'\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n\r\n <div\r\n class=\"pb-3 h-100 rounded-3 position-relative\"\r\n [ngClass]=\"{\r\n 'layer-approved': isApproved(original),\r\n 'layer-rejected': isRejected(original),\r\n 'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n \r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isApproved(original) && !isRejected(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"selectedByType.junk.includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange('junk', original.tempId)\" />\r\n <span \r\n class=\"position-absolute absolute\"\r\n *ngIf=\"isApproved(original) || isRejected(original)\"\r\n (click)=\"resetCheckbox('employee', original)\" >\r\n\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\">\r\n<g filter=\"url(#filter0_d_2023_13718)\">\r\n<rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\" fill=\"white\"/>\r\n<rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\"/>\r\n<path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\" stroke-width=\"0.927778\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feOffset dy=\"0.555556\"/>\r\n<feGaussianBlur stdDeviation=\"0.555556\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2023_13718\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_2023_13718\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n </div>\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ original.tempId }}\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'rejected'\r\n \"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">\r\n Entry Time: {{ getFormattedEntryTime(original?.entryTime) }}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n <div *ngFor=\"let c of comments\" class=\"comment-thread d-flex mb-4\">\r\n <!-- avatar -->\r\n <img class=\"comment-avatar me-3\" [src]=\"c.avatar\" alt=\"avatar\" />\r\n\r\n <!-- content -->\r\n <div>\r\n <div class=\"fw-semibold\">{{ c.email }}</div>\r\n <div class=\"text-muted small\">\r\n {{ c.time | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional main line -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.mainText\">\r\n {{ c.mainText }}\r\n </p>\r\n\r\n <!-- Marked as \u201C\u2026\u201D line -->\r\n <p class=\"mb-1\" *ngIf=\"c.statusLabel\">\r\n Marked as\r\n <span [ngClass]=\"'text-' + c.statusType\">\r\n \u201C{{ c.statusLabel }}\u201D\r\n </span>\r\n </p>\r\n\r\n <!-- note -->\r\n <p class=\"mb-2\" *ngIf=\"c.note\">\r\n {{ c.note }}\r\n </p>\r\n\r\n <!-- image cards -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div *ngFor=\"let img of c.images\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + img.url + ')'\"></div>\r\n\r\n <div class=\"tango-meta\">\r\n <div class=\"small\">Tango ID: {{ img.tangoId }}\r\n <span *ngIf=\"img.status === 'approve'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"img.status === 'reject'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"small text-muted\">Entry time: {{\r\n img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- +N more card -->\r\n <div *ngIf=\"c.moreCount > 0\"\r\n class=\"tango-card more-card d-flex align-items-center justify-content-center\">\r\n +{{ c.moreCount }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div *ngIf=\"source?.houseKeeping?.length\" class=\"my-7 d-flex justify-content-end\"\r\n role=\"group\">\r\n <button [disabled]=\"!houseKeepingACCount\" class=\"btn btn-outline me-1\"\r\n (click)=\"popupOpen('rejected','houseKeeping')\">Reject</button>\r\n <button [disabled]=\"!houseKeepingACCount\" class=\"btn btn-primary ms-1\"\r\n (click)=\"popupOpen('approved','houseKeeping')\">Approve</button>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n </div>\r\n \r\n</section>\r\n\r\n\r\n<ng-template #zoomPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n\r\n <!-- Heading -->\r\n <h5 class=\"modal-title mb-2\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }} Selected Images\r\n </h5>\r\n\r\n <!-- Description -->\r\n <p class=\"mb-3 test-appvalue\">\r\n You're about to {{ popupType === 'approved' ? 'Approve' : 'Reject' }} {{ this.overallSelectedIds?.length || '--' }} {{ popupvalue | titlecase }}\r\n </p>\r\n\r\n <!-- Count Box -->\r\n <div class=\"w-100 mb-4\">\r\n <label>Remarks (Optional)</label>\r\n <textarea class=\"form-control\" rows=\"4\" [(ngModel)]=\"remarks\"></textarea>\r\n\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"submitValue(popupType, popupvalue)\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".card-header,.header{color:var(--Gray-900, #101828);font-size:20px!important;font-style:normal;font-weight:700;line-height:27px}.sub-header{color:var(--Gray-700, #344054);font-size:14px!important;font-style:normal;font-weight:600;line-height:20px}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.card-title-foot{color:var(--Gray-800, #1D2939)!important;font-size:18px;font-weight:600;line-height:28px}.card-title-label{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:600;line-height:28px}.card-title-value{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:400;line-height:28px}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.rotate{rotate:180deg;transition:1s}.border-selectall{border-radius:6px;border-bottom:1px solid var(--Gray-200, #EAECF0);background:#f9fafb;padding:8px 12px}.border-selectall1{border-radius:6px!important;background:var(--White, #FFF)!important;padding:8px 2px}.border-totalfootfall{border-radius:12px;padding:4px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.vl{border-left:2px solid #000;height:50px}.duplicate-head{color:var(--Gray-700, #344054);font-size:16px;font-weight:600;line-height:20px}.img-border{border-radius:5px!important;border:2px solid var(--Gray-300, #D0D5DD)}.desc-title{color:var(--Gray-900, #101828);font-size:12px;font-weight:500;line-height:20px}.desc-value{color:var(--Gray-900, #475467);font-size:10px;font-weight:500;line-height:10px}.img-border{overflow:hidden;position:relative}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:1px!important}.absolute{top:5px;right:5px;z-index:2}.absolute1{top:5px;left:8px;z-index:2}.img-src{width:25%;height:20%}.backButtonright{border-radius:1000px!important;background:var(--text-primary, #FFF)!important;padding:12px!important;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808!important;box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808!important;position:absolute;top:30px;right:-10px;z-index:0}.backButtonleft{border-radius:1000px!important;background:#fff;padding:14px!important;border:var(--Gray-300, #D0D5DD);box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808;position:absolute;top:30px;left:-20px;z-index:5}.select-wrapper{position:relative;display:inline-block;width:100%}.placeholder-overlay{position:absolute;color:var(--Gray-500, #667085);font-family:Inter;font-size:16px!important;font-style:normal;font-weight:400;top:10px;left:15px;pointer-events:none;font-size:1.1rem;z-index:1}.card-title{color:var(--Black, #101828)!important;font-size:20px!important;font-weight:700!important;line-height:30px}.card-title-sub-header{color:var(--Black, #101828);font-size:14px;font-weight:500;line-height:30px}.separator.separator-dashed{border-bottom-style:double!important}.border-1{border-radius:4px!important;border:1px solid var(--Gray-300, #D0D5DD)!important}.store-item{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-radius:8px;transition:background-color .3s ease}.store-item-active{background:#eaf8ff}.left{display:flex;align-items:center;gap:8px;overflow:hidden;color:var(--Gray-700, #344054);text-overflow:ellipsis;font-size:14px;font-style:normal;font-weight:400;line-height:24px}.left .active-text{overflow:hidden;color:var(--Primary-700, #EAF8FF);font-size:14px;font-style:normal;font-weight:400;line-height:24px}.badge-active{border-radius:16px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:20px;mix-blend-mode:multiply}.badge-normal{color:var(--Gray-700, #344054);text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:20px;border-radius:16px;background:var(--Gray-100, #F2F4F7)}.bg-light-primary{background:#f6fcff!important}.card-layer{gap:16px!important;opacity:1!important;padding:16px!important;border-radius:16px!important;border-width:1px!important;background:#fff;border:1px solid #EAECF0!important}.ticket-container{width:100%;background:#fff;border-radius:12px;padding:0;font-family:Inter,sans-serif}.ticket-header{display:flex;justify-content:space-between;align-items:center;border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;padding:16px 20px;font-weight:600}.footfall-value{font-weight:600;font-size:20px;line-height:30px;letter-spacing:0%;vertical-align:middle;color:#101828}.issue-date{font-size:14px;color:#666}.timeline{width:1.5px;height:15px;background:#d0d5dd;margin-left:33px}.timeline-new{width:1px;height:70px;background:#d0d5dd;margin-left:30px;font-weight:600}.revision-card{background:#fff;border:1px solid #eaeaea;border-radius:12px;padding:0 20px}.user-info{display:flex;align-items:center}.avatar{width:42px;height:40px;border-radius:50%;margin-right:15px;font-size:14px;color:#1d2939;font-weight:600}.user-name{font-size:13px;color:#555}.user-email{font-size:12px;color:#888;margin-top:2px}.values-row{display:flex;justify-content:space-between;flex-wrap:wrap}.value-block{min-width:90px;margin:10px 0}.value{font-size:20px;font-weight:700}.label{font-size:14px;color:#1d2939;margin-top:3px}.accuracy{font-size:18px!important}.accuracy.up,.accuracy.down{color:#00a3ff}.footfall-label{font-weight:700;font-size:14px;line-height:20px;letter-spacing:0%;vertical-align:middle;color:#344054!important}.duplicate-layer{gap:10px;opacity:1;padding:16px;border-bottom-width:1px;border-bottom:1px solid #F2F4F7;background:#fff}.layer-approved{border-color:#a6f4c5!important;box-shadow:0 0 0 2.29px #a6f4c5}.layer-rejected{border-color:#fda29b!important;box-shadow:0 0 0 2.29px #fda29b}.layers{border-radius:8px;border-width:1px;opacity:1;border:1px solid #EAECF0;background:#fcfcfd;margin:12px}.btn-primary{font-size:13px!important;padding:5px 15px!important}.accordion-header{cursor:pointer}svg.rotated{transform:rotate(180deg);transition:transform .3s ease}.accordion-body{animation:fadeIn .25s ease}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.ellipsis-underline{max-width:120px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:underline;cursor:pointer;display:inline-block}table td{line-height:14px!important}.btn-filter{font-weight:600;font-size:14px;line-height:20px;letter-spacing:0%;text-transform:capitalize;color:#344054}.overlay{position:fixed;inset:0;background:#0000001a}.filter-card{position:absolute;right:0;background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 8px 24px #0000001f;font-size:13px}.border-primary-layers{opacity:1;gap:12px;padding-bottom:16px;background:#eaf8ff;border-radius:8px!important}.border-primary-layers .label-title{opacity:1;gap:10px;padding:8px;border-bottom-right-radius:8px!important;background:#daf1ff;font-weight:500!important;font-size:18px!important;line-height:28px!important;letter-spacing:0%;color:#000!important}.border-primary-layers .label-desc{font-weight:500;font-size:16px;line-height:28px;letter-spacing:0%;color:#008edf!important}.comment-thread{border-left:1px solid #e5e5e5;padding-left:16px}.comment-avatar{width:32px;height:32px;border-radius:50%;object-fit:cover}.tango-card{width:140px;border-radius:8px;border:1px solid #e5e5e5;overflow:hidden;background:#fff;cursor:pointer}.tango-image{height:80px;background-size:cover;background-position:center}.tango-meta{padding:6px 8px}.more-card{background:#00000008;font-weight:600}.status-dot{display:inline-block;width:10px;height:10px;border-radius:50%;margin-left:4px}.status-approve{background:#22c55e}.status-reject{background:#ef4444}.page-content{padding:16px}.filter-backdrop{position:fixed;inset:0;background:#0f172a40;z-index:998}.filter-modal{position:fixed;inset:0;display:flex;justify-content:center;align-items:center;z-index:999}.store-item-active{background-color:#eaf8ff}.store-item{padding:8px 12px 8px 10px;border-radius:6px;padding:8px 12px;gap:12px;opacity:1}.ticket-id{font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#1d2939}.store-name{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}.perc-badge{font-size:12px;min-width:48px;text-align:center}.perc-badge-normal{background-color:#f3f3f3;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;color:#344054}.perc-badge-active{background-color:#d9ecff;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;color:#009bf3}.border-selectall{padding:8px 10px;border-radius:12px;background:#f7f7f7}.reviewer-label{font-size:12px;color:gray}.sort-arrow{font-size:10px;line-height:1}.modal-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#1d2939}.test-appvalue{color:#1d2939;font-weight:400;font-size:16px;line-height:24px;letter-spacing:0%}.light-primary{background:#eaf8ff!important}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }] });
|
|
892
|
+
}
|
|
893
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TicketFootfallNewComponent, decorators: [{
|
|
894
|
+
type: Component,
|
|
895
|
+
args: [{ selector: "lib-ticket-footfall-new", template: "<section *ngIf=\"select ==='ticketList'\">\r\n <div class=\"row ms-3 my-3\">\r\n <!-- <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link cursor-pointer no-border me-3\">\r\n Tickets\r\n </a>\r\n \r\n </li>\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link cursor-pointer no-border me-3\"> Internal audit\r\n </a>\r\n </li>\r\n </ul> -->\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-9 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title my-0\">{{ getFootfallSummaryData?.totalTickets !== null ?\r\n getFootfallSummaryData?.totalTickets : '--' }}</h5>\r\n <span class=\"sub-header\">Total tickets</span>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title my-0\">{{ getFootfallSummaryData?.averageAccuracyOverAll !== null ?\r\n getFootfallSummaryData?.averageAccuracyOverAll + '%' : '--' }}</h5>\r\n <span class=\"sub-header\">Average accuracy (Overall)</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openTickets !== null ?\r\n getFootfallSummaryData?.openTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open</span>\r\n </div>\r\n <div class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openInfraIssues !== null ?\r\n getFootfallSummaryData?.openInfraIssues : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open-Infra Issue</span>\r\n </div>\r\n <div class=\"col my-3 ps-20\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.inprogress !== null ?\r\n getFootfallSummaryData?.inprogress : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">In-progress</span>\r\n </div>\r\n <div class=\"col my-3 text-end\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.closedTickets !== null ?\r\n getFootfallSummaryData?.closedTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Closed</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-3 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 py-1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title mt-0\">{{ getFootfallSummaryData?.ticketAccuracyAbove !== null ?\r\n getFootfallSummaryData?.ticketAccuracyAbove : '--' }}</h5>\r\n <div class=\"sub-header\">Tickets with Accuracy Above 85%</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 col-xl-12 col-md-12 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.ticketAccuracyBelow !== null ?\r\n getFootfallSummaryData?.ticketAccuracyBelow : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Tickets with Accuracy Below 85%</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Showing tickets with Accuracy Below 85% <span\r\n class=\"ms-2 px-3 badge badge-light-primary\">{{totalItems}} Total</span></span>\r\n <span class=\"text-sub mb-2\">Based on {{headerFilters?.date?.startDate | date:'dd MMM, yyyy'}} \u2013 {{headerFilters?.date?.endDate | date:'dd MMM, yyyy'}} </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control ps-14 me-2\" placeholder=\"Search by store\"\r\n autocomplete=\"off\" (change)=\"searchData()\" [(ngModel)]=\"searchValue\" />\r\n\r\n <button type=\"button\" (click)=\"exportXLSX()\"\r\n class=\"btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">Export</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table bottom-border text-nowrap \">\r\n <thead>\r\n <tr>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('storeName')\">Store (200)<svg\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'storeName' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <!-- <th class=\"cursor-pointer\" (click)=\"onSort('ticketId')\">Ticket ID<svg\r\n [ngClass]=\"sortedColumn === 'ticketId' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'ticketId' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th> -->\r\n <th class=\"cursor-pointer\" (click)=\"onSort('createdAt')\">Ticket raised on\r\n <svg [ngClass]=\"sortedColumn === 'createdAt' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'createdAt' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('dateString')\">Issue Date\r\n <svg [ngClass]=\"sortedColumn === 'dateString' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'dateString' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('type')\">Ticket type\r\n <svg [ngClass]=\"sortedColumn === 'type' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'type' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('footfallCount')\">Actual FF\r\n <svg [ngClass]=\"sortedColumn === 'footfallCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'footfallCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('duplicateCount')\">Store (%)\r\n <svg [ngClass]=\"sortedColumn === 'duplicateCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'duplicateCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('employeeCount')\">Reviewer (%)\r\n <svg [ngClass]=\"sortedColumn === 'employeeCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'employeeCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('junkCount')\">Approver (%)\r\n <svg [ngClass]=\"sortedColumn === 'junkCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'junkCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"cursor-pointer\" (click)=\"onSort('houseKeepingCount')\">Tango (%)\r\n <svg [ngClass]=\"sortedColumn === 'houseKeepingCount' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'houseKeepingCount' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n\r\n <th class=\"cursor-pointer\" (click)=\"onSort('status')\">Status<svg\r\n [ngClass]=\"sortedColumn === 'status' && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n [attr.stroke]=\"sortedColumn === 'status' ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></th>\r\n <!-- <th >Actions</th> -->\r\n <th>Comments</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let obj of footfallListData\">\r\n <td>\r\n <div class=\"text-primary ellipsis-underline\" (click)=\"ticketView(obj)\">\r\n {{ obj?.ticketId }}\r\n </div>\r\n\r\n <div class=\"pt-2\">{{ obj?.storeName }}</div>\r\n </td>\r\n <td class=\"pt-7\">{{obj?.ticketRaised | date:'dd MMM, yyyy'}}</td>\r\n <td class=\"pt-7\">{{obj?.issueDate | date:'dd MMM, yyyy'}}</td>\r\n <td class=\"pt-7\">{{obj?.type ? obj?.type: '-'}}</td>\r\n <td class=\"pt-7\">{{obj?.footfall ?? '-'}}</td>\r\n <td class=\"pt-7\">{{obj?.storeRevisedAccuracy ? obj?.storeRevisedAccuracy:'-'}}</td>\r\n <td class=\"pt-7\">{{obj?.reviewerRevisedAccuracy ? obj?.reviewerRevisedAccuracy:'-'}}</td>\r\n <td class=\"pt-7\">{{obj?.approverRevisedAccuracy ? obj?.approverRevisedAccuracy:'-'}}</td>\r\n <td class=\"pt-7\">{{obj?.tangoRevisedAccuracy ? obj?.tangoRevisedAccuracy:'-'}}</td>\r\n <td class=\"pt-7\">\r\n <span *ngIf=\"obj?.status ==='Open'\" class=\"badge badge-light-primary mx-2\">Open\r\n </span>\r\n <span *ngIf=\"obj?.status ==='Closed'\" class=\"badge badge-light-default mx-2\">Closed\r\n </span>\r\n <span *ngIf=\"obj?.status !=='Closed' && obj?.status !=='Open'\"\r\n class=\"badge badge-light-warning mx-2\">\r\n {{obj?.status}}</span>\r\n </td>\r\n <td class=\"pt-7\">{{obj?.comments ? obj?.comments:'--' }}</td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div *ngIf=\"!loading && !noData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"setpageSize()\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n<!-- -->\r\n<section *ngIf=\"select ==='ticketMethod'\">\r\n <div class=\"row my-2\">\r\n <div class=\"position-relative\" [ngClass]=\"isCollapsed ? 'd-none' : 'col-md-3 h-auto'\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-header border-0 pt-3 px-5\">\r\n <span class=\"ms-2 cursor-pointer\" (click)=\"backToNavigation()\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"44\" viewBox=\"0 0 56 44\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_887_4505)\">\r\n <rect x=\"2\" y=\"1\" width=\"52\" height=\"40\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"51\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M30.5 26L25.5 21L30.5 16\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_887_4505\" x=\"0\" y=\"0\" width=\"56\" height=\"44\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_887_4505\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_887_4505\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg><span class=\"card-title-foot pt-15 ms-3\">Tickets</span></span>\r\n <span class=\"cursor-pointer\" (click)=\"toggleSidebar()\"\r\n style=\"position: absolute; top: 15px; right: -25px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"68\" height=\"68\" viewBox=\"0 0 68 68\" fill=\"none\">\r\n <g filter=\"url(#filter0_dd_778_34282)\">\r\n <rect x=\"12\" width=\"44\" height=\"44\" rx=\"22\" fill=\"white\" />\r\n <path d=\"M33 27L28 22L33 17M40 27L35 22L40 17\" stroke=\"#101828\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_dd_778_34282\" x=\"0\" y=\"0\" width=\"68\" height=\"68\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feMorphology radius=\"2\" operator=\"erode\" in=\"SourceAlpha\"\r\n result=\"effect1_dropShadow_778_34282\" />\r\n <feOffset dy=\"4\" />\r\n <feGaussianBlur stdDeviation=\"3\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.03 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_778_34282\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feMorphology radius=\"4\" operator=\"erode\" in=\"SourceAlpha\"\r\n result=\"effect2_dropShadow_778_34282\" />\r\n <feOffset dy=\"12\" />\r\n <feGaussianBlur stdDeviation=\"8\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.08 0\" />\r\n <feBlend mode=\"normal\" in2=\"effect1_dropShadow_778_34282\"\r\n result=\"effect2_dropShadow_778_34282\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_778_34282\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"p-4 w-100 overflow-auto\">\r\n <div class=\"row my-1\">\r\n <div class=\"col-8\">\r\n\r\n <span class=\"svg-icon svg-icon-1 position-absolute py-2 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input class=\"form-control form-control-sm mb-2 ps-14 pe-2 w-100\" type=\"text\"\r\n placeholder=\"Search\" [(ngModel)]=\"StoresSearchValue\" (change)=\"searchStoresData()\" />\r\n </div>\r\n <div class=\"col-4 p-0 btn\">\r\n <button class=\"btn-filter btn btn-sm btn-outline\" (click)=\"toggleFilter()\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n Filter\r\n </button>\r\n\r\n <!-- Overlay (click outside to close) -->\r\n <div class=\"overlay\" *ngIf=\"isFilterOpen\" (click)=\"close()\"></div>\r\n\r\n <form [formGroup]=\"filterForm\">\r\n <!-- Filter card -->\r\n <div class=\"filter-card text-start\" *ngIf=\"isFilterOpen\"\r\n (click)=\"$event.stopPropagation()\">\r\n <h3 class=\"mb-3\">Filter Options</h3>\r\n\r\n <!-- Status -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label mb-1\">Status</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"status\">\r\n <option value=\"\">Select</option>\r\n <option>Open</option>\r\n <option>In-Progress</option>\r\n <option>Close</option>\r\n <option>Under tange review</option>\r\n <option>Tange review done</option>\r\n <option>Expired</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Reviewer accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n <!-- TODO: same block for Approver & Tango -->\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Approver accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Tango accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\"\r\n (click)=\"resetFilter()\">Reset</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\"\r\n (click)=\"applyFilter()\">Apply</button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n </div>\r\n </div>\r\n\r\n<div *ngIf=\"openTicketsList.length\" class=\"mb-2 border-selectall\">\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n\r\n <!-- LEFT: checkbox + text -->\r\n <div class=\"d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"me-2\"\r\n [checked]=\"allSelected\"\r\n (change)=\"toggleSelectAll()\" />\r\n <label class=\"m-0 font-semibold\">\r\n Select all {{ storeCount }} stores\r\n </label>\r\n </div>\r\n\r\n <!-- RIGHT: Reviewer(%) + optional sort icon -->\r\n <div class=\"d-flex align-items-center reviewer-label\">\r\n <span class=\"me-1\">Reviewer(%)</span>\r\n <!-- if you want arrow icon -->\r\n <span class=\"sort-arrow cursor-pointer\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n<path d=\"M6.83464 1L6.83463 12.6667M6.83463 12.6667L12.668 6.83333M6.83463 12.6667L1.0013 6.83333\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n <!-- or use an <i> from font-awesome/bootstrap icon instead -->\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n<ul class=\"list-unstyled ps-0\">\r\n<li *ngFor=\"let store of openTicketsList\"\r\n class=\"mb-2\"\r\n [ngClass]=\"{ 'store-item-active': isSelected(store), 'store-item': true }\">\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n <!-- LEFT: checkbox + text -->\r\n <div class=\"d-flex align-items-start\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"me-2 my-3\"\r\n [checked]=\"isSelected(store)\"\r\n (change)=\"toggleStoreSelection(store)\" />\r\n\r\n <div class=\"store-text ms-1\">\r\n <div class=\"ticket-id\" [ngClass]=\"{ 'active-text': isSelected(store) }\">\r\n {{ store?.ticketId }}\r\n </div>\r\n <div class=\"store-name mt-1\">\r\n {{ store?.storeName }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT: pill badge -->\r\n <span\r\n class=\"ms-2 px-3 py-1 rounded-pill d-inline-flex align-items-center justify-content-center perc-badge\"\r\n [ngClass]=\"{\r\n 'perc-badge-active': isSelected(store),\r\n 'perc-badge-normal': !isSelected(store)\r\n }\">\r\n {{ store?.revicedPerc }}\r\n </span>\r\n </div>\r\n</li>\r\n\r\n</ul>\r\n\r\n\r\n\r\n <div *ngIf=\"!openTicketsList.length\" class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n\r\n <div class=\"card-body mx-0 d-flex justify-content-center align-items-center flex-column \"\r\n style=\"margin: 64px;border-radius: 8px;\r\n background: var(--Gray-50, #F9FAFB);\">\r\n <svg class=\"my-5\" xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\"\r\n viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\"\r\n stroke-width=\"13.3333\" />\r\n <g clip-path=\"url(#clip0_730_75095)\">\r\n <path\r\n d=\"M55.3327 62V58.6667C55.3327 56.8986 54.6303 55.2029 53.3801 53.9526C52.1298 52.7024 50.4341 52 48.666 52H35.3327C33.5646 52 31.8689 52.7024 30.6186 53.9526C29.3684 55.2029 28.666 56.8986 28.666 58.6667V62M65.3327 62V58.6667C65.3316 57.1895 64.8399 55.7546 63.935 54.5872C63.03 53.4198 61.7629 52.5859 60.3327 52.2167M53.666 32.2167C55.1 32.5838 56.3711 33.4178 57.2787 34.5872C58.1864 35.7565 58.6791 37.1947 58.6791 38.675C58.6791 40.1553 58.1864 41.5935 57.2787 42.7628C56.3711 43.9322 55.1 44.7662 53.666 45.1333M48.666 38.6667C48.666 42.3486 45.6812 45.3333 41.9993 45.3333C38.3174 45.3333 35.3327 42.3486 35.3327 38.6667C35.3327 34.9848 38.3174 32 41.9993 32C45.6812 32 48.666 34.9848 48.666 38.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"4\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_75095\">\r\n <rect width=\"40\" height=\"40\" fill=\"white\" transform=\"translate(27 27)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <div class=\"nodata-title my-3\">No Stores Found</div>\r\n <div class=\"nodata-sub mb-3\">Looks like there is no stores </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div [ngClass]=\"isCollapsed ? 'col-12' : 'col-md-9'\">\r\n <div class=\"card bg-light-primary p-1 h-100\">\r\n <div class=\"card-header border-0 pt-3 px-5\">\r\n <div class=\"d-flex justify-content-start\">\r\n <div *ngIf=\"isCollapsed\" class=\"cursor-pointer\"><span (click)=\"toggleSidebar()\"\r\n style=\"position: absolute; top: 10px; left: 10px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"\r\n fill=\"none\">\r\n <path d=\"M22.5 25L17.5 20L22.5 15\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> </span>\r\n <span class=\"card-title-foot ms-15\">Footfall Directory</span>\r\n </div>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <span *ngIf=\"ticketData.status === 'raised'\">\r\n\r\n <button *ngIf=\"!closeBtn\" class=\"btn btn-sm btn-primary mx-2\" (click)=\"startReview()\">Start\r\n Review</button>\r\n <button *ngIf=\"closeBtn\" disabled class=\"btn btn-sm btn-primary mx-2\" (click)=\"stopReview()\">Close\r\n Ticket</button>\r\n </span>\r\n <span *ngIf=\"ticketData.status !== 'raised'\"><button class=\"btn btn-sm btn-primary mx-2\" (click)=\"startAudit()\">Start\r\n Audit</button></span>\r\n <span>\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5C11 5.55228 11.4477 6 12 6Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-4 \">\r\n <div class=\"row mb-6\">\r\n\r\n <div class=\"col-2 card-title-label my-2\">Store Name</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{ticketData?.storeName}}</div>\r\n <div class=\"col-2 card-title-label my-2\">Ticket ID</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{ticketData?.ticketId}}</div>\r\n <div class=\"col-2 card-title-label my-2\">Status</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n \r\n <div class=\"col-3 my-2\"><span class=\"badge\" [ngClass]=\"{\r\n 'badge-light-primary': ticketData.status === 'open',\r\n 'badge-secondary': ticketData.status === 'closed',\r\n 'badge-light-warning': ticketData.status === 'pending' || ticketData.status === 'Reviewer-Closed',\r\n 'badge-light-danger': ticketData.status === 'rejected',\r\n 'badge-light-info': ticketData.status === 'raised', \r\n\r\n }\"> {{ ticketData.status ? (ticketData.status | titlecase) : '-' }}\r\n </span></div>\r\n\r\n <div class=\"col-2 card-title-label my-2\">Due Date</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">04 Dec 2025</div>\r\n </div>\r\n\r\n <!-- <div class=\"border-primary-layers my-3 h-100px\">\r\n\r\n <div class=\"label-title w-175px p-4 mb-2\">Tango response</div>\r\n <div class=\"label-desc ps-4\"><span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M12 16V12M12 8H12.01M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\"\r\n stroke=\"#008EDF\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>Tango audit completed \u2014 found 3% discrepancies difference between Tango and\r\n revisions.</div>\r\n\r\n </div> -->\r\n <div class=\"card-layer\">\r\n <div class=\"d-flex justify-content-between align-items-start w-100\">\r\n\r\n <!-- LEFT SIDE -->\r\n <h3 class=\"card-title align-items-start flex-column mb-0\">\r\n <div class=\"card-label\">Ticket Status</div>\r\n <div class=\"text-sub mb-2\">Logs for each revision of the ticket.</div>\r\n </h3>\r\n\r\n <!-- RIGHT SIDE -->\r\n <div class=\"cursor-pointer\">\r\n <span *ngIf=\"arrowshow\" (click)=\"openArrow()\"> <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\"\r\n height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_486_91902)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M15 16.5L20 21.5L25 16.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_486_91902\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_486_91902\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_486_91902\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span>\r\n <span *ngIf=\"!arrowshow\" (click)=\"closeArrow()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"\r\n fill=\"none\">\r\n <g filter=\"url(#filter0_d_486_91893)\">\r\n <rect x=\"38\" y=\"37\" width=\"36\" height=\"36\" rx=\"8\"\r\n transform=\"rotate(180 38 37)\" fill=\"white\" />\r\n <rect x=\"37.5\" y=\"36.5\" width=\"35\" height=\"35\" rx=\"7.5\"\r\n transform=\"rotate(180 37.5 36.5)\" stroke=\"#D0D5DD\" />\r\n <path d=\"M25 21.5L20 16.5L15 21.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_486_91893\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_486_91893\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_486_91893\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n </div>\r\n\r\n \r\n <section *ngIf=\"!arrowshow\">\r\n\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n \r\n <div *ngIf=\"ticket?._source as source\" class=\"ticket-container\">\r\n \r\n <!-- Actual Footfall Header -->\r\n <div class=\"ticket-header\">\r\n <div class=\"footfall-value\">{{source?.footfallCount}} <span class=\"footfall-label ms-3\">Actual Footfall</span>\r\n </div>\r\n <div class=\"issue-date\">Issue date : {{source?.createdAt | date:'dd MMM yyyy'}}</div>\r\n </div>\r\n \r\n <!-- Timeline Line -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n \r\n <!-- When ticket is CLOSED, skip the tagging row -->\r\n <ng-container *ngIf=\"mapping?.status !== 'closed' || mapping?.type !== 'tagging'\">\r\n \r\n <div *ngIf=\"mapping?.type === 'tagging' || mapping?.type === 'review'\" class=\"timeline\"></div>\r\n <div *ngIf=\"mapping?.type === 'tagging' || mapping?.type === 'review'\" class=\"user-info ms-4\">\r\n\r\n <div\r\n class=\"avatar avatar-text light-primary p-3\"\r\n \r\n >\r\n {{ getInitialsFromEmail(mapping?.createdByEmail || source?.createdByEmail) }}\r\n </div>\r\n\r\n <div>\r\n <div class=\"user-name\">\r\n <span *ngIf=\"mapping?.type === 'tagging'\">\r\n Ticket created by\r\n </span>\r\n <span *ngIf=\"mapping?.type === 'review'\">\r\n Reviewed by\r\n </span>\r\n\r\n \r\n </div>\r\n\r\n <div class=\"user-email\">\r\n {{ mapping?.createdByEmail || source?.createdByEmail }} \u2022\r\n {{ (mapping?.createdAt || source?.createdAt) | date:'HH:mm:ss \u2013 dd MMM yyyy' }}\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n\r\n <div class=\"timeline\"></div>\r\n\r\n <!-- Show revision card only when NOT closed & type is tagging -->\r\n <div class=\"revision-card\"\r\n *ngIf=\"mapping?.type === 'tagging' || mapping?.type === 'review'\">\r\n <div class=\"values-row\">\r\n <div class=\"value-block\">\r\n <div class=\"value\">\r\n {{ mapping?.revicedFootfall === null ? '--' : mapping?.revicedFootfall }}\r\n </div>\r\n <div class=\"label fw-bold\">Revised Footfall</div>\r\n </div>\r\n\r\n <div class=\"value-block\">\r\n <div class=\"value accuracy down\">\r\n {{ mapping?.revicedPerc || source?.revicedPerc || '--' }}\r\n <span class=\"ms-1\">\r\n <!-- arrow svg -->\r\n </span>\r\n </div>\r\n <div class=\"label fw-bold pt-1\">Accuracy</div>\r\n </div>\r\n\r\n <div class=\"timeline-new my-2\"></div>\r\n\r\n <div class=\"value-block\" *ngFor=\"let item of mapping?.count\">\r\n <div class=\"value\">\r\n {{ item?.value ?? '--' }}\r\n </div>\r\n <div class=\"label\">\r\n {{ item?.name }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n <div class=\"timeline\"></div>\r\n \r\n <!-- <div class=\"timeline\"></div> -->\r\n <!-- Tango by row -->\r\n <!-- <div class=\"user-info ms-4 d-flex align-items-center mb-2\">\r\n <img src=\"assets/user2.png\" class=\"avatar me-2\" />\r\n <div>\r\n <div class=\"user-name\">Tango by</div>\r\n <div class=\"user-email\">\r\n orlandolenskart.com \u2022 10:53:34 AM \u2013 20 Jan 2025\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"timeline\"></div> -->\r\n \r\n <!-- MAIN CARD -->\r\n <!-- <div class=\"revision-card px-0\">\r\n \r\n <div class=\"values-row d-flex align-items-stretch px-5\">\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value\">89</div>\r\n <div class=\"label fw-bold\">Revised Footfall</div>\r\n </div>\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value accuracy up\">\r\n 89%\r\n <span class=\"ms-1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M7.9987 12.6666L7.9987 3.33329M7.9987 3.33329L12.6654 7.99996M7.9987 3.33329L3.33203 7.99996\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"label fw-bold\">Accuracy</div>\r\n </div>\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value\">10</div>\r\n <div class=\"label\">Duplicates</div>\r\n </div>\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value\">3</div>\r\n <div class=\"label\">Employee/Staff</div>\r\n </div>\r\n \r\n <div class=\"value-block me-4\">\r\n <div class=\"value\">2</div>\r\n <div class=\"label\">Junk</div>\r\n </div>\r\n \r\n <div class=\"value-block\">\r\n <div class=\"value\">1</div>\r\n <div class=\"label\">House Keeping</div>\r\n </div>\r\n \r\n </div>\r\n \r\n <div class=\"card-footer py-1 bg-light-primary\">\r\n \r\n <div class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"showRevisedDetails = !showRevisedDetails\">\r\n <span class=\"text-primary \">\r\n {{ showRevisedDetails ? 'Hide details' : 'Show in details' }}\r\n </span>\r\n <span class=\"chevron ms-3\" [class.rotate-180]=\"showRevisedDetails\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M18 9L12 15L6 9\" stroke=\"#101828\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n </div>\r\n \r\n \r\n <div class=\"details-body mt-2\" *ngIf=\"showRevisedDetails\">\r\n \r\n \r\n <div class=\"small text-muted\">\r\n \r\n Detailed breakdown of revised footfall goes here\u2026\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </section>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-6 position-relative\">\r\n <div *ngIf=\"isCheckboxEnable\" class=\"pb-3 my-3 h-100 rounded-3 position-relative\">\r\n\r\n <input type=\"checkbox\" class=\"position-absolute absolute1 form-check-input\"\r\n (change)=\"overallSelect($event)\" /><span class=\"ms-12\"> Select\r\n All</span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"col-md-6 pe-8\">\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <select class=\"form-select\" aria-placeholder=\"show all\">\r\n <option value=\"all\">Show all</option>\r\n <option value=\"accept\">Accept</option>\r\n <option value=\"reject\">Reject</option>\r\n <option value=\"pending\">Pending</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\" (click)=\"popupOpen('rejected')\">Reject</button>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\"\r\n (click)=\"popupOpen('approved')\">Accept</button>\r\n </div>\r\n <!-- <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\" (click)=\"popupOpen('rejected')\">Deny</button>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\"\r\n (click)=\"popupOpen('approved')\">Approve</button>\r\n </div> -->\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"bg-white\">\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-5\">\r\n\r\n <div *ngIf=\"hasRevopsType('duplicates')\" class=\"layers\">\r\n <!-- Header Section -->\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <h3 class=\"text-lg font-semibold mb-4\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n Duplicates\r\n </h3>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <ng-container *ngIf=\"mapping?.type ===viewMode\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.isParent && original?.revopsType ==='duplicate'\"\r\n class=\"card-body bg-white layers py-5 px-0 m-3\">\r\n <div class=\"my-4\">\r\n <!-- Original Image -->\r\n <div class=\"duplicate-head px-5 my-3\">Original image\r\n </div>\r\n <div class=\"row px-5\">\r\n <div class=\"col-md-4 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"separator separator-dashed mt-3 mb-5\"></div>\r\n <div class=\"row px-5\">\r\n <h5 class=\"duplicate-head my-3 fs-6\">Tagged Duplicates</h5>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"my-3\">\r\n <input type=\"checkbox\"\r\n [checked]=\"areAllDuplicatesSelected(original)\"\r\n (change)=\"onToggleSelectAllDuplicates(original, $event)\" />\r\n <label class=\"ms-2\">Select All</label>\r\n </div>\r\n <div *ngFor=\"let duplicate of original?.duplicateImage; let i = index\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div\r\n class=\"pb-3 h-100 rounded-3 position-relative\"\r\n [ngClass]=\"{\r\n 'layer-approved': isApproved(original),\r\n 'layer-rejected': isRejected(original),\r\n 'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n <!-- Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n <input type=\"checkbox\" *ngIf=\"!isApproved(original) && !isRejected(original)\"\r\n style=\"right: 5px ; margin: 10px 5px 4px !important;\"\r\n [checked]=\"isDuplicateSelected(original.tempId, duplicate.tempId)\"\r\n (change)=\"onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)\"\r\n class=\"position-absolute form-check-input duplicate-checkbox\" />\r\n <span \r\n class=\"position-absolute absolute\"\r\n *ngIf=\"isApproved(original) || isRejected(original)\"\r\n (click)=\"resetCheckbox('employee', original)\" >\r\n\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\">\r\n<g filter=\"url(#filter0_d_2023_13718)\">\r\n<rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\" fill=\"white\"/>\r\n<rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\"/>\r\n<path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\" stroke-width=\"0.927778\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feOffset dy=\"0.555556\"/>\r\n<feGaussianBlur stdDeviation=\"0.555556\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2023_13718\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_2023_13718\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n </div>\r\n <!-- (change)=\"onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')\" -->\r\n <!-- Duplicate Image -->\r\n <img [src]=\"imageUrl + duplicate.filePath\" alt=\"\"\r\n class=\"w-100 rounded border duplicate-image\" />\r\n\r\n <!-- Duplicate Info -->\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ duplicate.tempId }}\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(duplicate.entryTime) }}</div>\r\n\r\n <!-- Duplicate Reason -->\r\n <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ duplicate.reason }}</small>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- Status Icons -->\r\n \r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Body -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n <div *ngFor=\"let c of comments\" class=\"comment-thread d-flex mb-4\">\r\n <!-- avatar -->\r\n <img class=\"comment-avatar me-3\" [src]=\"c.avatar\" alt=\"avatar\" />\r\n\r\n <!-- content -->\r\n <div>\r\n <div class=\"fw-semibold\">{{ c.email }}</div>\r\n <div class=\"text-muted small\">\r\n {{ c.time | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional main line -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.mainText\">\r\n {{ c.mainText }}\r\n </p>\r\n\r\n <!-- Marked as \u201C\u2026\u201D line -->\r\n <p class=\"mb-1\" *ngIf=\"c.statusLabel\">\r\n Marked as\r\n <span [ngClass]=\"'text-' + c.statusType\">\r\n \u201C{{ c.statusLabel }}\u201D\r\n </span>\r\n </p>\r\n\r\n <!-- note -->\r\n <p class=\"mb-2\" *ngIf=\"c.note\">\r\n {{ c.note }}\r\n </p>\r\n\r\n <!-- image cards -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div *ngFor=\"let img of c.images\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + img.url + ')'\"></div>\r\n\r\n <div class=\"tango-meta\">\r\n <div class=\"small\">Tango ID: {{ img.tangoId }}\r\n <span *ngIf=\"img.status === 'approve'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"img.status === 'reject'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"small text-muted\">Entry time: {{\r\n img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- +N more card -->\r\n <div *ngIf=\"c.moreCount > 0\"\r\n class=\"tango-card more-card d-flex align-items-center justify-content-center\">\r\n +{{ c.moreCount }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- \r\n <div *ngIf=\"source?.duplicateImages?.length\" class=\"my-7 d-flex justify-content-end\"\r\n role=\"group\">\r\n <button [disabled]=\"!duplicateACCount\" class=\"btn btn-outline me-1\"\r\n (click)=\"popupOpen('rejected','duplicate')\">Reject</button>\r\n <button [disabled]=\"!duplicateACCount\" class=\"btn btn-primary ms-1\"\r\n (click)=\"popupOpen('approved','duplicate')\">Approve</button>\r\n </div> -->\r\n <!-- <div *ngIf=\"source?.duplicateImages?.length\" class=\"separator separator-dashed mt-3 mb-5\"></div> -->\r\n\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType('employee')\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\">\r\n <!-- icon here -->\r\n Employee/Staff\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType.employee\"\r\n (change)=\"onSelectAll('employee', $event)\">\r\n <label>Select All</label>\r\n </div>\r\n\r\n <!-- loop over tickets -->\r\n\r\n\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <div *ngIf=\"mapping?.type === viewMode\" class=\"card-body bg-white layers p-5 m-3\"\r\n>\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n\r\n <div *ngIf=\"original?.revopsType === 'employee'\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n\r\n <div\r\n class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n 'layer-approved': isApproved(original),\r\n 'layer-rejected': isRejected(original),\r\n 'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n<div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isApproved(original) && !isRejected(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"selectedByType.employee.includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange('employee', original.tempId)\" />\r\n <span \r\n class=\"position-absolute absolute\"\r\n *ngIf=\"isApproved(original) || isRejected(original)\"\r\n (click)=\"resetCheckbox('employee', original)\" >\r\n\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\">\r\n<g filter=\"url(#filter0_d_2023_13718)\">\r\n<rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\" fill=\"white\"/>\r\n<rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\"/>\r\n<path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\" stroke-width=\"0.927778\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feOffset dy=\"0.555556\"/>\r\n<feGaussianBlur stdDeviation=\"0.555556\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2023_13718\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_2023_13718\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n\r\n</div>\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ original.tempId }}\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">\r\n Entry Time: {{ getFormattedEntryTime(original?.entryTime) }}\r\n </div>\r\n </div>\r\n \r\n</div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n <div *ngFor=\"let c of comments\" class=\"comment-thread d-flex mb-4\">\r\n <!-- avatar -->\r\n <img class=\"comment-avatar me-3\" [src]=\"c.avatar\" alt=\"avatar\" />\r\n\r\n <!-- content -->\r\n <div>\r\n <div class=\"fw-semibold\">{{ c.email }}</div>\r\n <div class=\"text-muted small\">\r\n {{ c.time | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional main line -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.mainText\">\r\n {{ c.mainText }}\r\n </p>\r\n\r\n <!-- Marked as \u201C\u2026\u201D line -->\r\n <p class=\"mb-1\" *ngIf=\"c.statusLabel\">\r\n Marked as\r\n <span [ngClass]=\"'text-' + c.statusType\">\r\n \u201C{{ c.statusLabel }}\u201D\r\n </span>\r\n </p>\r\n\r\n <!-- note -->\r\n <p class=\"mb-2\" *ngIf=\"c.note\">\r\n {{ c.note }}\r\n </p>\r\n\r\n <!-- image cards -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div *ngFor=\"let img of c.images\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + img.url + ')'\"></div>\r\n\r\n <div class=\"tango-meta\">\r\n <div class=\"small\">Tango ID: {{ img.tangoId }}\r\n <span *ngIf=\"img.status === 'approve'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"img.status === 'reject'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"small text-muted\">Entry time: {{\r\n img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- +N more card -->\r\n <div *ngIf=\"c.moreCount > 0\"\r\n class=\"tango-card more-card d-flex align-items-center justify-content-center\">\r\n +{{ c.moreCount }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType('houseKeeping')\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> House Keeping\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType.houseKeeping\"\r\n (change)=\"onSelectAll('houseKeeping',$event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.revopsType ==='houseKeeping'\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div\r\n class=\"pb-3 h-100 rounded-3 position-relative\"\r\n [ngClass]=\"{\r\n 'layer-approved': isApproved(original),\r\n 'layer-rejected': isRejected(original),\r\n 'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n \r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isApproved(original) && !isRejected(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"selectedByType.houseKeeping.includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange('houseKeeping', original.tempId)\" />\r\n <span \r\n class=\"position-absolute absolute\"\r\n *ngIf=\"isApproved(original) || isRejected(original)\"\r\n (click)=\"resetCheckbox('employee', original)\" >\r\n\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\">\r\n<g filter=\"url(#filter0_d_2023_13718)\">\r\n<rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\" fill=\"white\"/>\r\n<rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\"/>\r\n<path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\" stroke-width=\"0.927778\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feOffset dy=\"0.555556\"/>\r\n<feGaussianBlur stdDeviation=\"0.555556\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2023_13718\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_2023_13718\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n </div>\r\n\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{ original.tempId\r\n }}\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n <div *ngFor=\"let c of comments\" class=\"comment-thread d-flex mb-4\">\r\n <!-- avatar -->\r\n <img class=\"comment-avatar me-3\" [src]=\"c.avatar\" alt=\"avatar\" />\r\n\r\n <!-- content -->\r\n <div>\r\n <div class=\"fw-semibold\">{{ c.email }}</div>\r\n <div class=\"text-muted small\">\r\n {{ c.time | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional main line -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.mainText\">\r\n {{ c.mainText }}\r\n </p>\r\n\r\n <!-- Marked as \u201C\u2026\u201D line -->\r\n <p class=\"mb-1\" *ngIf=\"c.statusLabel\">\r\n Marked as\r\n <span [ngClass]=\"'text-' + c.statusType\">\r\n \u201C{{ c.statusLabel }}\u201D\r\n </span>\r\n </p>\r\n\r\n <!-- note -->\r\n <p class=\"mb-2\" *ngIf=\"c.note\">\r\n {{ c.note }}\r\n </p>\r\n\r\n <!-- image cards -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div *ngFor=\"let img of c.images\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + img.url + ')'\"></div>\r\n\r\n <div class=\"tango-meta\">\r\n <div class=\"small\">Tango ID: {{ img.tangoId }}\r\n <span *ngIf=\"img.status === 'approve'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"img.status === 'reject'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"small text-muted\">Entry time: {{\r\n img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- +N more card -->\r\n <div *ngIf=\"c.moreCount > 0\"\r\n class=\"tango-card more-card d-flex align-items-center justify-content-center\">\r\n +{{ c.moreCount }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType('junk')\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> Junk\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType.junk\"\r\n (change)=\"onSelectAll('junk',$event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n\r\n <!-- One card for all junk images in this mapping -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <!-- Loop through all items in revisedDetail -->\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n\r\n <!-- Show only junk items as columns -->\r\n <div *ngIf=\"original?.revopsType === 'junk'\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n\r\n <div\r\n class=\"pb-3 h-100 rounded-3 position-relative\"\r\n [ngClass]=\"{\r\n 'layer-approved': isApproved(original),\r\n 'layer-rejected': isRejected(original),\r\n 'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n \r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isApproved(original) && !isRejected(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"selectedByType.junk.includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange('junk', original.tempId)\" />\r\n <span \r\n class=\"position-absolute absolute\"\r\n *ngIf=\"isApproved(original) || isRejected(original)\"\r\n (click)=\"resetCheckbox('employee', original)\" >\r\n\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\">\r\n<g filter=\"url(#filter0_d_2023_13718)\">\r\n<rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\" fill=\"white\"/>\r\n<rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\"/>\r\n<path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\" stroke-width=\"0.927778\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n<feOffset dy=\"0.555556\"/>\r\n<feGaussianBlur stdDeviation=\"0.555556\"/>\r\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2023_13718\"/>\r\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_2023_13718\" result=\"shape\"/>\r\n</filter>\r\n</defs>\r\n</svg>\r\n</span>\r\n </div>\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ original.tempId }}\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(original, 'review')?.action === 'rejected'\r\n \"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">\r\n Entry Time: {{ getFormattedEntryTime(original?.entryTime) }}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n <div *ngFor=\"let c of comments\" class=\"comment-thread d-flex mb-4\">\r\n <!-- avatar -->\r\n <img class=\"comment-avatar me-3\" [src]=\"c.avatar\" alt=\"avatar\" />\r\n\r\n <!-- content -->\r\n <div>\r\n <div class=\"fw-semibold\">{{ c.email }}</div>\r\n <div class=\"text-muted small\">\r\n {{ c.time | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional main line -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.mainText\">\r\n {{ c.mainText }}\r\n </p>\r\n\r\n <!-- Marked as \u201C\u2026\u201D line -->\r\n <p class=\"mb-1\" *ngIf=\"c.statusLabel\">\r\n Marked as\r\n <span [ngClass]=\"'text-' + c.statusType\">\r\n \u201C{{ c.statusLabel }}\u201D\r\n </span>\r\n </p>\r\n\r\n <!-- note -->\r\n <p class=\"mb-2\" *ngIf=\"c.note\">\r\n {{ c.note }}\r\n </p>\r\n\r\n <!-- image cards -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div *ngFor=\"let img of c.images\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + img.url + ')'\"></div>\r\n\r\n <div class=\"tango-meta\">\r\n <div class=\"small\">Tango ID: {{ img.tangoId }}\r\n <span *ngIf=\"img.status === 'approve'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"img.status === 'reject'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"small text-muted\">Entry time: {{\r\n img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- +N more card -->\r\n <div *ngIf=\"c.moreCount > 0\"\r\n class=\"tango-card more-card d-flex align-items-center justify-content-center\">\r\n +{{ c.moreCount }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div *ngIf=\"source?.houseKeeping?.length\" class=\"my-7 d-flex justify-content-end\"\r\n role=\"group\">\r\n <button [disabled]=\"!houseKeepingACCount\" class=\"btn btn-outline me-1\"\r\n (click)=\"popupOpen('rejected','houseKeeping')\">Reject</button>\r\n <button [disabled]=\"!houseKeepingACCount\" class=\"btn btn-primary ms-1\"\r\n (click)=\"popupOpen('approved','houseKeeping')\">Approve</button>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n </div>\r\n \r\n</section>\r\n\r\n\r\n<ng-template #zoomPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n\r\n <!-- Heading -->\r\n <h5 class=\"modal-title mb-2\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }} Selected Images\r\n </h5>\r\n\r\n <!-- Description -->\r\n <p class=\"mb-3 test-appvalue\">\r\n You're about to {{ popupType === 'approved' ? 'Approve' : 'Reject' }} {{ this.overallSelectedIds?.length || '--' }} {{ popupvalue | titlecase }}\r\n </p>\r\n\r\n <!-- Count Box -->\r\n <div class=\"w-100 mb-4\">\r\n <label>Remarks (Optional)</label>\r\n <textarea class=\"form-control\" rows=\"4\" [(ngModel)]=\"remarks\"></textarea>\r\n\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"submitValue(popupType, popupvalue)\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".card-header,.header{color:var(--Gray-900, #101828);font-size:20px!important;font-style:normal;font-weight:700;line-height:27px}.sub-header{color:var(--Gray-700, #344054);font-size:14px!important;font-style:normal;font-weight:600;line-height:20px}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.card-title-foot{color:var(--Gray-800, #1D2939)!important;font-size:18px;font-weight:600;line-height:28px}.card-title-label{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:600;line-height:28px}.card-title-value{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:400;line-height:28px}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.rotate{rotate:180deg;transition:1s}.border-selectall{border-radius:6px;border-bottom:1px solid var(--Gray-200, #EAECF0);background:#f9fafb;padding:8px 12px}.border-selectall1{border-radius:6px!important;background:var(--White, #FFF)!important;padding:8px 2px}.border-totalfootfall{border-radius:12px;padding:4px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.vl{border-left:2px solid #000;height:50px}.duplicate-head{color:var(--Gray-700, #344054);font-size:16px;font-weight:600;line-height:20px}.img-border{border-radius:5px!important;border:2px solid var(--Gray-300, #D0D5DD)}.desc-title{color:var(--Gray-900, #101828);font-size:12px;font-weight:500;line-height:20px}.desc-value{color:var(--Gray-900, #475467);font-size:10px;font-weight:500;line-height:10px}.img-border{overflow:hidden;position:relative}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:1px!important}.absolute{top:5px;right:5px;z-index:2}.absolute1{top:5px;left:8px;z-index:2}.img-src{width:25%;height:20%}.backButtonright{border-radius:1000px!important;background:var(--text-primary, #FFF)!important;padding:12px!important;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808!important;box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808!important;position:absolute;top:30px;right:-10px;z-index:0}.backButtonleft{border-radius:1000px!important;background:#fff;padding:14px!important;border:var(--Gray-300, #D0D5DD);box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808;position:absolute;top:30px;left:-20px;z-index:5}.select-wrapper{position:relative;display:inline-block;width:100%}.placeholder-overlay{position:absolute;color:var(--Gray-500, #667085);font-family:Inter;font-size:16px!important;font-style:normal;font-weight:400;top:10px;left:15px;pointer-events:none;font-size:1.1rem;z-index:1}.card-title{color:var(--Black, #101828)!important;font-size:20px!important;font-weight:700!important;line-height:30px}.card-title-sub-header{color:var(--Black, #101828);font-size:14px;font-weight:500;line-height:30px}.separator.separator-dashed{border-bottom-style:double!important}.border-1{border-radius:4px!important;border:1px solid var(--Gray-300, #D0D5DD)!important}.store-item{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-radius:8px;transition:background-color .3s ease}.store-item-active{background:#eaf8ff}.left{display:flex;align-items:center;gap:8px;overflow:hidden;color:var(--Gray-700, #344054);text-overflow:ellipsis;font-size:14px;font-style:normal;font-weight:400;line-height:24px}.left .active-text{overflow:hidden;color:var(--Primary-700, #EAF8FF);font-size:14px;font-style:normal;font-weight:400;line-height:24px}.badge-active{border-radius:16px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:20px;mix-blend-mode:multiply}.badge-normal{color:var(--Gray-700, #344054);text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:20px;border-radius:16px;background:var(--Gray-100, #F2F4F7)}.bg-light-primary{background:#f6fcff!important}.card-layer{gap:16px!important;opacity:1!important;padding:16px!important;border-radius:16px!important;border-width:1px!important;background:#fff;border:1px solid #EAECF0!important}.ticket-container{width:100%;background:#fff;border-radius:12px;padding:0;font-family:Inter,sans-serif}.ticket-header{display:flex;justify-content:space-between;align-items:center;border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;padding:16px 20px;font-weight:600}.footfall-value{font-weight:600;font-size:20px;line-height:30px;letter-spacing:0%;vertical-align:middle;color:#101828}.issue-date{font-size:14px;color:#666}.timeline{width:1.5px;height:15px;background:#d0d5dd;margin-left:33px}.timeline-new{width:1px;height:70px;background:#d0d5dd;margin-left:30px;font-weight:600}.revision-card{background:#fff;border:1px solid #eaeaea;border-radius:12px;padding:0 20px}.user-info{display:flex;align-items:center}.avatar{width:42px;height:40px;border-radius:50%;margin-right:15px;font-size:14px;color:#1d2939;font-weight:600}.user-name{font-size:13px;color:#555}.user-email{font-size:12px;color:#888;margin-top:2px}.values-row{display:flex;justify-content:space-between;flex-wrap:wrap}.value-block{min-width:90px;margin:10px 0}.value{font-size:20px;font-weight:700}.label{font-size:14px;color:#1d2939;margin-top:3px}.accuracy{font-size:18px!important}.accuracy.up,.accuracy.down{color:#00a3ff}.footfall-label{font-weight:700;font-size:14px;line-height:20px;letter-spacing:0%;vertical-align:middle;color:#344054!important}.duplicate-layer{gap:10px;opacity:1;padding:16px;border-bottom-width:1px;border-bottom:1px solid #F2F4F7;background:#fff}.layer-approved{border-color:#a6f4c5!important;box-shadow:0 0 0 2.29px #a6f4c5}.layer-rejected{border-color:#fda29b!important;box-shadow:0 0 0 2.29px #fda29b}.layers{border-radius:8px;border-width:1px;opacity:1;border:1px solid #EAECF0;background:#fcfcfd;margin:12px}.btn-primary{font-size:13px!important;padding:5px 15px!important}.accordion-header{cursor:pointer}svg.rotated{transform:rotate(180deg);transition:transform .3s ease}.accordion-body{animation:fadeIn .25s ease}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.ellipsis-underline{max-width:120px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:underline;cursor:pointer;display:inline-block}table td{line-height:14px!important}.btn-filter{font-weight:600;font-size:14px;line-height:20px;letter-spacing:0%;text-transform:capitalize;color:#344054}.overlay{position:fixed;inset:0;background:#0000001a}.filter-card{position:absolute;right:0;background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 8px 24px #0000001f;font-size:13px}.border-primary-layers{opacity:1;gap:12px;padding-bottom:16px;background:#eaf8ff;border-radius:8px!important}.border-primary-layers .label-title{opacity:1;gap:10px;padding:8px;border-bottom-right-radius:8px!important;background:#daf1ff;font-weight:500!important;font-size:18px!important;line-height:28px!important;letter-spacing:0%;color:#000!important}.border-primary-layers .label-desc{font-weight:500;font-size:16px;line-height:28px;letter-spacing:0%;color:#008edf!important}.comment-thread{border-left:1px solid #e5e5e5;padding-left:16px}.comment-avatar{width:32px;height:32px;border-radius:50%;object-fit:cover}.tango-card{width:140px;border-radius:8px;border:1px solid #e5e5e5;overflow:hidden;background:#fff;cursor:pointer}.tango-image{height:80px;background-size:cover;background-position:center}.tango-meta{padding:6px 8px}.more-card{background:#00000008;font-weight:600}.status-dot{display:inline-block;width:10px;height:10px;border-radius:50%;margin-left:4px}.status-approve{background:#22c55e}.status-reject{background:#ef4444}.page-content{padding:16px}.filter-backdrop{position:fixed;inset:0;background:#0f172a40;z-index:998}.filter-modal{position:fixed;inset:0;display:flex;justify-content:center;align-items:center;z-index:999}.store-item-active{background-color:#eaf8ff}.store-item{padding:8px 12px 8px 10px;border-radius:6px;padding:8px 12px;gap:12px;opacity:1}.ticket-id{font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#1d2939}.store-name{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}.perc-badge{font-size:12px;min-width:48px;text-align:center}.perc-badge-normal{background-color:#f3f3f3;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;color:#344054}.perc-badge-active{background-color:#d9ecff;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;color:#009bf3}.border-selectall{padding:8px 10px;border-radius:12px;background:#f7f7f7}.reviewer-label{font-size:12px;color:gray}.sort-arrow{font-size:10px;line-height:1}.modal-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#1d2939}.test-appvalue{color:#1d2939;font-weight:400;font-size:16px;line-height:24px;letter-spacing:0%}.light-primary{background:#eaf8ff!important}\n"] }]
|
|
896
|
+
}], ctorParameters: () => [{ type: i1.NgbModal }, { type: i2.GlobalStateService }, { type: i3.TicketService }, { type: i0.ChangeDetectorRef }, { type: i4.ExcelService }, { type: i5.ToastService }, { type: i6.FormBuilder }], propDecorators: { filterChange: [{
|
|
897
|
+
type: Output
|
|
898
|
+
}], zoomPopup: [{
|
|
899
|
+
type: ViewChild,
|
|
900
|
+
args: ["zoomPopup"]
|
|
901
|
+
}] } });
|
|
902
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LWZvb3RmYWxsLW5ldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdGlja2V0cy9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0LWZvb3RmYWxsLW5ldy90aWNrZXQtZm9vdGZhbGwtbmV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS10aWNrZXRzL3NyYy9saWIvY29tcG9uZW50cy90aWNrZXQtZm9vdGZhbGwtbmV3L3RpY2tldC1mb290ZmFsbC1uZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFLVCxZQUFZLEVBQ1osTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssT0FBTyxNQUFNLDBCQUEwQixDQUFDO0FBRXBELE9BQU8sa0JBQWtCLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFHcEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQU0xQyxPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFNckMsTUFBTSxPQUFPLDBCQUEwQjtJQU0zQjtJQUNEO0lBQ0M7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQVhWLFdBQVcsR0FBUSxFQUFFLENBQUM7SUFDdEIsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixhQUFhLEdBQVcsQ0FBQyxDQUFDO0lBQ1QsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDMUMsWUFDVSxZQUFzQixFQUN2QixFQUFzQixFQUNyQixPQUFzQixFQUN0QixFQUFxQixFQUNyQixZQUEwQixFQUMxQixFQUFnQixFQUNoQixFQUFl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Q3JCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckMsaUVBQWlFO1FBQ2pFLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpELElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLGFBQWE7U0FDaEU7UUFFRCw4Q0FBOEM7UUFDOUMsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoRCxDQUFDO3dHQXZnQ1ksMEJBQTBCOzRGQUExQiwwQkFBMEIsa05DN0J2Qyw4anBJQXUyRGM7OzRGRDEwREQsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHlCQUF5QjswUEF3T3pCLFlBQVk7c0JBQXJCLE1BQU07Z0JBOGpCaUIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPdXRwdXQsXHJcbiAgRWxlbWVudFJlZixcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0ICogYXMgYW00Y29yZSBmcm9tIFwiQGFtY2hhcnRzL2FtY2hhcnRzNC9jb3JlXCI7XHJcbmltcG9ydCAqIGFzIGFtNGNoYXJ0cyBmcm9tIFwiQGFtY2hhcnRzL2FtY2hhcnRzNC9jaGFydHNcIjtcclxuaW1wb3J0IGFtNHRoZW1lc19hbmltYXRlZCBmcm9tIFwiQGFtY2hhcnRzL2FtY2hhcnRzNC90aGVtZXMvYW5pbWF0ZWRcIjtcclxuaW1wb3J0IHsgRm9vdGZhbGxQb3B1cENvbXBvbmVudCB9IGZyb20gXCIuLi9mb290ZmFsbC1wb3B1cC9mb290ZmFsbC1wb3B1cC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVGlja2V0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy90aWNrZXQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBFeGNlbFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvZXhjZWwuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5hbTRjb3JlLnVzZVRoZW1lKGFtNHRoZW1lc19hbmltYXRlZCk7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi10aWNrZXQtZm9vdGZhbGwtbmV3XCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi90aWNrZXQtZm9vdGZhbGwtbmV3LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi90aWNrZXQtZm9vdGZhbGwtbmV3LmNvbXBvbmVudC5zY3NzXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaWNrZXRGb290ZmFsbE5ld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBzZWFyY2hWYWx1ZTogYW55ID0gXCJcIjtcclxuICBzb3J0ZWRDb2x1bW46IHN0cmluZyA9IFwiXCI7XHJcbiAgc29ydERpcmVjdGlvbjogbnVtYmVyID0gMTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBUaWNrZXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGV4Y2VsU2VydmljZTogRXhjZWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0czogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXJcclxuICApIHt9XHJcbiAgaGVhZGVyRmlsdGVyczogYW55O1xyXG4gIGZvb3RmYWxsTGlzdF9yZXE6IGFueTtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW1hZ2VVcmwgPSB0aGlzLnNlcnZpY2U/LmZvb3RmYWxsQ0ROO1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZT8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpPy5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgIHRoaXMuaGVhZGVyRmlsdGVycyA9IGRhdGE7XHJcbiAgICAgICAgICB0aGlzLmZvb3RmYWxsTGlzdF9yZXEgPSB7XHJcbiAgICAgICAgICAgIGNsaWVudDogdGhpcy5oZWFkZXJGaWx0ZXJzLmNsaWVudHMudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgZnJvbURhdGU6IHRoaXMuaGVhZGVyRmlsdGVycz8uZGF0ZT8uc3RhcnREYXRlLFxyXG4gICAgICAgICAgICB0b0RhdGU6IHRoaXMuaGVhZGVyRmlsdGVycz8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLmdldFRpY2tldFN1bW1hcnkoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGlja2V0TGlzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YTogYW55O1xyXG4gIGdldFRpY2tldFN1bW1hcnkoKSB7XHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLmdldFRpY2tldFN1bW1hcnlBcGkoXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLmNsaWVudCxcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTGlzdF9yZXEuZnJvbURhdGUsXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLnRvRGF0ZVxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcz8uZGF0YSAmJiByZXM/LmRhdGE/LnJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEZvb3RmYWxsU3VtbWFyeURhdGEgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YSA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5nZXRGb290ZmFsbFN1bW1hcnlEYXRhID0gW107XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5nZXRGb290ZmFsbFN1bW1hcnlEYXRhLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBvZmZzZXQgPSAwO1xyXG4gIGxpbWl0ID0gMTA7XHJcbiAgaXNFeHBvcnQ6IGFueSA9IGZhbHNlO1xyXG4gIGZvb3RmYWxsTGlzdERhdGE6IGFueTtcclxuICB0b3RhbEl0ZW1zOiBhbnk7XHJcbiAgcGFnaW5hdGlvblNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG4gIGxvYWRpbmcgPSB0cnVlO1xyXG4gIG5vRGF0YSA9IGZhbHNlO1xyXG4gIHRhbmdvVHlwZTogYW55ID0gXCJzdG9yZVwiO1xyXG4gIGdldFRpY2tldExpc3QoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHRoaXMuc2VhcmNoVmFsdWU/LnRyaW0oKSB8fCBcIlwiO1xyXG4gICAgdGhpcy5vZmZzZXQgPSB0aGlzLm9mZnNldCB8fCAxO1xyXG4gICAgdGhpcy5saW1pdCA9IHRoaXMubGltaXQgfHwgMTA7XHJcbiAgICB0aGlzLmlzRXhwb3J0ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLmdldFRpY2tldExpc3RBcGkoXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLmNsaWVudCxcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTGlzdF9yZXEuZnJvbURhdGUsXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLnRvRGF0ZSxcclxuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLFxyXG4gICAgICAgIHRoaXMubGltaXQsXHJcbiAgICAgICAgdGhpcy5vZmZzZXQsXHJcbiAgICAgICAgdGhpcy5pc0V4cG9ydCxcclxuICAgICAgICB0aGlzLnNvcnRlZENvbHVtbixcclxuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb24sXHJcbiAgICAgICAgdGhpcy50YW5nb1R5cGVcclxuICAgICAgKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9EYXRhID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmZvb3RmYWxsTGlzdERhdGEgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHJlcz8uZGF0YT8uY291bnQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRvdGFsSXRlbXMgPCAxMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNpemVzID0gW3RoaXMudG90YWxJdGVtc107XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0RGF0YSA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGN1cnJlbnRQYWdlOiBhbnkgPSAxO1xyXG4gIHBhZ2VTaXplOiBhbnkgPSAxMDtcclxuICBvblBhZ2VDaGFuZ2UocGFnZU9mZnNldDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gTnVtYmVyKHBhZ2VPZmZzZXQpO1xyXG4gICAgdGhpcy5vZmZzZXQgPSBOdW1iZXIocGFnZU9mZnNldCk7XHJcbiAgICAvLyB0aGlzLmxpbWl0ID0gMTA7XHJcbiAgICB0aGlzLmdldFRpY2tldExpc3QoKTtcclxuICB9XHJcblxyXG4gIG9uUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IG51bWJlcikge1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IE51bWJlcihwYWdlU2l6ZSk7XHJcbiAgICB0aGlzLmxpbWl0ID0gTnVtYmVyKHBhZ2VTaXplKTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5vZmZzZXQgPSAxO1xyXG4gICAgdGhpcy5nZXRUaWNrZXRMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBzZXRwYWdlU2l6ZSgpIHtcclxuICAgIGlmICh0aGlzLnRvdGFsSXRlbXMgPCAxMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGFnZVNpemU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNlYXJjaERhdGEoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMub2Zmc2V0ID0gMTtcclxuICAgIHRoaXMubGltaXQgPSAxMDtcclxuICAgIHRoaXMuZ2V0VGlja2V0TGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0WExTWCgpIHtcclxuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB0aGlzLnNlYXJjaFZhbHVlPy50cmltKCkgfHwgXCJcIjtcclxuICAgIHRoaXMub2Zmc2V0ID0gMTtcclxuICAgIHRoaXMubGltaXQgPSAxMDAwMDtcclxuICAgIHRoaXMuaXNFeHBvcnQgPSB0cnVlO1xyXG4gICAgdGhpcy5zZXJ2aWNlXHJcbiAgICAgIC5nZXRUaWNrZXRMaXN0RXhwb3J0QXBpKFxyXG4gICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0X3JlcS5jbGllbnQsXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLmZyb21EYXRlLFxyXG4gICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0X3JlcS50b0RhdGUsXHJcbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSxcclxuICAgICAgICB0aGlzLmxpbWl0LFxyXG4gICAgICAgIHRoaXMub2Zmc2V0LFxyXG4gICAgICAgIHRoaXMuaXNFeHBvcnQsXHJcbiAgICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4sXHJcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uLFxyXG4gICAgICAgIHRoaXMudGFuZ29UeXBlXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXhjZWxTZXJ2aWNlLnNhdmVBc0V4Y2VsRmlsZShyZXMsIFwiZm9vdGZhbGwgZGlyZWN0b3J5IHRpY2tldCBcIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIFwiRXJyb3IgZXhwb3J0aW5nIGRhdGE6XCIgKyBlcnIuZXJyb3IgPyBlcnIuZXJyb3IgOiBlcnIubWVzc2FnZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU29ydChjb2x1bW46IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuc29ydGVkQ29sdW1uID09PSBjb2x1bW4pIHtcclxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gdGhpcy5zb3J0RGlyZWN0aW9uID09PSAxID8gLTEgOiAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSBjb2x1bW47XHJcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdldFRpY2tldExpc3QoKTtcclxuICB9XHJcbiAgc2VsZWN0ID0gXCJ0aWNrZXRMaXN0XCI7XHJcbiAgdGlja2V0RGF0YTogYW55O1xyXG5cclxuICBzdGFydEF1ZGl0KCkge1xyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgdG90YWxmaWxlczogdGhpcy50aWNrZXREYXRhPy5mb290ZmFsbCxcclxuICAgICAgZmlsZWRldGFpbHM6IHtcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJGaWx0ZXJzPy5jbGllbnQsXHJcbiAgICAgICAgc3RvcmVJZDogdGhpcy50aWNrZXREYXRhPy5zdG9yZUlkLFxyXG4gICAgICAgIERhdGU6IHRoaXMudGlja2V0RGF0YT8uaXNzdWVEYXRlLFxyXG4gICAgICAgIGF1ZGl0SWQ6IFwiXCIsXHJcbiAgICAgICAgdXNlcklkOiBcIlwiLFxyXG4gICAgICAgIG5leHRUb2tlbjogXCJcIixcclxuICAgICAgfSxcclxuICAgICAgYXVkaXRJZDogXCJcIixcclxuICAgICAgc3RvcmVkZXRhaWxzOiB7XHJcbiAgICAgICAgc3RvcmVOYW1lOiB0aGlzLnRpY2tldERhdGE/LnN0b3JlTmFtZSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwidG90YWxmaWxlc1wiLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgfVxyXG4gIGJhY2tUb05hdmlnYXRpb24oKSB7XHJcbiAgICB0aGlzLnNlbGVjdCA9IFwidGlja2V0TGlzdFwiO1xyXG4gICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhID0gW107XHJcbiAgICB0aGlzLmdldFRpY2tldExpc3QoKTtcclxuICAgIHRoaXMuY2xvc2VCdG4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNDaGVja2JveEVuYWJsZSA9IGZhbHNlO1xyXG4gIH1cclxuICBpc0NvbGxhcHNlZCA9IGZhbHNlO1xyXG4gIHRvZ2dsZVNpZGViYXIoKSB7XHJcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVGaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmlzRmlsdGVyT3BlbiA9ICF0aGlzLmlzRmlsdGVyT3BlbjtcclxuICB9XHJcbiAgaXNGaWx0ZXJPcGVuID0gZmFsc2U7IC8vIGNvbnRyb2xzIHNob3cvaGlkZSBwYW5lbFxyXG4gIGZpbHRlckZvcm06IEZvcm1Hcm91cDtcclxuICBAT3V0cHV0KCkgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgbmV3Rm9ybSgpIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBzdGF0dXM6IFtcIlwiXSxcclxuICAgICAgcmV2aWV3ZXJDb25kaXRpb246IFtcIlwiXSxcclxuICAgICAgcmV2aWV3ZXJWYWx1ZTogW1wiXCJdLFxyXG4gICAgICBhcHByb3ZlckNvbmRpdGlvbjogW1wiXCJdLFxyXG4gICAgICBhcHByb3ZlclZhbHVlOiBbXCJcIl0sXHJcbiAgICAgIHRhbmdvQ29uZGl0aW9uOiBbXCJcIl0sXHJcbiAgICAgIHRhbmdvVmFsdWU6IFtcIlwiXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlGaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHRoaXMuZmlsdGVyRm9ybS52YWx1ZSk7XHJcbiAgICB0aGlzLmlzRmlsdGVyT3BlbiA9IGZhbHNlOyAvLyBjbG9zZSBhZnRlciBhcHBseVxyXG4gIH1cclxuXHJcbiAgcmVzZXRGaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmZpbHRlckZvcm0ucmVzZXQoKTtcclxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXJGb3JtLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy5pc0ZpbHRlck9wZW4gPSBmYWxzZTtcclxuICB9XHJcbiAgU3RvcmVzU2VhcmNoVmFsdWU6IGFueSA9IFwiXCI7XHJcbiAgc29ydGVkQ29sdW1uMTogc3RyaW5nID0gXCJcIjtcclxuICBzb3J0RGlyZWN0aW9uMTogbnVtYmVyID0gMTtcclxuXHJcblxyXG4gIHNlYXJjaFN0b3Jlc0RhdGEoKSB7fVxyXG4gIHNvcnRWYWx1ZShjb2x1bW46IHN0cmluZykge31cclxub3BlblRpY2tldHNMaXN0OiBhbnlbXSA9IFtdO1xyXG5zZWxlY3RlZFN0b3JlczogYW55W10gPSBbXTsgICAgICAvLyBob2xkcyBzZWxlY3RlZCByb3dzXHJcbmFsbFNlbGVjdGVkID0gZmFsc2U7ICAgICAgICAgICAgIC8vIHRvcCBcIlNlbGVjdCBBbGxcIiBjaGVja2JveFxyXG5cclxuZ2V0IHN0b3JlQ291bnQoKTogbnVtYmVyIHtcclxuICByZXR1cm4gdGhpcy5vcGVuVGlja2V0c0xpc3Q/Lmxlbmd0aCB8fCAwO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiBhIHJvdyBpcyBzZWxlY3RlZCAodXNlZCBpbiB0ZW1wbGF0ZSlcclxuaXNTZWxlY3RlZChzdG9yZTogYW55KTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTdG9yZXMuaW5jbHVkZXMoc3RvcmUpO1xyXG59XHJcblxyXG4vLyDwn5S5IGNvbW1vbiBoYW5kbGVyIHdoZW4gYSBzdG9yZSBiZWNvbWVzIHNlbGVjdGVkXHJcbnByaXZhdGUgaGFuZGxlU3RvcmVTZWxlY3RlZChzdG9yZTogYW55KSB7XHJcbiAgLy8geW91ciBBUEkvZGV0YWlsIGNhbGwgZm9yIHRoYXQgdGlja2V0XHJcbiAgdGhpcy5kYXRhU3RvcmVWaWV3KHN0b3JlKTsgICAgIC8vIG9yIHN0b3JlLnRpY2tldElkIGlmIG5lZWRlZFxyXG59XHJcblxyXG4vLyB3aGVuIHVzZXIgY2xpY2tzIG9uIGEgc2luZ2xlIHN0b3JlIGNoZWNrYm94XHJcbnRvZ2dsZVN0b3JlU2VsZWN0aW9uKHN0b3JlOiBhbnkpOiB2b2lkIHtcclxuICBpZiAodGhpcy5pc1NlbGVjdGVkKHN0b3JlKSkge1xyXG4gICAgLy8gcmVtb3ZlXHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVzID0gdGhpcy5zZWxlY3RlZFN0b3Jlcy5maWx0ZXIocyA9PiBzICE9PSBzdG9yZSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIGFkZCAoaWYgeW91IHdhbnQgc2luZ2xlIHNlbGVjdCwgdXNlOiB0aGlzLnNlbGVjdGVkU3RvcmVzID0gW3N0b3JlXTspXHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVzID0gWy4uLnRoaXMuc2VsZWN0ZWRTdG9yZXMsIHN0b3JlXTtcclxuXHJcbiAgICAvLyBjYWxsIEFQSSBmb3IgdGhpcyBzdG9yZVxyXG4gICAgdGhpcy5oYW5kbGVTdG9yZVNlbGVjdGVkKHN0b3JlKTtcclxuICB9XHJcblxyXG4gIC8vIGtlZXAgXCJTZWxlY3QgQWxsXCIgaW4gc3luY1xyXG4gIHRoaXMuYWxsU2VsZWN0ZWQgPVxyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IHRoaXMub3BlblRpY2tldHNMaXN0Lmxlbmd0aCAmJlxyXG4gICAgdGhpcy5vcGVuVGlja2V0c0xpc3QubGVuZ3RoID4gMDtcclxufVxyXG5cclxuLy8gd2hlbiB1c2VyIGNsaWNrcyBvbiBcIlNlbGVjdCBBbGxcIlxyXG50b2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XHJcbiAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQpIHtcclxuICAgIC8vIHVuc2VsZWN0IGV2ZXJ5dGhpbmdcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBbXTtcclxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gc2VsZWN0IGFsbCB2aXNpYmxlIHN0b3Jlc1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IFsuLi50aGlzLm9wZW5UaWNrZXRzTGlzdF07XHJcbiAgICB0aGlzLmFsbFNlbGVjdGVkID0gdHJ1ZTtcclxuICAgIC8vIHVzdWFsbHkgbm8gbmVlZCB0byBjYWxsIGRldGFpbCBBUEkgaGVyZSwgYnV0IHlvdSBjYW4gaWYgeW91IHdhbnRcclxuICB9XHJcbn1cclxuXHJcblxyXG4gIG9yaWdpbmFsSW1hZ2U6IGFueSA9IHtcclxuICAgIGlkOiA0LFxyXG4gICAgZW50cnlUaW1lOiBcIjEwOjAwIEFNXCIsXHJcbiAgfTtcclxuICB0aWNrZXQ6IGFueSA9IFtdO1xyXG4gIGltYWdlVXJsOiBhbnk7XHJcbiAgZ2V0Rm9ybWF0dGVkRW50cnlUaW1lKGVudHJ5VGltZTogYW55KSB7XHJcbiAgICBpZiAoIWVudHJ5VGltZSkgcmV0dXJuIFwiLVwiO1xyXG4gICAgY29uc3QgW2hvdXJzLCBtaW51dGVzLCBzZWNvbmRzXSA9IGVudHJ5VGltZS5zcGxpdChcIjpcIikubWFwKE51bWJlcik7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIGRhdGUuc2V0SG91cnMoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpO1xyXG4gICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKFwiZW4tVVNcIiwge1xyXG4gICAgICBob3VyOiBcIjItZGlnaXRcIixcclxuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcclxuICAgICAgLy8gc2Vjb25kOiAnMi1kaWdpdCcsXHJcbiAgICAgIGhvdXIxMjogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBkdXBsaWNhdGVzOiBhbnk7XHJcblxyXG4gIC8vIGtleSA9IHBhcmVudCBvcmlnaW5hbC50ZW1wSWQsIHZhbHVlID0gYXJyYXkgb2Ygc2VsZWN0ZWQgZHVwbGljYXRlIHRlbXBJZHNcclxuICBzZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudDogeyBbcGFyZW50SWQ6IG51bWJlcl06IG51bWJlcltdIH0gPSB7fTtcclxuXHJcbiAgLy8gaXMgb25lIGR1cGxpY2F0ZSBzZWxlY3RlZD9cclxuICBpc0R1cGxpY2F0ZVNlbGVjdGVkKHBhcmVudElkOiBudW1iZXIsIGR1cGxpY2F0ZUlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdPy5pbmNsdWRlcyhkdXBsaWNhdGVJZCkgfHwgZmFsc2VcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBzZWxlY3QgLyB1bnNlbGVjdCBzaW5nbGUgZHVwbGljYXRlXHJcbiAgb25EdXBsaWNhdGVDaGVja2JveENoYW5nZShcclxuICAgIHBhcmVudElkOiBudW1iZXIsXHJcbiAgICBkdXBsaWNhdGVJZDogbnVtYmVyLFxyXG4gICAgZXZlbnQ6IEV2ZW50XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG5cclxuICAgIGlmICghdGhpcy5zZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudFtwYXJlbnRJZF0pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudFtwYXJlbnRJZF0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5zZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudFtwYXJlbnRJZF07XHJcblxyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgaWYgKCFsaXN0LmluY2x1ZGVzKGR1cGxpY2F0ZUlkKSkge1xyXG4gICAgICAgIGxpc3QucHVzaChkdXBsaWNhdGVJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdID0gbGlzdC5maWx0ZXIoXHJcbiAgICAgICAgKGlkKSA9PiBpZCAhPT0gZHVwbGljYXRlSWRcclxuICAgICAgKTtcclxuICAgIH1cclxudGhpcy51cGRhdGVPdmVyYWxsU2VsZWN0ZWRJZHMoKTsgXHJcbiAgICBjb25zb2xlLmxvZyhcIlNlbGVjdGVkIGR1cGxpY2F0ZXMgbWFwOlwiLCB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50KTtcclxuICB9XHJcblxyXG4gIC8vIGFyZSAqYWxsKiBkdXBsaWNhdGVzIHVuZGVyIHRoaXMgcGFyZW50IHNlbGVjdGVkP1xyXG4gIGFyZUFsbER1cGxpY2F0ZXNTZWxlY3RlZChvcmlnaW5hbDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYXJlbnRJZCA9IG9yaWdpbmFsLnRlbXBJZDtcclxuICAgIGNvbnN0IGR1cGxpY2F0ZXMgPSBvcmlnaW5hbD8uZHVwbGljYXRlSW1hZ2UgfHwgW107XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdIHx8IFtdO1xyXG5cclxuICAgIHJldHVybiBkdXBsaWNhdGVzLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWQubGVuZ3RoID09PSBkdXBsaWNhdGVzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vIGhhbmRsZSBcIlNlbGVjdCBBbGxcIiB0b2dnbGUgZm9yIHRoaXMgb3JpZ2luYWxcclxuICBvblRvZ2dsZVNlbGVjdEFsbER1cGxpY2F0ZXMob3JpZ2luYWw6IGFueSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgY29uc3QgcGFyZW50SWQgPSBvcmlnaW5hbC50ZW1wSWQ7XHJcbiAgICBjb25zdCBkdXBsaWNhdGVzID0gb3JpZ2luYWw/LmR1cGxpY2F0ZUltYWdlIHx8IFtdO1xyXG5cclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdID0gZHVwbGljYXRlcy5tYXAoXHJcbiAgICAgICAgKGQ6IGFueSkgPT4gZC50ZW1wSWRcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdID0gW107XHJcbiAgICB9XHJcbiB0aGlzLnVwZGF0ZU92ZXJhbGxTZWxlY3RlZElkcygpOyBcclxuICAgIGNvbnNvbGUubG9nKFwiU2VsZWN0ZWQgZHVwbGljYXRlcyBtYXA6XCIsIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8gY29tbWVudHM6IGFueTtcclxuXHJcbiAgY29tbWVudE1vZGFsKG9iajogYW55KSB7XHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRm9vdGZhbGxQb3B1cENvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgIH0pO1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGlja2V0SWQgPSBvYmoudGlja2V0SWQ7XHJcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7fSk7XHJcbiAgfVxyXG5cclxuICBjb21tZW50c0FjY29yZGlvbk9wZW4gPSBmYWxzZTtcclxuXHJcbiAgdG9nZ2xlQ29tbWVudHNBY2NvcmRpb24oKSB7XHJcbiAgICB0aGlzLmNvbW1lbnRzQWNjb3JkaW9uT3BlbiA9ICF0aGlzLmNvbW1lbnRzQWNjb3JkaW9uT3BlbjtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgY29tbWVudHM6IGFueSA9IFtcclxuICAgIHtcclxuICAgICAgZW1haWw6IFwicnlhbkBsZW5za2FydC5jb21cIixcclxuICAgICAgYXZhdGFyOiBcImFzc2V0cy9hdmF0YXJzL3J5YW4ucG5nXCIsXHJcbiAgICAgIHRpbWU6IFwiMjAyNS0wMS0yMFQxMDo1MzozNFwiLFxyXG4gICAgICBtYWluVGV4dDogXCJBbGwgdGhlIHRocmVlIGFyZSBzYW1lLlwiLFxyXG4gICAgICBzdGF0dXNMYWJlbDogbnVsbCwgLy8gbm8g4oCcTWFya2VkIGFzIOKApuKAnSBsaW5lXHJcbiAgICAgIHN0YXR1c1R5cGU6IG51bGwsXHJcbiAgICAgIG5vdGU6IG51bGwsXHJcbiAgICAgIGltYWdlczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHVybDogXCJhc3NldHMvaW1nMS5qcGdcIixcclxuICAgICAgICAgIHRhbmdvSWQ6IDQsXHJcbiAgICAgICAgICBlbnRyeVRpbWU6IFwiMTA6MTAgQU1cIixcclxuICAgICAgICAgIHN0YXR1czogXCJyZWplY3RcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHVybDogXCJhc3NldHMvaW1nMi5qcGdcIixcclxuICAgICAgICAgIHRhbmdvSWQ6IDQsXHJcbiAgICAgICAgICBlbnRyeVRpbWU6IFwiMTA6MTAgQU1cIixcclxuICAgICAgICAgIHN0YXR1czogXCJyZWplY3RcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIG1vcmUgaW1hZ2VzIGlmIHlvdSB3YW50XHJcbiAgICAgIF0sXHJcbiAgICAgIG1vcmVDb3VudDogMTIsIC8vIGZvciB0aGUgKzEyIGNhcmRcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGVtYWlsOiBcImRyZXdAbGVuc2thcnQuY29tXCIsXHJcbiAgICAgIGF2YXRhcjogXCJhc3NldHMvYXZhdGFycy9kcmV3LnBuZ1wiLFxyXG4gICAgICB0aW1lOiBcIjIwMjUtMDEtMjBUMTA6NTM6MzRcIixcclxuICAgICAgbWFpblRleHQ6IG51bGwsXHJcbiAgICAgIHN0YXR1c0xhYmVsOiBcIlJlamVjdFwiLFxyXG4gICAgICBzdGF0dXNUeXBlOiBcImRhbmdlclwiLCAvLyBmb3IgcmVkIHRleHRcclxuICAgICAgbm90ZTogXCJOb3QgYWdyZWVkLCBzZWVtcyBub3QgZHVwbGljYXRlLlwiLFxyXG4gICAgICBpbWFnZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB1cmw6IFwiYXNzZXRzL2ltZzEuanBnXCIsXHJcbiAgICAgICAgICB0YW5nb0lkOiA0LFxyXG4gICAgICAgICAgZW50cnlUaW1lOiBcIjEwOjEwIEFNXCIsXHJcbiAgICAgICAgICBzdGF0dXM6IFwicmVqZWN0XCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB1cmw6IFwiYXNzZXRzL2ltZzIuanBnXCIsXHJcbiAgICAgICAgICB0YW5nb0lkOiA0LFxyXG4gICAgICAgICAgZW50cnlUaW1lOiBcIjEwOjEwIEFNXCIsXHJcbiAgICAgICAgICBzdGF0dXM6IFwicmVqZWN0XCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgICAgbW9yZUNvdW50OiAxMixcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGVtYWlsOiBcIm9ybGFuZG9AbGVuc2thcnQuY29tXCIsXHJcbiAgICAgIGF2YXRhcjogXCJhc3NldHMvYXZhdGFycy9vcmxhbmRvLnBuZ1wiLFxyXG4gICAgICB0aW1lOiBcIjIwMjUtMDEtMjBUMTA6NTM6MzRcIixcclxuICAgICAgbWFpblRleHQ6IG51bGwsXHJcbiAgICAgIHN0YXR1c0xhYmVsOiBcIkFwcHJvdmVkXCIsXHJcbiAgICAgIHN0YXR1c1R5cGU6IFwic3VjY2Vzc1wiLCAvLyBncmVlblxyXG4gICAgICBub3RlOiBcIkFncmVlZCwgaGVuY2UgYXBwcm92aW5nIHRoZSAzXCIsXHJcbiAgICAgIGltYWdlczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHVybDogXCJhc3NldHMvaW1nMS5qcGdcIixcclxuICAgICAgICAgIHRhbmdvSWQ6IDQsXHJcbiAgICAgICAgICBlbnRyeVRpbWU6IFwiMTA6MTAgQU1cIixcclxuICAgICAgICAgIHN0YXR1czogXCJhcHByb3ZlXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB1cmw6IFwiYXNzZXRzL2ltZzIuanBnXCIsXHJcbiAgICAgICAgICB0YW5nb0lkOiA0LFxyXG4gICAgICAgICAgZW50cnlUaW1lOiBcIjEwOjEwIEFNXCIsXHJcbiAgICAgICAgICBzdGF0dXM6IFwiYXBwcm92ZVwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIG1vcmVDb3VudDogMCxcclxuICAgIH0sXHJcbiAgXTtcclxuXHJcbiAgc2hvd1JldmlzZWREZXRhaWxzID0gZmFsc2U7XHJcbiAgZm9vdGZhbGxOb0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb290ZmFsbExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb290ZmFsbG9mZnNldCA9IDE7XHJcbiAgZm9vdGZhbGxsaW1pdCA9IDE7XHJcbiAgdG90YWxJdGVtc0Zvb3RmYWxsOiBhbnkgPSAwO1xyXG4gIGRhdGFJbmRleElkOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGRhdGVTdHJpbmc6IHN0cmluZyA9IFwiXCI7XHJcbiAgc3RvcmVJZFZhbHVlOiBhbnkgPSBbXTtcclxuICBsYXN0U2VsZWN0ZWRUaWNrZXQ6IGFueTtcclxuICBzZWxlY3RlVmFsdWVzOiBhbnkgPSBcIlwiO1xyXG4gIGhhc0luaXRpYWxTdG9yZVN5bmNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwYWdlU2l6ZUZvb3RmYWxsOiBudW1iZXIgPSAxMDtcclxuICBwYWdpbmF0aW9uU2l6ZXNGb290ZmFsbDogbnVtYmVyW10gPSBbMTAsIDIwLCAzMF07XHJcbiAgYWRkU3RvcmVJZk5vdEV4aXN0cyhzdG9yZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5oYXNJbml0aWFsU3RvcmVTeW5jZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzdG9yZUlkID0gc3RvcmU/LnN0b3JlSWQ7XHJcbiAgICBpZiAoc3RvcmVJZCAmJiAhdGhpcy5zZWxlY3RlZFN0b3Jlcy5pbmNsdWRlcyhzdG9yZUlkKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU3RvcmVzLnB1c2goc3RvcmVJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oYXNJbml0aWFsU3RvcmVTeW5jZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5hbGxTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSB0aGlzLm9wZW5UaWNrZXRzTGlzdC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBoYXNSZXZvcHNUeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5mb290ZmFsbFRpY2tldHNEYXRhKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YS5zb21lKCh0aWNrZXQ6IGFueSkgPT5cclxuICAgICAgdGlja2V0Py5fc291cmNlPy5tYXBwaW5nSW5mbz8uc29tZSgobWFwcGluZzogYW55KSA9PlxyXG4gICAgICAgIChtYXBwaW5nPy5yZXZpc2VkRGV0YWlsIHx8IFtdKS5zb21lKChyOiBhbnkpID0+IHI/LnJldm9wc1R5cGUgPT09IHR5cGUpXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvdmVyYWxsU2VsZWN0ZWRJZHM6IGFueTtcclxuICBvdmVyYWxsU2VsZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgICBjb25zdCBwYXJlbnRzID0gdGhpcy5nZXRBbGxQYXJlbnRJdGVtcygpO1xyXG5cclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIChbXCJqdW5rXCIsIFwiZW1wbG95ZWVcIiwgXCJob3VzZUtlZXBpbmdcIl0gYXMgY29uc3QpLmZvckVhY2goKHR5cGUpID0+IHtcclxuICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy5nZXRMaXN0QnlUeXBlKHR5cGUpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRCeVR5cGVbdHlwZV0gPSBsaXN0Lm1hcCgoaTogYW55KSA9PiBpLnRlbXBJZCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RBbGxCeVR5cGVbdHlwZV0gPSBsaXN0Lmxlbmd0aCA+IDA7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudCA9IHt9OyAvLyByZXNldCBmaXJzdFxyXG5cclxuICAgICAgcGFyZW50c1xyXG4gICAgICAgIC5maWx0ZXIoKHA6IGFueSkgPT4gcC5yZXZvcHNUeXBlID09PSBcImR1cGxpY2F0ZVwiKVxyXG4gICAgICAgIC5mb3JFYWNoKChwOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gcC50ZW1wSWQ7XHJcbiAgICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gcC5kdXBsaWNhdGVJbWFnZSB8fCBbXTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdID0gZHVwbGljYXRlcy5tYXAoXHJcbiAgICAgICAgICAgIChkOiBhbnkpID0+IGQudGVtcElkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgLy8g8J+UuSBidWlsZCBJRHNcclxuICAgICAgdGhpcy51cGRhdGVPdmVyYWxsU2VsZWN0ZWRJZHMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGNsZWFyIGFsbFxyXG4gICAgICB0aGlzLnNlbGVjdGVkQnlUeXBlLmp1bmsgPSBbXTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEJ5VHlwZS5lbXBsb3llZSA9IFtdO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQnlUeXBlLmhvdXNlS2VlcGluZyA9IFtdO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50ID0ge307XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdEFsbEJ5VHlwZS5qdW5rID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2VsZWN0QWxsQnlUeXBlLmVtcGxveWVlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2VsZWN0QWxsQnlUeXBlLmhvdXNlS2VlcGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNlbGVjdEFsbEJ5VHlwZS5kdXBsaWNhdGUgPSBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMub3ZlcmFsbFNlbGVjdGVkSWRzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJzZWxlY3RlZEJ5VHlwZTpcIiwgdGhpcy5zZWxlY3RlZEJ5VHlwZSk7XHJcbiAgICBjb25zb2xlLmxvZyhcInNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50OlwiLCB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50KTtcclxuICB9XHJcblxyXG4gZ2V0QWxsUGFyZW50SXRlbXMoKSB7XHJcbiAgaWYgKCF0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEpIHtcclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGFsbE1hcHBpbmdzOiBhbnlbXSA9IFtdO1xyXG4gIGNvbnN0IGFsbFJldmlzZWQ6IGFueVtdID0gW107XHJcblxyXG4gIC8vIGZpcnN0IGxldmVsOiBjb2xsZWN0IGFsbCBtYXBwaW5nSW5mbyBhcnJheXNcclxuICB0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEuZm9yRWFjaCgodGlja2V0OiBhbnkpID0+IHtcclxuICAgIGNvbnN0IG1hcHBpbmdzID0gdGlja2V0Py5fc291cmNlPy5tYXBwaW5nSW5mbyB8fCBbXTtcclxuICAgIGFsbE1hcHBpbmdzLnB1c2guYXBwbHkoYWxsTWFwcGluZ3MsIG1hcHBpbmdzKTsgLy8gY29uY2F0XHJcbiAgfSk7XHJcblxyXG4gIC8vIHNlY29uZCBsZXZlbDogY29sbGVjdCBhbGwgcmV2aXNlZERldGFpbCBhcnJheXNcclxuICBhbGxNYXBwaW5ncy5mb3JFYWNoKChtYXBwaW5nOiBhbnkpID0+IHtcclxuICAgIGNvbnN0IGRldGFpbHMgPSBtYXBwaW5nPy5yZXZpc2VkRGV0YWlsIHx8IFtdO1xyXG4gICAgYWxsUmV2aXNlZC5wdXNoLmFwcGx5KGFsbFJldmlzZWQsIGRldGFpbHMpOyAvLyBjb25jYXRcclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIGFsbFJldmlzZWQ7XHJcbn1cclxuXHJcbiAgaXNDaGVja2JveEVuYWJsZSA9IGZhbHNlO1xyXG4gIGNsb3NlQnRuID0gZmFsc2U7XHJcbiAgc3RhcnRSZXZpZXcoKSB7XHJcbiAgICB0aGlzLmlzQ2hlY2tib3hFbmFibGUgPSB0cnVlOyAvLyBjYWxsIHRoaXMgb24geW91ciBcIlJldmlld1wiIGJ1dHRvbiBjbGlja1xyXG4gICAgdGhpcy5jbG9zZUJ0biA9IHRydWU7XHJcbiAgfVxyXG4gIHN0b3BSZXZpZXcoKSB7XHJcbiAgICB0aGlzLmlzQ2hlY2tib3hFbmFibGUgPSBmYWxzZTtcclxuICAgIHRoaXMuY2xvc2VCdG4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRpY2tldFZpZXcoZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy5nZXRPcGVuVGlja2V0TGlzdChkYXRhKTtcclxuICAgIHRoaXMudGlja2V0RGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLnNlbGVjdCA9IFwidGlja2V0TWV0aG9kXCI7XHJcbiAgfVxyXG4gIGRhdGFTdG9yZVZpZXcoZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhID0gW107XHJcbiAgICB0aGlzLmZvb3RmYWxsTm9EYXRhID0gZmFsc2U7XHJcbiAgICB0aGlzLmZvb3RmYWxsTG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCB0aWNrZXQgPSBkYXRhPy50aWNrZXRJZDtcclxuXHJcbiAgICAvLyBpZiAoIXRpY2tldCB8fCAhdGlja2V0Ll9zb3VyY2UpIHtcclxuICAgIC8vICAgdGhpcy5mb290ZmFsbExvYWRpbmcgPSBmYWxzZTtcclxuICAgIC8vICAgdGhpcy5mb290ZmFsbE5vRGF0YSA9IHRydWU7XHJcbiAgICAvLyAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIk5vIHRpY2tldCBkYXRhIGF2YWlsYWJsZVwiKTtcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHRoaXMubGFzdFNlbGVjdGVkVGlja2V0ID0gdGlja2V0O1xyXG4gICAgdGhpcy5hZGRTdG9yZUlmTm90RXhpc3RzKHRpY2tldCk7XHJcbiAgICB0aGlzLmltYWdlVXJsID0gdGhpcy5zZXJ2aWNlPy5mb290ZmFsbENETjtcclxuICAgIHRoaXMuc3RvcmVJZFZhbHVlID0gdGhpcy5zZWxlY3RlZFN0b3JlcztcclxuXHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLmdldFRpY2tldHNOZXdBcGkodGlja2V0KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXM/LmRhdGE/LnJlc3VsdD8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhID0gW107XHJcbiAgICAgICAgICAgICAgdGhpcy5mb290ZmFsbE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb290ZmFsbExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJObyBkYXRhIGZvdW5kIGZvciB0aGUgc2VsZWN0ZWQgZmlsdGVyc1wiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEgPSByZXM/LmRhdGE/LnJlc3VsdCA/PyBbXTtcclxuICAgICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXNGb290ZmFsbCA9IHJlcz8uZGF0YT8uY291bnQ7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZm9vdGZhbGxsaW1pdCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbMV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VTaXplRm9vdGZhbGwgPSAxO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaW1pdCA9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxJdGVtc0Zvb3RmYWxsIDwgMTAgPyB0aGlzLnRvdGFsSXRlbXNGb290ZmFsbCA6IDEwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbbGltaXRdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZUZvb3RmYWxsID0gbGltaXQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuZm9vdGZhbGxOb0RhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmZvb3RmYWxsTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5mb290ZmFsbE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZm9vdGZhbGxMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZXJyPy5lcnJvcj8uY29kZSA9PT0gNDAwKVxyXG4gICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSA/IGVycj8uZXJyb3I/Lm1lc3NhZ2UgOiBlcnI/LmVycm9yPy5lcnJvclxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhID0gW107XHJcbiAgICAgICAgICB0aGlzLmZvb3RmYWxsTm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZm9vdGZhbGxMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIGZvb3RmYWxsVGlja2V0c0RhdGE6IGFueVtdID0gW107XHJcbiAgLy8gLS0tLSBTRUxFQ1RJT04gU1RBVEUgLS0tLVxyXG5cclxuICBzZWxlY3RlZEJ5VHlwZT86IGFueSA9IHtcclxuICAgIGp1bms6IFtdLFxyXG4gICAgZW1wbG95ZWU6IFtdLFxyXG4gICAgaG91c2VLZWVwaW5nOiBbXSxcclxuICAgIGR1cGxpY2F0ZTogW10sXHJcbiAgfTtcclxuXHJcbiAgc2VsZWN0QWxsQnlUeXBlOiBhbnkgPSB7XHJcbiAgICBqdW5rOiBmYWxzZSxcclxuICAgIGVtcGxveWVlOiBmYWxzZSxcclxuICAgIGhvdXNlS2VlcGluZzogZmFsc2UsXHJcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxyXG4gIH07XHJcbiAgLy8gLS0tLSBIRUxQRVJTIC0tLS1cclxuXHJcbiAgLy8gR2V0IGFsbCByZXZpc2VkRGV0YWlsIGl0ZW1zIG9mIGEgZ2l2ZW4gdHlwZSBmcm9tIGZvb3RmYWxsVGlja2V0c0RhdGFcclxuZ2V0TGlzdEJ5VHlwZSh0eXBlOiBcImp1bmtcIiB8IFwiZW1wbG95ZWVcIiB8IFwiaG91c2VLZWVwaW5nXCIpIHtcclxuICBpZiAoIXRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YSkge1xyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgYWxsTWFwcGluZ3M6IGFueVtdID0gW107XHJcbiAgY29uc3QgYWxsUmV2aXNlZDogYW55W10gPSBbXTtcclxuXHJcbiAgLy8gY29sbGVjdCBtYXBwaW5nSW5mb1xyXG4gIHRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YS5mb3JFYWNoKCh0aWNrZXQ6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgbWFwcGluZ3MgPSB0aWNrZXQ/Ll9zb3VyY2U/Lm1hcHBpbmdJbmZvIHx8IFtdO1xyXG4gICAgYWxsTWFwcGluZ3MucHVzaC5hcHBseShhbGxNYXBwaW5ncywgbWFwcGluZ3MpO1xyXG4gIH0pO1xyXG5cclxuICAvLyBjb2xsZWN0IHJldmlzZWREZXRhaWxcclxuICBhbGxNYXBwaW5ncy5mb3JFYWNoKChtYXBwaW5nOiBhbnkpID0+IHtcclxuICAgIGNvbnN0IGRldGFpbHMgPSBtYXBwaW5nPy5yZXZpc2VkRGV0YWlsIHx8IFtdO1xyXG4gICAgYWxsUmV2aXNlZC5wdXNoLmFwcGx5KGFsbFJldmlzZWQsIGRldGFpbHMpO1xyXG4gIH0pO1xyXG5cclxuICAvLyBmaWx0ZXIgYnkgdHlwZVxyXG4gIHJldHVybiBhbGxSZXZpc2VkLmZpbHRlcigob3JpZ2luYWw6IGFueSkgPT4gb3JpZ2luYWw/LnJldm9wc1R5cGUgPT09IHR5cGUpO1xyXG59XHJcblxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU92ZXJhbGxTZWxlY3RlZElkcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkczogc3RyaW5nW10gPSBbXTtcclxuICAgIGNvbnN0IHBhcmVudHMgPSB0aGlzLmdldEFsbFBhcmVudEl0ZW1zKCk7XHJcblxyXG4gICAgLy8gLS0tLSAxKSBub3JtYWwgdHlwZXM6IGp1bmsgLyBlbXBsb3llZSAvIGhvdXNlS2VlcGluZyAtLS0tXHJcbiAgICAoW1wianVua1wiLCBcImVtcGxveWVlXCIsIFwiaG91c2VLZWVwaW5nXCJdIGFzIGNvbnN0KS5mb3JFYWNoKCh0eXBlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmdldExpc3RCeVR5cGUodHlwZSk7IC8vIGFsbCBpdGVtcyBvZiB0aGF0IHR5cGVcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRUZW1wcyA9IHRoaXMuc2VsZWN0ZWRCeVR5cGVbdHlwZV0gfHwgW107IC8vIHNlbGVjdGVkIHRlbXBJZHNcclxuXHJcbiAgICAgIGxpc3QuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkVGVtcHMuaW5jbHVkZXMoaXRlbS50ZW1wSWQpICYmIGl0ZW0uaWQpIHtcclxuICAgICAgICAgIGlkcy5wdXNoKGl0ZW0uaWQpOyAvLyBlLmcuIFwiMTEtMTcxNl8yMDI1LTExLTIwXzRcIlxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyAtLS0tIDIpIGR1cGxpY2F0ZXM6IGNoaWxkcmVuIGluc2lkZSBwYXJlbnQuZGF0YSAtLS0tXHJcbiAgICBwYXJlbnRzXHJcbiAgICAgIC5maWx0ZXIoKHA6IGFueSkgPT4gcC5yZXZvcHNUeXBlID09PSBcImR1cGxpY2F0ZVwiKVxyXG4gICAgICAuZm9yRWFjaCgocGFyZW50OiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudC50ZW1wSWQ7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDaGlsZFRlbXBzID1cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdIHx8IFtdO1xyXG5cclxuICAgICAgICAocGFyZW50LmR1cGxpY2F0ZUltYWdlIHx8IFtdKS5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRDaGlsZFRlbXBzLmluY2x1ZGVzKGNoaWxkLnRlbXBJZCkpIHtcclxuICAgICAgICAgICAgLy8gaWYgY2hpbGQgaGFzIGl0cyBvd24gaWQsIHVzZSB0aGF0LiBvdGhlcndpc2UgZmFsbGJhY2sgdG8gcGFyZW50LmlkXHJcbiAgICAgICAgICAgIGlkcy5wdXNoKGNoaWxkLmlkIHx8IHBhcmVudC5pZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMub3ZlcmFsbFNlbGVjdGVkSWRzID0gaWRzO1xyXG4gICAgY29uc29sZS5sb2coXCJvdmVyYWxsU2VsZWN0ZWRJZHM6XCIsIHRoaXMub3ZlcmFsbFNlbGVjdGVkSWRzKTtcclxuICB9XHJcbnR5cGU6YW55O1xyXG4gIC8vIFwiU2VsZWN0IGFsbFwiIC8gXCJVbnNlbGVjdCBhbGxcIiBmb3IgYSB0eXBlXHJcbnBvcHVwdmFsdWU6ICdlbXBsb3llZScgfCAnaG91c2VLZWVwaW5nJyB8ICdkdXBsaWNhdGUnIHwgJ2p1bmsnIHwgJycgPSAnJztcclxuLy8gb3IganVzdDogcG9wdXB2YWx1ZTogc3RyaW5nID0gJyc7XHJcblxyXG5vblNlbGVjdEFsbCh0eXBlOiAnanVuaycgfCAnZW1wbG95ZWUnIHwgJ2hvdXNlS2VlcGluZycsIGV2ZW50OiBhbnkpIHtcclxuICBjb25zdCBjaGVja2VkID0gZXZlbnQ/LnRhcmdldD8uY2hlY2tlZDtcclxuXHJcbiAgdGhpcy5zZWxlY3RBbGxCeVR5cGVbdHlwZV0gPSBjaGVja2VkO1xyXG4gIHRoaXMudHlwZSA9IHR5cGU7XHJcbiAgdGhpcy5wb3B1cHZhbHVlID0gdHlwZTsgICAgICAgICAgICAgIC8vIPCflLQgSU1QT1JUQU5UXHJcblxyXG4gIGNvbnN0IGxpc3QgPSB0aGlzLmdldExpc3RCeVR5cGUodHlwZSk7XHJcblxyXG4gIHRoaXMuc2VsZWN0ZWRCeVR5cGVbdHlwZV0gPSBjaGVja2VkID8gbGlzdC5tYXAoKHg6IGFueSkgPT4geC50ZW1wSWQpIDogW107XHJcblxyXG4gIHRoaXMudXBkYXRlT3ZlcmFsbFNlbGVjdGVkSWRzKCk7XHJcbiAgY29uc29sZS5sb2codGhpcy5zZWxlY3RlZEJ5VHlwZSk7XHJcbn1cclxuXHJcbi8vIFNpbmdsZSBjaGVja2JveCBjaGFuZ2UgZm9yIG9uZSBpbWFnZVxyXG5vbkltYWdlQ2hlY2tib3hDaGFuZ2UodHlwZTogJ2p1bmsnIHwgJ2VtcGxveWVlJyB8ICdob3VzZUtlZXBpbmcnLCBpZDogYW55KSB7XHJcbiAgY29uc3QgYXJyID0gdGhpcy5zZWxlY3RlZEJ5VHlwZVt0eXBlXTtcclxuICBjb25zdCBpbmRleCA9IGFyci5pbmRleE9mKGlkKTtcclxuXHJcbiAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpOyAvLyByZW1vdmVcclxuICB9IGVsc2Uge1xyXG4gICAgYXJyLnB1c2goaWQpOyAvLyBhZGRcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZSBcInNlbGVjdCBhbGxcIiBzdGF0ZVxyXG4gIGNvbnN0IHRvdGFsID0gdGhpcy5nZXRMaXN0QnlUeXBlKHR5cGUpLmxlbmd0aDtcclxuICB0aGlzLnNlbGVjdEFsbEJ5VHlwZVt0eXBlXSA9IHRvdGFsID4gMCAmJiBhcnIubGVuZ3RoID09PSB0b3RhbDtcclxudGhpcy51cGRhdGVPdmVyYWxsU2VsZWN0ZWRJZHMoKTtcclxuICB0aGlzLnBvcHVwdmFsdWUgPSB0eXBlOyAgICAgICAgICAgICAvLyDwn5S0IGFsc28gdXBkYXRlIGhlcmVcclxufVxyXG5cclxuICByZW1hcmtzOiBhbnk7XHJcbiAgQFZpZXdDaGlsZChcInpvb21Qb3B1cFwiKSB6b29tUG9wdXA6IEVsZW1lbnRSZWY7XHJcbiAgcG9wdXBUeXBlOiBhbnk7XHJcbiAgcG9wdXBJZHM6IGFueVtdID0gW107XHJcbiAgcG9wdXBPcGVuKFxyXG4gICAgdHlwZTogYW55LFxyXG4gICAgdmFsdWU/OiBhbnkgfCBcImVtcGxveWVlXCIgfCBcImp1bmtcIiB8IFwiaG91c2VLZWVwaW5nXCIgfCBcImR1cGxpY2F0ZVwiXHJcbiAgKSB7XHJcbiAgICAvLyBzdG9yZSB0eXBlXHJcbiAgICB0aGlzLnBvcHVwVHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLnBvcHVwSWRzID0gdGhpcy5vdmVyYWxsU2VsZWN0ZWRJZHMgfHwgW107XHJcblxyXG4gICAgLy8gYnVpbGQgaWRzIGZyb20gY3VycmVudCBzZWxlY3Rpb25cclxuICAgIGNvbnNvbGUubG9nKFwicG9wdXBUeXBlOlwiLCB0aGlzLnBvcHVwVHlwZSk7XHJcbiAgICBjb25zb2xlLmxvZyhcInBvcHVwSWRzOlwiLCB0aGlzLnBvcHVwSWRzKTsgLy8gW1wiMTEtMTcxNl8yMDI1LTExLTEyXzExQU0tMTJQTV82XCIsIC4uLl1cclxuXHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy56b29tUG9wdXAsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6IFwibWRcIixcclxuICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaG91c2VLZWVwaW5nQUNDb3VudDogYW55O1xyXG4gIGVtcGxveWVlQUNDb3VudDogYW55O1xyXG4gIGR1cGxpY2F0ZUFDQ291bnQ6IGFueTtcclxuICBqdW5rQUNDb3VudDogYW55O1xyXG5cclxuICBzZWxlY3RlZER1cGxpY2F0ZUltYWdlc0xpc3Q6IGFueVtdID0gW107XHJcbiAgc2VsZWN0ZWRIb3VzZWtlZXBpbmdJbWFnZXNMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkRW1wbG95ZWVJbWFnZXNMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkSnVua0ltYWdlc0xpc3Q6IGFueVtdID0gW107XHJcbiAgc3VibWl0VmFsdWUoc3RhdHVzOiBzdHJpbmcgPSBcImFwcHJvdmVkXCIsIGNhdGVnb3J5OiBzdHJpbmcgPSBcImR1cGxpY2F0ZVwiKSB7XHJcbiAgICAvLyBTdGVwIDE6IFZhbGlkYXRlIGJhc2VkIG9uIGN1cnJlbnQgY2F0ZWdvcnlcclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgIGlkOiB0aGlzLnBvcHVwSWRzLFxyXG4gICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgdHlwZTogXCJyZXZpZXdcIixcclxuICAgIH07XHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLmdldFVwZGF0ZVRlbXBTdGF0dXNBcGkob2JqKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChcIlN0YXR1cyB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvbnMoKTtcclxuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhU3RvcmVWaWV3KHRoaXMudGlja2V0RGF0YSk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5yZW1hcmtzID0gXCJcIjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIkVycm9yIHVwZGF0aW5nIHN0YXR1c1wiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID1cclxuICAgICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5lcnJvciB8fFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yIHx8XHJcbiAgICAgICAgICAgIGVycj8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICBcIkVycm9yIHVwZGF0aW5nIHN0YXR1c1wiO1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycm9yTXNnKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcbnJlc2V0U2VsZWN0aW9ucygpIHtcclxuICAvLyBjb21wbGV0ZWx5IHJlcGxhY2UgdGhlIG9iamVjdCBzbyBjaGFuZ2UgZGV0ZWN0aW9uIHNlZXMgaXRcclxuICB0aGlzLnNlbGVjdGVkQnlUeXBlID0ge1xyXG4gICAganVuazogW10sXHJcbiAgICBlbXBsb3llZTogW10sXHJcbiAgICBob3VzZUtlZXBpbmc6IFtdLFxyXG4gICAgZHVwbGljYXRlOiBbXVxyXG4gIH07XHJcblxyXG4gIHRoaXMuc2VsZWN0QWxsQnlUeXBlID0ge1xyXG4gICAganVuazogZmFsc2UsXHJcbiAgICBlbXBsb3llZTogZmFsc2UsXHJcbiAgICBob3VzZUtlZXBpbmc6IGZhbHNlLFxyXG4gICAgZHVwbGljYXRlOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnQgPSB7fTtcclxuXHJcbiAgdGhpcy5vdmVyYWxsU2VsZWN0ZWRJZHMgPSBbXTtcclxuICB0aGlzLnBvcHVwSWRzID0gW107XHJcblxyXG4gIGNvbnNvbGUubG9nKCdSRVNFVCBzZWxlY3Rpb25zOicsIHRoaXMuc2VsZWN0ZWRCeVR5cGUsIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnQpO1xyXG59XHJcblxyXG4gIGNhbmNlbCgpIHtcclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgIC8vIHRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YSA9IFtdO1xyXG4gICAgXHJcbiAgfVxyXG4gIGFycm93c2hvdyA9IHRydWU7XHJcbiAgb3BlbkFycm93KCkge1xyXG4gICAgdGhpcy5hcnJvd3Nob3cgPSBmYWxzZTtcclxuICB9XHJcbiAgY2xvc2VBcnJvdygpIHtcclxuICAgIHRoaXMuYXJyb3dzaG93ID0gdHJ1ZTtcclxuICB9XHJcblxyXG5nZXRPcGVuVGlja2V0TGlzdChkYXRhPzogYW55KSB7XHJcbiAgY29uc29sZS5sb2coJ2dldE9wZW5UaWNrZXRMaXN0IGRhdGE6JywgZGF0YSk7XHJcblxyXG4gIC8vIHN1cHBvcnQgcGFzc2luZyBlaXRoZXIgd2hvbGUgc3RvcmUgb2JqZWN0IG9yIGp1c3QgdGlja2V0SWRcclxuICBjb25zdCBzZWxlY3RlZFRpY2tldElkID0gZGF0YT8udGlja2V0SWQgPz8gZGF0YTsgICBcclxuXHJcbiAgY29uc3Qgb2JqID0ge1xyXG4gICAgY2xpZW50SWQ6IFt0aGlzLmhlYWRlckZpbHRlcnM/LmNsaWVudF0sXHJcbiAgICBmcm9tRGF0ZTogdGhpcy5oZWFkZXJGaWx0ZXJzPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICB0b0RhdGU6IHRoaXMuaGVhZGVyRmlsdGVycz8uZGF0ZT8uZW5kRGF0ZSxcclxuICB9O1xyXG5cclxuICB0aGlzLnNlcnZpY2UuZ2V0T3BlblRpY2tldExpc3RBcGkob2JqKVxyXG4gICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMub3BlblRpY2tldHNMaXN0ID0gcmVzPy5kYXRhID8/IFtdO1xyXG5cclxuICAgICAgICAgIC8vIHJlc2V0IHNlbGVjdGlvblxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5hbGxTZWxlY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICghdGhpcy5vcGVuVGlja2V0c0xpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgc3RvcmVUb1NlbGVjdDogYW55IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgIC8vIPCfkYkgMSkgaWYgZGF0YSBwYXNzZWQsIHRyeSB0byBtYXRjaCBpbiBORVcgbGlzdCBieSB0aWNrZXRJZFxyXG4gICAgICAgICAgaWYgKHNlbGVjdGVkVGlja2V0SWQpIHtcclxuICAgICAgICAgICAgc3RvcmVUb1NlbGVjdCA9IHRoaXMub3BlblRpY2tldHNMaXN0LmZpbmQoXHJcbiAgICAgICAgICAgICAgKHM6IGFueSkgPT4gcy50aWNrZXRJZCA9PT0gc2VsZWN0ZWRUaWNrZXRJZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIPCfkYkgMikgaWYgbm8gbWF0Y2ggb3Igbm8gZGF0YSDihpIgZmFsbGJhY2sgdG8gMCBpbmRleFxyXG4gICAgICAgICAgaWYgKCFzdG9yZVRvU2VsZWN0KSB7XHJcbiAgICAgICAgICAgIHN0b3JlVG9TZWxlY3QgPSB0aGlzLm9wZW5UaWNrZXRzTGlzdFswXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyDwn5GJIDMpIHNldCBzZWxlY3Rpb24gKyBjYWxsIGhhbmRsZXJcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBbc3RvcmVUb1NlbGVjdF07XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZVN0b3JlU2VsZWN0ZWQoc3RvcmVUb1NlbGVjdCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5UaWNrZXRzTGlzdCA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5hbGxTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm9wZW5UaWNrZXRzTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmFsbFNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG5cclxuXHJcbmlzQXBwcm92ZWQob3JpZ2luYWw6IGFueSk6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IGFjdGlvbnMgPSBvcmlnaW5hbD8uYWN0aW9ucyB8fCBbXTtcclxuICByZXR1cm4gYWN0aW9ucy5zb21lKFxyXG4gICAgKGE6IGFueSkgPT4gYS5hY3Rpb25UeXBlID09PSAncmV2aWV3JyAmJiBhLmFjdGlvbiA9PT0gJ2FwcHJvdmVkJ1xyXG4gICk7XHJcbn1cclxuXHJcbmlzUmVqZWN0ZWQob3JpZ2luYWw6IGFueSk6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IGFjdGlvbnMgPSBvcmlnaW5hbD8uYWN0aW9ucyB8fCBbXTtcclxuICByZXR1cm4gYWN0aW9ucy5zb21lKFxyXG4gICAgKGE6IGFueSkgPT4gYS5hY3Rpb25UeXBlID09PSAncmV2aWV3JyAmJiBhLmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1xyXG4gICk7XHJcbn1cclxuXHJcbnJlc2V0Q2hlY2tib3godHlwZTogJ2VtcGxveWVlJyB8ICdqdW5rJyB8ICdob3VzZUtlZXBpbmcnLCBvcmlnaW5hbDogYW55KSB7XHJcbiAgaWYgKCFvcmlnaW5hbD8uYWN0aW9ucykge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gMSkgcmVtb3ZlIE9OTFkgdGhlIHJldmlldyBhY3Rpb24gKGFwcHJvdmVkL3JlamVjdGVkKVxyXG4gIG9yaWdpbmFsLmFjdGlvbnMgPSBvcmlnaW5hbC5hY3Rpb25zLmZpbHRlcihcclxuICAgIChhOiBhbnkpID0+IGEuYWN0aW9uVHlwZSAhPT0gJ3JldmlldydcclxuICApO1xyXG4gIC8vIGFmdGVyIHRoaXMsIGV4YW1wbGUgYmVjb21lczpcclxuICAvLyBbIHsgYWN0aW9uVHlwZTogJ3RhZ2dpbmcnLCBhY3Rpb246ICdzdWJtaXR0ZWQnIH0gXVxyXG5cclxuICAvLyAyKSByZW1vdmUgZnJvbSBzZWxlY3RlZCBsaXN0IGlmIHByZXNlbnRcclxuICBjb25zdCB0ZW1wSWQgPSBvcmlnaW5hbC50ZW1wSWQ7XHJcbiAgY29uc3QgYXJyID0gdGhpcy5zZWxlY3RlZEJ5VHlwZVt0eXBlXSB8fCBbXTtcclxuICBjb25zdCBpbmRleCA9IGFyci5pbmRleE9mKHRlbXBJZCk7XHJcbiAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxuXHJcbiAgLy8gMykgdW5jaGVjayBcInNlbGVjdCBhbGxcIiBmb3IgdGhhdCB0eXBlXHJcbiAgdGhpcy5zZWxlY3RBbGxCeVR5cGVbdHlwZV0gPSBmYWxzZTtcclxufVxyXG5cclxuXHJcbnZpZXdNb2RlOiAndGFuZ29yZXZpZXcnIHwgJ3JldmlldycgfCAndGFnZ2luZycgPSAndGFnZ2luZyc7XHJcbmdldEFjdGlvbihvcmlnaW5hbDogYW55LCB0eXBlOiAndGFnZ2luZycgfCAncmV2aWV3JyB8ICd0YW5nb3JldmlldycpIHtcclxuICByZXR1cm4gb3JpZ2luYWw/LmFjdGlvbnM/LmZpbmQoKGE6IGFueSkgPT4gYS5hY3Rpb25UeXBlID09PSB0eXBlKSB8fCBudWxsO1xyXG59XHJcblxyXG5nZXRJbml0aWFsc0Zyb21FbWFpbChlbWFpbD86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKCFlbWFpbCkgcmV0dXJuICcnO1xyXG5cclxuICAvLyB0YWtlIHRleHQgYmVmb3JlIEBcclxuICBjb25zdCBuYW1lUGFydCA9IGVtYWlsLnNwbGl0KCdAJylbMF07XHJcblxyXG4gIC8vIHNwbGl0IGJ5IC4gb3Igc3BhY2UgKGUuZy4gXCJzYW5kZWVwLnBhbFwiIC0+IFtcInNhbmRlZXBcIiwgXCJwYWxcIl0pXHJcbiAgY29uc3QgcGFydHMgPSBuYW1lUGFydC5zcGxpdCgvWy5cXHNfLV0rLykuZmlsdGVyKEJvb2xlYW4pO1xyXG5cclxuICBpZiAocGFydHMubGVuZ3RoID49IDIpIHtcclxuICAgIHJldHVybiAocGFydHNbMF1bMF0gKyBwYXJ0c1sxXVswXSkudG9VcHBlckNhc2UoKTsgLy8gUyArIFAgPSBTUFxyXG4gIH1cclxuXHJcbiAgLy8gZmFsbGJhY2s6IGZpcnN0IHR3byBjaGFycyBvZiB3aG9sZSBuYW1lUGFydFxyXG4gIHJldHVybiBuYW1lUGFydC5zdWJzdHJpbmcoMCwgMikudG9VcHBlckNhc2UoKTtcclxufVxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICAiLCI8c2VjdGlvbiAqbmdJZj1cInNlbGVjdCA9PT0ndGlja2V0TGlzdCdcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgbXMtMyBteS0zXCI+XHJcbiAgICAgICAgPCEtLSA8dWwgY2xhc3M9XCJuYXYgbmF2LXN0cmV0Y2ggbmF2LWxpbmUtdGFiczEgbmF2LWxpbmUtdGFicyBib3JkZXItdHJhbnNwYXJlbnQgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmsgY3Vyc29yLXBvaW50ZXIgbm8tYm9yZGVyIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICBUaWNrZXRzXHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJuYXYtbGluayBjdXJzb3ItcG9pbnRlciBuby1ib3JkZXIgbWUtM1wiPiBJbnRlcm5hbCBhdWRpdFxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+IC0tPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05IG1iLTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBlbGxpcHNlMSBweC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZSBteS0wXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8udG90YWxUaWNrZXRzICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LnRvdGFsVGlja2V0cyA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Yi1oZWFkZXJcIj5Ub3RhbCB0aWNrZXRzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGUgbXktMFwiPnt7IGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmF2ZXJhZ2VBY2N1cmFjeU92ZXJBbGwgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmF2ZXJhZ2VBY2N1cmFjeU92ZXJBbGwgKyAnJScgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ViLWhlYWRlclwiPkF2ZXJhZ2UgYWNjdXJhY3kgKE92ZXJhbGwpPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0yIHB4LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgbXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7IGdldEZvb3RmYWxsU3VtbWFyeURhdGE/Lm9wZW5UaWNrZXRzICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5vcGVuVGlja2V0cyA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLXN1Yi1oZWFkZXJcIj5PcGVuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8ub3BlbkluZnJhSXNzdWVzICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5vcGVuSW5mcmFJc3N1ZXMgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10aXRsZS1zdWItaGVhZGVyXCI+T3Blbi1JbmZyYSBJc3N1ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgbXktMyBwcy0yMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7IGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmlucHJvZ3Jlc3MgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmlucHJvZ3Jlc3MgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10aXRsZS1zdWItaGVhZGVyXCI+SW4tcHJvZ3Jlc3M8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIG15LTMgdGV4dC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5jbG9zZWRUaWNrZXRzICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5jbG9zZWRUaWNrZXRzIDogJy0tJyB9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPkNsb3NlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgbWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGVsbGlwc2UxIHB5LTEgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGUgbXQtMFwiPnt7IGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LnRpY2tldEFjY3VyYWN5QWJvdmUgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8udGlja2V0QWNjdXJhY3lBYm92ZSA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRlclwiPlRpY2tldHMgd2l0aCBBY2N1cmFjeSBBYm92ZSA4NSU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0yIHB4LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgY29sLXhsLTEyIGNvbC1tZC0xMiBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8udGlja2V0QWNjdXJhY3lCZWxvdyAhPT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8udGlja2V0QWNjdXJhY3lCZWxvdyA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLXN1Yi1oZWFkZXJcIj5UaWNrZXRzIHdpdGggQWNjdXJhY3kgQmVsb3cgODUlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIHB0LTNcIj5cclxuICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLWxhYmVsIG1iLTJcIj5TaG93aW5nIHRpY2tldHMgd2l0aCBBY2N1cmFjeSBCZWxvdyA4NSUgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yIHB4LTMgYmFkZ2UgYmFkZ2UtbGlnaHQtcHJpbWFyeVwiPnt7dG90YWxJdGVtc319IFRvdGFsPC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zdWIgbWItMlwiPkJhc2VkIG9uIHt7aGVhZGVyRmlsdGVycz8uZGF0ZT8uc3RhcnREYXRlIHwgZGF0ZTonZGQgTU1NLCB5eXl5J319IOKAkyB7e2hlYWRlckZpbHRlcnM/LmRhdGU/LmVuZERhdGUgfCBkYXRlOidkZCBNTU0sIHl5eXknfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoNDUgMTcuMDM2NSAxNS4xMjIzKVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBtZS0yXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYnkgc3RvcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGNoYW5nZSk9XCJzZWFyY2hEYXRhKClcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFZhbHVlXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJleHBvcnRYTFNYKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgbXgtMiBidG4tb3V0bGluZSBidG4tb3V0bGluZS1kZWZhdWx0IHJvdW5kZWQtMyB0ZXh0LW5vd3JhcCBib3JkZXItdmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiPkV4cG9ydDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlICBib3R0b20tYm9yZGVyIHRleHQtbm93cmFwIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZU5hbWUnKVwiPlN0b3JlICgyMDApPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdzdG9yZU5hbWUnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0ZWRDb2x1bW4gPT09ICdzdG9yZU5hbWUnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydCgndGlja2V0SWQnKVwiPlRpY2tldCBJRDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAndGlja2V0SWQnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0ZWRDb2x1bW4gPT09ICd0aWNrZXRJZCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC90aD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvblNvcnQoJ2NyZWF0ZWRBdCcpXCI+VGlja2V0IHJhaXNlZCBvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnY3JlYXRlZEF0JyAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRlZENvbHVtbiA9PT0gJ2NyZWF0ZWRBdCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdkYXRlU3RyaW5nJylcIj5Jc3N1ZSBEYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdkYXRlU3RyaW5nJyAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRlZENvbHVtbiA9PT0gJ2RhdGVTdHJpbmcnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydCgndHlwZScpXCI+VGlja2V0IHR5cGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gJ3R5cGUnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydGVkQ29sdW1uID09PSAndHlwZScgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdmb290ZmFsbENvdW50JylcIj5BY3R1YWwgRkZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gJ2Zvb3RmYWxsQ291bnQnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydGVkQ29sdW1uID09PSAnZm9vdGZhbGxDb3VudCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdkdXBsaWNhdGVDb3VudCcpXCI+U3RvcmUgKCUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdkdXBsaWNhdGVDb3VudCcgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0ZWRDb2x1bW4gPT09ICdkdXBsaWNhdGVDb3VudCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdlbXBsb3llZUNvdW50JylcIj5SZXZpZXdlciAoJSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gJ2VtcGxveWVlQ291bnQnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydGVkQ29sdW1uID09PSAnZW1wbG95ZWVDb3VudCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdqdW5rQ291bnQnKVwiPkFwcHJvdmVyICglKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnanVua0NvdW50JyAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRlZENvbHVtbiA9PT0gJ2p1bmtDb3VudCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdob3VzZUtlZXBpbmdDb3VudCcpXCI+VGFuZ28gKCUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0ZWRDb2x1bW4gPT09ICdob3VzZUtlZXBpbmdDb3VudCcgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0ZWRDb2x1bW4gPT09ICdob3VzZUtlZXBpbmdDb3VudCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydCgnc3RhdHVzJylcIj5TdGF0dXM8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gJ3N0YXR1cycgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRlZENvbHVtbiA9PT0gJ3N0YXR1cycgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHRoID5BY3Rpb25zPC90aD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+Q29tbWVudHM8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IG9iaiBvZiBmb290ZmFsbExpc3REYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcHJpbWFyeSBlbGxpcHNpcy11bmRlcmxpbmVcIiAoY2xpY2spPVwidGlja2V0VmlldyhvYmopXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9iaj8udGlja2V0SWQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTJcIj57eyBvYmo/LnN0b3JlTmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB0LTdcIj57e29iaj8udGlja2V0UmFpc2VkIHwgZGF0ZTonZGQgTU1NLCB5eXl5J319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB0LTdcIj57e29iaj8uaXNzdWVEYXRlIHwgZGF0ZTonZGQgTU1NLCB5eXl5J319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB0LTdcIj57e29iaj8udHlwZSA/IG9iaj8udHlwZTogJy0nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicHQtN1wiPnt7b2JqPy5mb290ZmFsbCA/PyAnLSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwdC03XCI+e3tvYmo/LnN0b3JlUmV2aXNlZEFjY3VyYWN5ID8gb2JqPy5zdG9yZVJldmlzZWRBY2N1cmFjeTonLSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwdC03XCI+e3tvYmo/LnJldmlld2VyUmV2aXNlZEFjY3VyYWN5ID8gb2JqPy5yZXZpZXdlclJldmlzZWRBY2N1cmFjeTonLSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwdC03XCI+e3tvYmo/LmFwcHJvdmVyUmV2aXNlZEFjY3VyYWN5ID8gb2JqPy5hcHByb3ZlclJldmlzZWRBY2N1cmFjeTonLSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwdC03XCI+e3tvYmo/LnRhbmdvUmV2aXNlZEFjY3VyYWN5ID8gb2JqPy50YW5nb1JldmlzZWRBY2N1cmFjeTonLSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwdC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJvYmo/LnN0YXR1cyA9PT0nT3BlbidcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnkgbXgtMlwiPk9wZW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJvYmo/LnN0YXR1cyA9PT0nQ2xvc2VkJ1wiIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdCBteC0yXCI+Q2xvc2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwib2JqPy5zdGF0dXMgIT09J0Nsb3NlZCcgJiYgb2JqPy5zdGF0dXMgIT09J09wZW4nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC13YXJuaW5nIG14LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvYmo/LnN0YXR1c319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB0LTdcIj57e29iaj8uY29tbWVudHMgPyBvYmo/LmNvbW1lbnRzOictLScgfX08L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiAhbm9EYXRhXCIgY2xhc3M9XCJteS0zXCI+XHJcbiAgICAgICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJwYWdlU2l6ZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInNldHBhZ2VTaXplKClcIiAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuPCEtLSAgLS0+XHJcbjxzZWN0aW9uICpuZ0lmPVwic2VsZWN0ID09PSd0aWNrZXRNZXRob2QnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IG15LTJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIiBbbmdDbGFzc109XCJpc0NvbGxhcHNlZCA/ICdkLW5vbmUnIDogJ2NvbC1tZC0zIGgtYXV0bydcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBwdC0zIHB4LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTIgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYmFja1RvTmF2aWdhdGlvbigpXCI+PHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNTYgNDRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfODg3XzQ1MDUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNTJcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjIuNVwiIHk9XCIxLjVcIiB3aWR0aD1cIjUxXCIgaGVpZ2h0PVwiMzlcIiByeD1cIjcuNVwiIHN0cm9rZT1cIiNEMEQ1RERcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzAuNSAyNkwyNS41IDIxTDMwLjUgMTZcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kXzg4N180NTA1XCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI0NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIiByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfODg3XzQ1MDVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93Xzg4N180NTA1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cInNoYXBlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLWZvb3QgcHQtMTUgbXMtM1wiPlRpY2tldHM8L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidG9nZ2xlU2lkZWJhcigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMTVweDsgcmlnaHQ6IC0yNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjY4XCIgaGVpZ2h0PVwiNjhcIiB2aWV3Qm94PVwiMCAwIDY4IDY4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kZF83NzhfMzQyODIpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEyXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCIgcng9XCIyMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMyAyN0wyOCAyMkwzMyAxN000MCAyN0wzNSAyMkw0MCAxN1wiIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RkXzc3OF8zNDI4MlwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjY4XCIgaGVpZ2h0PVwiNjhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCIgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlTW9ycGhvbG9neSByYWRpdXM9XCIyXCIgb3BlcmF0b3I9XCJlcm9kZVwiIGluPVwiU291cmNlQWxwaGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93Xzc3OF8zNDI4MlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjAzIDBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW4yPVwiQmFja2dyb3VuZEltYWdlRml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd183NzhfMzQyODJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU1vcnBob2xvZ3kgcmFkaXVzPVwiNFwiIG9wZXJhdG9yPVwiZXJvZGVcIiBpbj1cIlNvdXJjZUFscGhhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDJfZHJvcFNoYWRvd183NzhfMzQyODJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCI4XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDggMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfNzc4XzM0MjgyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDJfZHJvcFNoYWRvd183NzhfMzQyODJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0Ml9kcm9wU2hhZG93Xzc3OF8zNDI4MlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJzaGFwZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNCB3LTEwMCBvdmVyZmxvdy1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBteS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBweS0yIG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEgMTlDNi41NTU1NiAxOSAzIDE1LjQ0NDQgMyAxMUMzIDYuNTU1NTYgNi41NTU1NiAzIDExIDNDMTUuNDQ0NCAzIDE5IDYuNTU1NTYgMTkgMTFDMTkgMTUuNDQ0NCAxNS40NDQ0IDE5IDExIDE5Wk0xMSA1QzcuNTMzMzMgNSA1IDcuNTMzMzMgNSAxMUM1IDE0LjQ2NjcgNy41MzMzMyAxNyAxMSAxN0MxNC40NjY3IDE3IDE3IDE0LjQ2NjcgMTcgMTFDMTcgNy41MzMzMyAxNC40NjY3IDUgMTEgNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gbWItMiBwcy0xNCBwZS0yIHctMTAwXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgWyhuZ01vZGVsKV09XCJTdG9yZXNTZWFyY2hWYWx1ZVwiIChjaGFuZ2UpPVwic2VhcmNoU3RvcmVzRGF0YSgpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBwLTAgYnRuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWZpbHRlciBidG4gYnRuLXNtIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cInRvZ2dsZUZpbHRlcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDEwSDE1TTIuNSA1SDE3LjVNNy41IDE1SDEyLjVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPdmVybGF5IChjbGljayBvdXRzaWRlIHRvIGNsb3NlKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5XCIgKm5nSWY9XCJpc0ZpbHRlck9wZW5cIiAoY2xpY2spPVwiY2xvc2UoKVwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsdGVyIGNhcmQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1jYXJkIHRleHQtc3RhcnRcIiAqbmdJZj1cImlzRmlsdGVyT3BlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwibWItM1wiPkZpbHRlciBPcHRpb25zPC9oMz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU3RhdHVzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+U3RhdHVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXR1c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3Q8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPk9wZW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkluLVByb2dyZXNzPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5DbG9zZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+VW5kZXIgdGFuZ2UgcmV2aWV3PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5UYW5nZSByZXZpZXcgZG9uZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+RXhwaXJlZDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZpZXdlciBhY2N1cmFjeSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGxhYmVsIGluIHNhbWUgcm93IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbWItMCBmcy04IHJldmlld2VyLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmlld2VyIGFjY3VyYWN5ICglKSBieSBjb25kaXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbmRpdGlvbiBkcm9wZG93biAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc20gcmV2aWV3ZXItc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJDb25kaXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPj49IEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBMZXNzIHRoYW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj4+IEdyZWF0ZXIgdGhhbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTGVzc2VyIHRoYW4gb3IgZXF1YWwgdG88L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5CZXR3ZWVuPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc2luZ2xlIHZhbHVlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZS5yZXZpZXdlckNvbmRpdGlvbiAhPT0gJ0JldHdlZW4nOyBlbHNlIGJldHdlZW5UcGxcIj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbXMtMVwiPiUgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSByZXZpZXdlci1pbnB1dCB0ZXh0LWVuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJldmlld2VyVmFsdWVcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPOiBzYW1lIGJsb2NrIGZvciBBcHByb3ZlciAmIFRhbmdvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJldmlld2VyIGFjY3VyYWN5IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWwgaW4gc2FtZSByb3cgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0wIGZzLTggcmV2aWV3ZXItbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwcm92ZXIgYWNjdXJhY3kgKCUpIGJ5IGNvbmRpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29uZGl0aW9uIGRyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbSByZXZpZXdlci1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXZpZXdlckNvbmRpdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Pj0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IExlc3MgdGhhbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPj4gR3JlYXRlciB0aGFuPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBMZXNzZXIgdGhhbiBvciBlcXVhbCB0bzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkJldHdlZW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzaW5nbGUgdmFsdWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlLnJldmlld2VyQ29uZGl0aW9uICE9PSAnQmV0d2Vlbic7IGVsc2UgYmV0d2VlblRwbFwiPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtcy0xXCI+JSA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIHJldmlld2VyLWlucHV0IHRleHQtZW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJWYWx1ZVwiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZpZXdlciBhY2N1cmFjeSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGxhYmVsIGluIHNhbWUgcm93IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbWItMCBmcy04IHJldmlld2VyLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhbmdvIGFjY3VyYWN5ICglKSBieSBjb25kaXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbmRpdGlvbiBkcm9wZG93biAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc20gcmV2aWV3ZXItc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJDb25kaXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPj49IEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBMZXNzIHRoYW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj4+IEdyZWF0ZXIgdGhhbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTGVzc2VyIHRoYW4gb3IgZXF1YWwgdG88L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5CZXR3ZWVuPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc2luZ2xlIHZhbHVlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZS5yZXZpZXdlckNvbmRpdGlvbiAhPT0gJ0JldHdlZW4nOyBlbHNlIGJldHdlZW5UcGxcIj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbXMtMVwiPiUgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSByZXZpZXdlci1pbnB1dCB0ZXh0LWVuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJldmlld2VyVmFsdWVcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgZ2FwLTIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0RmlsdGVyKClcIj5SZXNldDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoKVwiPkFwcGx5PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwib3BlblRpY2tldHNMaXN0Lmxlbmd0aFwiIGNsYXNzPVwibWItMiBib3JkZXItc2VsZWN0YWxsXCI+XHJcbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuXHJcbiAgICA8IS0tIExFRlQ6IGNoZWNrYm94ICsgdGV4dCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgY2xhc3M9XCJtZS0yXCJcclxuICAgICAgICBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZFwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoKVwiIC8+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cIm0tMCBmb250LXNlbWlib2xkXCI+XHJcbiAgICAgICAgU2VsZWN0IGFsbCB7eyBzdG9yZUNvdW50IH19IHN0b3Jlc1xyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBSSUdIVDogUmV2aWV3ZXIoJSkgKyBvcHRpb25hbCBzb3J0IGljb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciByZXZpZXdlci1sYWJlbFwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cIm1lLTFcIj5SZXZpZXdlciglKTwvc3Bhbj5cclxuICAgICAgPCEtLSBpZiB5b3Ugd2FudCBhcnJvdyBpY29uIC0tPlxyXG4gICAgICA8c3BhbiAgY2xhc3M9XCJzb3J0LWFycm93IGN1cnNvci1wb2ludGVyXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XHJcbjxwYXRoIGQ9XCJNNi44MzQ2NCAxTDYuODM0NjMgMTIuNjY2N002LjgzNDYzIDEyLjY2NjdMMTIuNjY4IDYuODMzMzNNNi44MzQ2MyAxMi42NjY3TDEuMDAxMyA2LjgzMzMzXCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvc3ZnPjwvc3Bhbj5cclxuICAgICAgPCEtLSBvciB1c2UgYW4gPGk+IGZyb20gZm9udC1hd2Vzb21lL2Jvb3RzdHJhcCBpY29uIGluc3RlYWQgLS0+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgcHMtMFwiPlxyXG48bGkgKm5nRm9yPVwibGV0IHN0b3JlIG9mIG9wZW5UaWNrZXRzTGlzdFwiXHJcbiAgICBjbGFzcz1cIm1iLTJcIlxyXG4gICAgW25nQ2xhc3NdPVwieyAnc3RvcmUtaXRlbS1hY3RpdmUnOiBpc1NlbGVjdGVkKHN0b3JlKSwgJ3N0b3JlLWl0ZW0nOiB0cnVlIH1cIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgIDwhLS0gTEVGVDogY2hlY2tib3ggKyB0ZXh0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydFwiPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgIGNsYXNzPVwibWUtMiBteS0zXCJcclxuICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHN0b3JlKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTdG9yZVNlbGVjdGlvbihzdG9yZSlcIiAvPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLXRleHQgbXMtMVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aWNrZXQtaWRcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUtdGV4dCc6IGlzU2VsZWN0ZWQoc3RvcmUpIH1cIj5cclxuICAgICAgICAgIHt7IHN0b3JlPy50aWNrZXRJZCB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1uYW1lIG10LTFcIj5cclxuICAgICAgICAgIHt7IHN0b3JlPy5zdG9yZU5hbWUgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJJR0hUOiBwaWxsIGJhZGdlIC0tPlxyXG4gICAgPHNwYW5cclxuICAgICAgY2xhc3M9XCJtcy0yIHB4LTMgcHktMSByb3VuZGVkLXBpbGwgZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwZXJjLWJhZGdlXCJcclxuICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICdwZXJjLWJhZGdlLWFjdGl2ZSc6IGlzU2VsZWN0ZWQoc3RvcmUpLFxyXG4gICAgICAgICdwZXJjLWJhZGdlLW5vcm1hbCc6ICFpc1NlbGVjdGVkKHN0b3JlKVxyXG4gICAgICB9XCI+XHJcbiAgICAgIHt7IHN0b3JlPy5yZXZpY2VkUGVyYyB9fVxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L2xpPlxyXG5cclxuPC91bD5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIW9wZW5UaWNrZXRzTGlzdC5sZW5ndGhcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IG14LTAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW46IDY0cHg7Ym9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgYmFja2dyb3VuZDogdmFyKC0tR3JheS01MCwgI0Y5RkFGQik7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm15LTVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI5NFwiIGhlaWdodD1cIjk0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA5NCA5NFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI3XCIgeT1cIjdcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiByeD1cIjQwXCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiN1wiIHk9XCI3XCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgcng9XCI0MFwiIHN0cm9rZT1cIiNFQUY4RkZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMTMuMzMzM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNzMwXzc1MDk1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTU1LjMzMjcgNjJWNTguNjY2N0M1NS4zMzI3IDU2Ljg5ODYgNTQuNjMwMyA1NS4yMDI5IDUzLjM4MDEgNTMuOTUyNkM1Mi4xMjk4IDUyLjcwMjQgNTAuNDM0MSA1MiA0OC42NjYgNTJIMzUuMzMyN0MzMy41NjQ2IDUyIDMxLjg2ODkgNTIuNzAyNCAzMC42MTg2IDUzLjk1MjZDMjkuMzY4NCA1NS4yMDI5IDI4LjY2NiA1Ni44OTg2IDI4LjY2NiA1OC42NjY3VjYyTTY1LjMzMjcgNjJWNTguNjY2N0M2NS4zMzE2IDU3LjE4OTUgNjQuODM5OSA1NS43NTQ2IDYzLjkzNSA1NC41ODcyQzYzLjAzIDUzLjQxOTggNjEuNzYyOSA1Mi41ODU5IDYwLjMzMjcgNTIuMjE2N001My42NjYgMzIuMjE2N0M1NS4xIDMyLjU4MzggNTYuMzcxMSAzMy40MTc4IDU3LjI3ODcgMzQuNTg3MkM1OC4xODY0IDM1Ljc1NjUgNTguNjc5MSAzNy4xOTQ3IDU4LjY3OTEgMzguNjc1QzU4LjY3OTEgNDAuMTU1MyA1OC4xODY0IDQxLjU5MzUgNTcuMjc4NyA0Mi43NjI4QzU2LjM3MTEgNDMuOTMyMiA1NS4xIDQ0Ljc2NjIgNTMuNjY2IDQ1LjEzMzNNNDguNjY2IDM4LjY2NjdDNDguNjY2IDQyLjM0ODYgNDUuNjgxMiA0NS4zMzMzIDQxLjk5OTMgNDUuMzMzM0MzOC4zMTc0IDQ1LjMzMzMgMzUuMzMyNyA0Mi4zNDg2IDM1LjMzMjcgMzguNjY2N0MzNS4zMzI3IDM0Ljk4NDggMzguMzE3NCAzMiA0MS45OTkzIDMyQzQ1LjY4MTIgMzIgNDguNjY2IDM0Ljk4NDggNDguNjY2IDM4LjY2NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzczMF83NTA5NVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIGZpbGw9XCJ3aGl0ZVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyNyAyNylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGUgbXktM1wiPk5vIFN0b3JlcyBGb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViIG1iLTNcIj5Mb29rcyBsaWtlIHRoZXJlIGlzIG5vIHN0b3JlcyA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpc0NvbGxhcHNlZCA/ICdjb2wtMTInIDogJ2NvbC1tZC05J1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBiZy1saWdodC1wcmltYXJ5IHAtMSBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIHB0LTMgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbGxhcHNlZFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj48c3BhbiAoY2xpY2spPVwidG9nZ2xlU2lkZWJhcigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAxMHB4OyBsZWZ0OiAxMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjUgMjVMMTcuNSAyMEwyMi41IDE1XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLWZvb3QgbXMtMTVcIj5Gb290ZmFsbCBEaXJlY3Rvcnk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0aWNrZXREYXRhLnN0YXR1cyA9PT0gJ3JhaXNlZCdcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWNsb3NlQnRuXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IG14LTJcIiAoY2xpY2spPVwic3RhcnRSZXZpZXcoKVwiPlN0YXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2aWV3PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNsb3NlQnRuXCIgZGlzYWJsZWQgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IG14LTJcIiAoY2xpY2spPVwic3RvcFJldmlldygpXCI+Q2xvc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGlja2V0RGF0YS5zdGF0dXMgIT09ICdyYWlzZWQnXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgbXgtMlwiIChjbGljayk9XCJzdGFydEF1ZGl0KClcIj5TdGFydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGl0PC9idXR0b24+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgMTNDMTIuNTUyMyAxMyAxMyAxMi41NTIzIDEzIDEyQzEzIDExLjQ0NzcgMTIuNTUyMyAxMSAxMiAxMUMxMS40NDc3IDExIDExIDExLjQ0NzcgMTEgMTJDMTEgMTIuNTUyMyAxMS40NDc3IDEzIDEyIDEzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDZDMTIuNTUyMyA2IDEzIDUuNTUyMjggMTMgNUMxMyA0LjQ0NzcyIDEyLjU1MjMgNCAxMiA0QzExLjQ0NzcgNCAxMSA0LjQ0NzcyIDExIDVDMTEgNS41NTIyOCAxMS40NDc3IDYgMTIgNlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiAyMEMxMi41NTIzIDIwIDEzIDE5LjU1MjMgMTMgMTlDMTMgMTguNDQ3NyAxMi41NTIzIDE4IDEyIDE4QzExLjQ0NzcgMTggMTEgMTguNDQ3NyAxMSAxOUMxMSAxOS41NTIzIDExLjQ0NzcgMjAgMTIgMjBaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTQgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi02XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgY2FyZC10aXRsZS1sYWJlbCBteS0yXCI+U3RvcmUgTmFtZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEgZm9udC1ib2xkIG15LTJcIj46PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyBjYXJkLXRpdGxlLXZhbHVlIG15LTJcIj57e3RpY2tldERhdGE/LnN0b3JlTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiBjYXJkLXRpdGxlLWxhYmVsIG15LTJcIj5UaWNrZXQgSUQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xIGZvbnQtYm9sZCBteS0yXCI+OjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgY2FyZC10aXRsZS12YWx1ZSBteS0yXCI+e3t0aWNrZXREYXRhPy50aWNrZXRJZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiBjYXJkLXRpdGxlLWxhYmVsIG15LTJcIj5TdGF0dXM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xIGZvbnQtYm9sZCBteS0yXCI+OjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgbXktMlwiPjxzcGFuIGNsYXNzPVwiYmFkZ2VcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgJ2JhZGdlLWxpZ2h0LXByaW1hcnknOiB0aWNrZXREYXRhLnN0YXR1cyA9PT0gJ29wZW4nLFxyXG4gICAgICAgICdiYWRnZS1zZWNvbmRhcnknOiB0aWNrZXREYXRhLnN0YXR1cyA9PT0gJ2Nsb3NlZCcsXHJcbiAgICAgICAgJ2JhZGdlLWxpZ2h0LXdhcm5pbmcnOiB0aWNrZXREYXRhLnN0YXR1cyA9PT0gJ3BlbmRpbmcnIHx8IHRpY2tldERhdGEuc3RhdHVzID09PSAnUmV2aWV3ZXItQ2xvc2VkJyxcclxuICAgICAgICAnYmFkZ2UtbGlnaHQtZGFuZ2VyJzogdGlja2V0RGF0YS5zdGF0dXMgPT09ICdyZWplY3RlZCcsXHJcbiAgICAgICAgJ2JhZGdlLWxpZ2h0LWluZm8nOiB0aWNrZXREYXRhLnN0YXR1cyA9PT0gJ3JhaXNlZCcsICAgICBcclxuXHJcbiAgICAgIH1cIj4ge3sgdGlja2V0RGF0YS5zdGF0dXMgPyAodGlja2V0RGF0YS5zdGF0dXMgfCB0aXRsZWNhc2UpIDogJy0nIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgY2FyZC10aXRsZS1sYWJlbCBteS0yXCI+RHVlIERhdGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xIGZvbnQtYm9sZCBteS0yXCI+OjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgY2FyZC10aXRsZS12YWx1ZSBteS0yXCI+MDQgRGVjIDIwMjU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYm9yZGVyLXByaW1hcnktbGF5ZXJzIG15LTMgaC0xMDBweFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXRpdGxlIHctMTc1cHggcC00IG1iLTJcIj5UYW5nbyByZXNwb25zZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtZGVzYyBwcy00XCI+PHNwYW4gY2xhc3M9XCJtZS0zXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDE2VjEyTTEyIDhIMTIuMDFNMjIgMTJDMjIgMTcuNTIyOCAxNy41MjI4IDIyIDEyIDIyQzYuNDc3MTUgMjIgMiAxNy41MjI4IDIgMTJDMiA2LjQ3NzE1IDYuNDc3MTUgMiAxMiAyQzE3LjUyMjggMiAyMiA2LjQ3NzE1IDIyIDEyWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA4RURGXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5UYW5nbyBhdWRpdCBjb21wbGV0ZWQg4oCUIGZvdW5kIDMlIGRpc2NyZXBhbmNpZXMgZGlmZmVyZW5jZSBiZXR3ZWVuIFRhbmdvIGFuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25zLjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtbGF5ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCB3LTEwMFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTEVGVCBTSURFIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtbiBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtbGFiZWxcIj5UaWNrZXQgU3RhdHVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3ViIG1iLTJcIj5Mb2dzIGZvciBlYWNoIHJldmlzaW9uIG9mIHRoZSB0aWNrZXQuPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUklHSFQgU0lERSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYXJyb3dzaG93XCIgKGNsaWNrKT1cIm9wZW5BcnJvdygpXCI+IDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiNDBcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzQ4Nl85MTkwMilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCIxXCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgcng9XCI4XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzVcIiBoZWlnaHQ9XCIzNVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNSAxNi41TDIwIDIxLjVMMjUgMTYuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfNDg2XzkxOTAyXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzQ4Nl85MTkwMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzQ4Nl85MTkwMlwiIHJlc3VsdD1cInNoYXBlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWFycm93c2hvd1wiIChjbGljayk9XCJjbG9zZUFycm93KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgdmlld0JveD1cIjAgMCA0MCA0MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfNDg2XzkxODkzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzOFwiIHk9XCIzN1wiIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIHJ4PVwiOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSgxODAgMzggMzcpXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMzcuNVwiIHk9XCIzNi41XCIgd2lkdGg9XCIzNVwiIGhlaWdodD1cIjM1XCIgcng9XCI3LjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoMTgwIDM3LjUgMzYuNSlcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI1IDIxLjVMMjAgMTYuNUwxNSAyMS41XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF80ODZfOTE4OTNcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfNDg2XzkxODkzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfNDg2XzkxODkzXCIgcmVzdWx0PVwic2hhcGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiAqbmdJZj1cIiFhcnJvd3Nob3dcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRpY2tldCBvZiBmb290ZmFsbFRpY2tldHNEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRpY2tldD8uX3NvdXJjZSBhcyBzb3VyY2VcIiBjbGFzcz1cInRpY2tldC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY3R1YWwgRm9vdGZhbGwgSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aWNrZXQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZmFsbC12YWx1ZVwiPnt7c291cmNlPy5mb290ZmFsbENvdW50fX0gPHNwYW4gY2xhc3M9XCJmb290ZmFsbC1sYWJlbCBtcy0zXCI+QWN0dWFsIEZvb3RmYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlzc3VlLWRhdGVcIj5Jc3N1ZSBkYXRlIDoge3tzb3VyY2U/LmNyZWF0ZWRBdCB8IGRhdGU6J2RkIE1NTSB5eXl5J319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGltZWxpbmUgTGluZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtYXBwaW5nIG9mIHNvdXJjZT8ubWFwcGluZ0luZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2hlbiB0aWNrZXQgaXMgQ0xPU0VELCBza2lwIHRoZSB0YWdnaW5nIHJvdyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1hcHBpbmc/LnN0YXR1cyAhPT0gJ2Nsb3NlZCcgfHwgbWFwcGluZz8udHlwZSAhPT0gJ3RhZ2dpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtYXBwaW5nPy50eXBlID09PSAndGFnZ2luZycgfHwgbWFwcGluZz8udHlwZSA9PT0gJ3JldmlldydcIiBjbGFzcz1cInRpbWVsaW5lXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICAqbmdJZj1cIm1hcHBpbmc/LnR5cGUgPT09ICd0YWdnaW5nJyB8fCBtYXBwaW5nPy50eXBlID09PSAncmV2aWV3J1wiIGNsYXNzPVwidXNlci1pbmZvIG1zLTRcIj5cclxuXHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJhdmF0YXIgYXZhdGFyLXRleHQgbGlnaHQtcHJpbWFyeSBwLTNcIlxyXG4gICAgXHJcbiAgPlxyXG4gICAge3sgZ2V0SW5pdGlhbHNGcm9tRW1haWwobWFwcGluZz8uY3JlYXRlZEJ5RW1haWwgfHwgc291cmNlPy5jcmVhdGVkQnlFbWFpbCkgfX1cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLW5hbWVcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIm1hcHBpbmc/LnR5cGUgPT09ICd0YWdnaW5nJ1wiPlxyXG4gICAgICAgICAgVGlja2V0IGNyZWF0ZWQgYnlcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIm1hcHBpbmc/LnR5cGUgPT09ICdyZXZpZXcnXCI+XHJcbiAgICAgICAgICAgIFJldmlld2VkIGJ5XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICBcclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWVtYWlsXCI+XHJcbiAgICAgIHt7IG1hcHBpbmc/LmNyZWF0ZWRCeUVtYWlsIHx8IHNvdXJjZT8uY3JlYXRlZEJ5RW1haWwgfX0g4oCiXHJcbiAgICAgIHt7IChtYXBwaW5nPy5jcmVhdGVkQXQgfHwgc291cmNlPy5jcmVhdGVkQXQpIHwgZGF0ZTonSEg6bW06c3Mg4oCTIGRkIE1NTSB5eXl5JyB9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lXCI+PC9kaXY+XHJcblxyXG4gICAgPCEtLSBTaG93IHJldmlzaW9uIGNhcmQgb25seSB3aGVuIE5PVCBjbG9zZWQgJiB0eXBlIGlzIHRhZ2dpbmcgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicmV2aXNpb24tY2FyZFwiXHJcbiAgICAgICAgICpuZ0lmPVwibWFwcGluZz8udHlwZSA9PT0gJ3RhZ2dpbmcnIHx8IG1hcHBpbmc/LnR5cGUgPT09ICdyZXZpZXcnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZXMtcm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlLWJsb2NrXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWVcIj5cclxuICAgICAgICAgICAge3sgbWFwcGluZz8ucmV2aWNlZEZvb3RmYWxsID09PSBudWxsID8gJy0tJyA6IG1hcHBpbmc/LnJldmljZWRGb290ZmFsbCB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwgZnctYm9sZFwiPlJldmlzZWQgRm9vdGZhbGw8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlLWJsb2NrXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgYWNjdXJhY3kgZG93blwiPlxyXG4gICAgICAgICAgICB7eyBtYXBwaW5nPy5yZXZpY2VkUGVyYyB8fCBzb3VyY2U/LnJldmljZWRQZXJjIHx8ICctLScgfX1cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBhcnJvdyBzdmcgLS0+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsIGZ3LWJvbGQgcHQtMVwiPkFjY3VyYWN5PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lbGluZS1uZXcgbXktMlwiPjwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtYmxvY2tcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtYXBwaW5nPy5jb3VudFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlXCI+XHJcbiAgICAgICAgICAgIHt7IGl0ZW0/LnZhbHVlID8/ICctLScgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+XHJcbiAgICAgICAgICAgIHt7IGl0ZW0/Lm5hbWUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lbGluZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInRpbWVsaW5lXCI+PC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGFuZ28gYnkgcm93IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInVzZXItaW5mbyBtcy00IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy91c2VyMi5wbmdcIiBjbGFzcz1cImF2YXRhciBtZS0yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLW5hbWVcIj5UYW5nbyBieTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItZW1haWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmxhbmRvbGVuc2thcnQuY29tIOKAoiAxMDo1MzozNCBBTSDigJMgMjAgSmFuIDIwMjVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lXCI+PC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1BSU4gQ0FSRCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJyZXZpc2lvbi1jYXJkIHB4LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZXMtcm93IGQtZmxleCBhbGlnbi1pdGVtcy1zdHJldGNoIHB4LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtYmxvY2sgbWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPjg5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsIGZ3LWJvbGRcIj5SZXZpc2VkIEZvb3RmYWxsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtYmxvY2sgbWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBhY2N1cmFjeSB1cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OSVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy45OTg3IDEyLjY2NjZMNy45OTg3IDMuMzMzMjlNNy45OTg3IDMuMzMzMjlMMTIuNjY1NCA3Ljk5OTk2TTcuOTk4NyAzLjMzMzI5TDMuMzMyMDMgNy45OTk5NlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwgZnctYm9sZFwiPkFjY3VyYWN5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtYmxvY2sgbWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPjEwPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+RHVwbGljYXRlczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlLWJsb2NrIG1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWVcIj4zPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+RW1wbG95ZWUvU3RhZmY8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZS1ibG9jayBtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlXCI+MjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiPkp1bms8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPjE8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIj5Ib3VzZSBLZWVwaW5nPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHB5LTEgYmctbGlnaHQtcHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXRvZ2dsZSBkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGJnLWxpZ2h0LXByaW1hcnkgYWxpZ24taXRlbXMtc3RhcnQgbXQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dSZXZpc2VkRGV0YWlscyA9ICFzaG93UmV2aXNlZERldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2hvd1JldmlzZWREZXRhaWxzID8gJ0hpZGUgZGV0YWlscycgOiAnU2hvdyBpbiBkZXRhaWxzJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZXZyb24gbXMtM1wiIFtjbGFzcy5yb3RhdGUtMTgwXT1cInNob3dSZXZpc2VkRGV0YWlsc1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDlMMTIgMTVMNiA5XCIgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1ib2R5IG10LTJcIiAqbmdJZj1cInNob3dSZXZpc2VkRGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbCB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsZWQgYnJlYWtkb3duIG9mIHJldmlzZWQgZm9vdGZhbGwgZ29lcyBoZXJl4oCmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIiBjbGFzcz1cInBiLTMgbXktMyBoLTEwMCByb3VuZGVkLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlMSBmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib3ZlcmFsbFNlbGVjdCgkZXZlbnQpXCIgLz48c3BhbiBjbGFzcz1cIm1zLTEyXCI+IFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDaGVja2JveEVuYWJsZVwiIGNsYXNzPVwiY29sLW1kLTYgcGUtOFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgIGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGFyaWEtcGxhY2Vob2xkZXI9XCJzaG93IGFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhbGxcIj5TaG93IGFsbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWNjZXB0XCI+QWNjZXB0PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVqZWN0XCI+UmVqZWN0PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInBlbmRpbmdcIj5QZW5kaW5nPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCIhb3ZlcmFsbFNlbGVjdGVkSWRzPy5sZW5ndGhcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBiZy13aGl0ZSB3LTEwMFwiIChjbGljayk9XCJwb3B1cE9wZW4oJ3JlamVjdGVkJylcIj5SZWplY3Q8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiIW92ZXJhbGxTZWxlY3RlZElkcz8ubGVuZ3RoXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgYmctd2hpdGUgdy0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwb3B1cE9wZW4oJ2FwcHJvdmVkJylcIj5BY2NlcHQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiIW92ZXJhbGxTZWxlY3RlZElkcz8ubGVuZ3RoXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgYmctd2hpdGUgdy0xMDBcIiAoY2xpY2spPVwicG9wdXBPcGVuKCdyZWplY3RlZCcpXCI+RGVueTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCIhb3ZlcmFsbFNlbGVjdGVkSWRzPy5sZW5ndGhcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBiZy13aGl0ZSB3LTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBvcHVwT3BlbignYXBwcm92ZWQnKVwiPkFwcHJvdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy13aGl0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGlja2V0IG9mIGZvb3RmYWxsVGlja2V0c0RhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGlja2V0Py5fc291cmNlIGFzIHNvdXJjZVwiIGNsYXNzPVwibXktNVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1Jldm9wc1R5cGUoJ2R1cGxpY2F0ZXMnKVwiIGNsYXNzPVwibGF5ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIG1pbi1oLTI1cHggcHQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtbGcgZm9udC1zZW1pYm9sZCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzczMF83NjE1NylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43NSAxMS4yNUgzQzIuNjAyMTggMTEuMjUgMi4yMjA2NCAxMS4wOTIgMS45MzkzNCAxMC44MTA3QzEuNjU4MDQgMTAuNTI5NCAxLjUgMTAuMTQ3OCAxLjUgOS43NVYzQzEuNSAyLjYwMjE4IDEuNjU4MDQgMi4yMjA2NCAxLjkzOTM0IDEuOTM5MzRDMi4yMjA2NCAxLjY1ODA0IDIuNjAyMTggMS41IDMgMS41SDkuNzVDMTAuMTQ3OCAxLjUgMTAuNTI5NCAxLjY1ODA0IDEwLjgxMDcgMS45MzkzNEMxMS4wOTIgMi4yMjA2NCAxMS4yNSAyLjYwMjE4IDExLjI1IDNWMy43NU04LjI1IDYuNzVIMTVDMTUuODI4NCA2Ljc1IDE2LjUgNy40MjE1NyAxNi41IDguMjVWMTVDMTYuNSAxNS44Mjg0IDE1LjgyODQgMTYuNSAxNSAxNi41SDguMjVDNy40MjE1NyAxNi41IDYuNzUgMTUuODI4NCA2Ljc1IDE1VjguMjVDNi43NSA3LjQyMTU3IDcuNDIxNTcgNi43NSA4LjI1IDYuNzVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF83MzBfNzYxNTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVwbGljYXRlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1hcHBpbmcgb2Ygc291cmNlPy5tYXBwaW5nSW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQm9keSBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWFwcGluZz8udHlwZSA9PT12aWV3TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9yaWdpbmFsIG9mIG1hcHBpbmc/LnJldmlzZWREZXRhaWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm9yaWdpbmFsPy5pc1BhcmVudCAmJiBvcmlnaW5hbD8ucmV2b3BzVHlwZSA9PT0nZHVwbGljYXRlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keSBiZy13aGl0ZSBsYXllcnMgcHktNSBweC0wIG0tM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yaWdpbmFsIEltYWdlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkdXBsaWNhdGUtaGVhZCBweC01IG15LTNcIj5PcmlnaW5hbCBpbWFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIGltZy1ib3JkZXIgYm9yZGVyIGJvcmRlci0xIGgtMTAwIHJvdW5kZWQtM1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VVcmwgKyBvcmlnaW5hbD8uZmlsZVBhdGhcIiBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIHJvdW5kZWQgYm9yZGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG15LTJcIj5UYW5nbyBJRDoge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwudGVtcElkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdmFsdWUgbXMtMlwiPkVudHJ5IFRpbWU6IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvcm1hdHRlZEVudHJ5VGltZShvcmlnaW5hbD8uZW50cnlUaW1lKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvciBzZXBhcmF0b3ItZGFzaGVkIG10LTMgbWItNVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJkdXBsaWNhdGUtaGVhZCBteS0zIGZzLTZcIj5UYWdnZWQgRHVwbGljYXRlczwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIiBjbGFzcz1cIm15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFyZUFsbER1cGxpY2F0ZXNTZWxlY3RlZChvcmlnaW5hbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVTZWxlY3RBbGxEdXBsaWNhdGVzKG9yaWdpbmFsLCAkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1zLTJcIj5TZWxlY3QgQWxsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGR1cGxpY2F0ZSBvZiBvcmlnaW5hbD8uZHVwbGljYXRlSW1hZ2U7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWQtMyBtYi0zIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYi0zIGgtMTAwIHJvdW5kZWQtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgJ2xheWVyLWFwcHJvdmVkJzogaXNBcHByb3ZlZChvcmlnaW5hbCksXHJcbiAgICAnbGF5ZXItcmVqZWN0ZWQnOiBpc1JlamVjdGVkKG9yaWdpbmFsKSxcclxuICAgICdpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSc6ICFpc0FwcHJvdmVkKG9yaWdpbmFsKSAmJiAhaXNSZWplY3RlZChvcmlnaW5hbCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAqbmdJZj1cIiFpc0FwcHJvdmVkKG9yaWdpbmFsKSAmJiAhaXNSZWplY3RlZChvcmlnaW5hbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicmlnaHQ6IDVweCA7IG1hcmdpbjogMTBweCA1cHggNHB4ICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0R1cGxpY2F0ZVNlbGVjdGVkKG9yaWdpbmFsLnRlbXBJZCwgZHVwbGljYXRlLnRlbXBJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25EdXBsaWNhdGVDaGVja2JveENoYW5nZShvcmlnaW5hbC50ZW1wSWQsIGR1cGxpY2F0ZS50ZW1wSWQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgZm9ybS1jaGVjay1pbnB1dCBkdXBsaWNhdGUtY2hlY2tib3hcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBcclxuICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBhYnNvbHV0ZVwiXHJcbiAgICAgKm5nSWY9XCJpc0FwcHJvdmVkKG9yaWdpbmFsKSB8fCBpc1JlamVjdGVkKG9yaWdpbmFsKVwiXHJcbiAgKGNsaWNrKT1cInJlc2V0Q2hlY2tib3goJ2VtcGxveWVlJywgb3JpZ2luYWwpXCIgPlxyXG5cclxuPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjE5XCIgdmlld0JveD1cIjAgMCAxOSAxOVwiIGZpbGw9XCJub25lXCI+XHJcbjxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzIwMjNfMTM3MTgpXCI+XHJcbjxyZWN0IHg9XCIxLjExMTMzXCIgeT1cIjAuNTU1NjY0XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgcng9XCIyXCIgZmlsbD1cIndoaXRlXCIvPlxyXG48cmVjdCB4PVwiMS4zODkxMVwiIHk9XCIwLjgzMzQ0MlwiIHdpZHRoPVwiMTUuNDQ0NFwiIGhlaWdodD1cIjE1LjQ0NDRcIiByeD1cIjEuNzIyMjJcIiBzdHJva2U9XCIjRDBENUREXCIgc3Ryb2tlLXdpZHRoPVwiMC41NTU1NTZcIi8+XHJcbjxwYXRoIGQ9XCJNNS44NzEwOSA4LjU1NTY2SDEyLjM1MjZcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMC45Mjc3NzhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvZz5cclxuPGRlZnM+XHJcbjxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMjAyM18xMzcxOFwiIHg9XCIwLjAwMDIxNzA4XCIgeT1cIjAuMDAwMTA4NTRcIiB3aWR0aD1cIjE4LjIyMjJcIiBoZWlnaHQ9XCIxOC4yMjIyXCIgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cclxuPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIi8+XHJcbjxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIiByZXN1bHQ9XCJoYXJkQWxwaGFcIi8+XHJcbjxmZU9mZnNldCBkeT1cIjAuNTU1NTU2XCIvPlxyXG48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiMC41NTU1NTZcIi8+XHJcbjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiLz5cclxuPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCIvPlxyXG48ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzIwMjNfMTM3MThcIiByZXN1bHQ9XCJzaGFwZVwiLz5cclxuPC9maWx0ZXI+XHJcbjwvZGVmcz5cclxuPC9zdmc+XHJcbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAoY2hhbmdlKT1cIm9uSW1hZ2VDaGVja2JveENoYW5nZShkdXBsaWNhdGUudGVtcElkLCAnZHVwbGljYXRlJywgJ29yaWdpbmFsJylcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER1cGxpY2F0ZSBJbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VVcmwgKyBkdXBsaWNhdGUuZmlsZVBhdGhcIiBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIHJvdW5kZWQgYm9yZGVyIGR1cGxpY2F0ZS1pbWFnZVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHVwbGljYXRlIEluZm8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdGl0bGUgbXMtMiBteS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhbmdvIElEOiB7eyBkdXBsaWNhdGUudGVtcElkIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEFjdGlvbihvcmlnaW5hbCwgJ3JldmlldycpPy5hY3Rpb24gPT09ICdhcHByb3ZlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG4gICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEwIDExXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMC41XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgcng9XCI1XCIgZmlsbD1cIiNEMUZBREZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjEyMjIgMy41NzkxOUw0LjEzODg3IDYuNDU4MzZMMy4zNDcyIDUuNjEyNTNDMy4yMDEzNyA1LjQ3NTAzIDIuOTcyMiA1LjQ2NjY5IDIuODA1NTMgNS41ODMzNkMyLjY0MzAzIDUuNzA0MTkgMi41OTcyIDUuOTE2NjkgMi42OTcyIDYuMDg3NTNMMy42MzQ3IDcuNjEyNTNDMy43MjYzNyA3Ljc1NDE5IDMuODg0NyA3Ljg0MTY5IDQuMDYzODcgNy44NDE2OUM0LjIzNDcgNy44NDE2OSA0LjM5NzIgNy43NTQxOSA0LjQ4ODg3IDcuNjEyNTNDNC42Mzg4NyA3LjQxNjY5IDcuNTAxMzcgNC4wMDQxOSA3LjUwMTM3IDQuMDA0MTlDNy44NzYzNyAzLjYyMDg2IDcuNDIyMiAzLjI4MzM2IDcuMTIyMiAzLjU3NTAzVjMuNTc5MTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxMkI3NkFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0QWN0aW9uKG9yaWdpbmFsLCAncmV2aWV3Jyk/LmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTJcIj48c3ZnIHN0eWxlPVwid2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTMgMTNcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTQyOF81OTQ4NClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNC41Mjk2MSAxLjVIOC42Njk2MUwxMS41OTk2IDQuNDNWOC41N0w4LjY2OTYxIDExLjVINC41Mjk2MUwxLjU5OTYxIDguNTdWNC40M0w0LjUyOTYxIDEuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGRUU0RTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjA5OTYxIDVMNS4wOTk2MSA4TTUuMDk5NjEgNUw4LjA5OTYxIDhNNC41Mjk2MSAxLjVIOC42Njk2MUwxMS41OTk2IDQuNDNWOC41N0w4LjY2OTYxIDExLjVINC41Mjk2MUwxLjU5OTYxIDguNTdWNC40M0w0LjUyOTYxIDEuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTQyOF81OTQ4NFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMC41OTk2MDkgMC41KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdmFsdWUgbXMtMlwiPkVudHJ5IFRpbWU6IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvcm1hdHRlZEVudHJ5VGltZShkdXBsaWNhdGUuZW50cnlUaW1lKSB9fTwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER1cGxpY2F0ZSBSZWFzb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR1cGxpY2F0ZS1yZWFzb24gbXMtMiBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj57eyBkdXBsaWNhdGUucmVhc29uIH19PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFN0YXR1cyBJY29ucyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgcHktNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy1hY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY2NvcmRpb24gSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVDb21tZW50c0FjY29yZGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRzLWNvdW50XCI+e3sgY29tbWVudHM/Lmxlbmd0aCB9fSBDb21tZW50czwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWFycm93IG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbY2xhc3Mucm90YXRlZF09XCJjb21tZW50c0FjY29yZGlvbk9wZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBCb2R5IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWJvZHlcIiAqbmdJZj1cImNvbW1lbnRzQWNjb3JkaW9uT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBjb21tZW50c1wiIGNsYXNzPVwiY29tbWVudC10aHJlYWQgZC1mbGV4IG1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGF2YXRhciAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29tbWVudC1hdmF0YXIgbWUtM1wiIFtzcmNdPVwiYy5hdmF0YXJcIiBhbHQ9XCJhdmF0YXJcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbnRlbnQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgYy5lbWFpbCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYy50aW1lIHwgZGF0ZTonaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gb3B0aW9uYWwgbWFpbiBsaW5lIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTIgbXQtMlwiICpuZ0lmPVwiYy5tYWluVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYy5tYWluVGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1hcmtlZCBhcyDigJzigKbigJ0gbGluZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCIgKm5nSWY9XCJjLnN0YXR1c0xhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZWQgYXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIid0ZXh0LScgKyBjLnN0YXR1c1R5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDigJx7eyBjLnN0YXR1c0xhYmVsIH194oCdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbm90ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJjLm5vdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMubm90ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGltYWdlIGNhcmRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaW1nIG9mIGMuaW1hZ2VzXCIgY2xhc3M9XCJ0YW5nby1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWltYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCIndXJsKCcgKyBpbWcudXJsICsgJyknXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1tZXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiPlRhbmdvIElEOiB7eyBpbWcudGFuZ29JZCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpbWcuc3RhdHVzID09PSAnYXBwcm92ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtYXBwcm92ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nLnN0YXR1cyA9PT0gJ3JlamVjdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtcmVqZWN0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIj5FbnRyeSB0aW1lOiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLmVudHJ5VGltZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gK04gbW9yZSBjYXJkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImMubW9yZUNvdW50ID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YW5nby1jYXJkIG1vcmUtY2FyZCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAre3sgYy5tb3JlQ291bnQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic291cmNlPy5kdXBsaWNhdGVJbWFnZXM/Lmxlbmd0aFwiIGNsYXNzPVwibXktNyBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiIWR1cGxpY2F0ZUFDQ291bnRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtZS0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBvcHVwT3BlbigncmVqZWN0ZWQnLCdkdXBsaWNhdGUnKVwiPlJlamVjdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cIiFkdXBsaWNhdGVBQ0NvdW50XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXMtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwb3B1cE9wZW4oJ2FwcHJvdmVkJywnZHVwbGljYXRlJylcIj5BcHByb3ZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInNvdXJjZT8uZHVwbGljYXRlSW1hZ2VzPy5sZW5ndGhcIiBjbGFzcz1cInNlcGFyYXRvciBzZXBhcmF0b3ItZGFzaGVkIG10LTMgbWItNVwiPjwvZGl2PiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYXllcnMgbXktMlwiICpuZ0lmPVwiaGFzUmV2b3BzVHlwZSgnZW1wbG95ZWUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIG1pbi1oLTI1cHggcHQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkdXBsaWNhdGUtaGVhZCB0ZXh0LWxnIG15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBpY29uIGhlcmUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcGxveWVlL1N0YWZmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDaGVja2JveEVuYWJsZVwiIGNsYXNzPVwibXMtMyBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwic2VsZWN0QWxsQnlUeXBlLmVtcGxveWVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdEFsbCgnZW1wbG95ZWUnLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBBbGw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBsb29wIG92ZXIgdGlja2V0cyAtLT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbWFwcGluZyBvZiBzb3VyY2U/Lm1hcHBpbmdJbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm1hcHBpbmc/LnR5cGUgPT09IHZpZXdNb2RlXCIgIGNsYXNzPVwiY2FyZC1ib2R5IGJnLXdoaXRlIGxheWVycyBwLTUgbS0zXCJcclxuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcmlnaW5hbCBvZiBtYXBwaW5nPy5yZXZpc2VkRGV0YWlsXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcmlnaW5hbD8ucmV2b3BzVHlwZSA9PT0gJ2VtcGxveWVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1kLTMgbWItMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYi0zICBoLTEwMCByb3VuZGVkLTMgcG9zaXRpb24tcmVsYXRpdmVcIiAgW25nQ2xhc3NdPVwie1xyXG4gICAgJ2xheWVyLWFwcHJvdmVkJzogaXNBcHByb3ZlZChvcmlnaW5hbCksXHJcbiAgICAnbGF5ZXItcmVqZWN0ZWQnOiBpc1JlamVjdGVkKG9yaWdpbmFsKSxcclxuICAgICdpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSc6ICFpc0FwcHJvdmVkKG9yaWdpbmFsKSAmJiAhaXNSZWplY3RlZChvcmlnaW5hbCl9XCI+XHJcbjxkaXYgKm5nSWY9XCJpc0NoZWNrYm94RW5hYmxlXCI+XHJcblxyXG4gICAgPGlucHV0ICpuZ0lmPVwiIWlzQXBwcm92ZWQob3JpZ2luYWwpICYmICFpc1JlamVjdGVkKG9yaWdpbmFsKVwiIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBhYnNvbHV0ZSBmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEJ5VHlwZS5lbXBsb3llZS5pbmNsdWRlcyhvcmlnaW5hbD8udGVtcElkKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkltYWdlQ2hlY2tib3hDaGFuZ2UoJ2VtcGxveWVlJywgb3JpZ2luYWwudGVtcElkKVwiIC8+XHJcbiAgICAgICAgPHNwYW4gXHJcbiAgICAgIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgYWJzb2x1dGVcIlxyXG4gICAgICpuZ0lmPVwiaXNBcHByb3ZlZChvcmlnaW5hbCkgfHwgaXNSZWplY3RlZChvcmlnaW5hbClcIlxyXG4gIChjbGljayk9XCJyZXNldENoZWNrYm94KCdlbXBsb3llZScsIG9yaWdpbmFsKVwiID5cclxuXHJcbjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxOVwiIHZpZXdCb3g9XCIwIDAgMTkgMTlcIiBmaWxsPVwibm9uZVwiPlxyXG48ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8yMDIzXzEzNzE4KVwiPlxyXG48cmVjdCB4PVwiMS4xMTEzM1wiIHk9XCIwLjU1NTY2NFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiMlwiIGZpbGw9XCJ3aGl0ZVwiLz5cclxuPHJlY3QgeD1cIjEuMzg5MTFcIiB5PVwiMC44MzM0NDJcIiB3aWR0aD1cIjE1LjQ0NDRcIiBoZWlnaHQ9XCIxNS40NDQ0XCIgcng9XCIxLjcyMjIyXCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjAuNTU1NTU2XCIvPlxyXG48cGF0aCBkPVwiTTUuODcxMDkgOC41NTU2NkgxMi4zNTI2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjAuOTI3Nzc4XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG48L2c+XHJcbjxkZWZzPlxyXG48ZmlsdGVyIGlkPVwiZmlsdGVyMF9kXzIwMjNfMTM3MThcIiB4PVwiMC4wMDAyMTcwOFwiIHk9XCIwLjAwMDEwODU0XCIgd2lkdGg9XCIxOC4yMjIyXCIgaGVpZ2h0PVwiMTguMjIyMlwiIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XHJcbjxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIvPlxyXG48ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCIgcmVzdWx0PVwiaGFyZEFscGhhXCIvPlxyXG48ZmVPZmZzZXQgZHk9XCIwLjU1NTU1NlwiLz5cclxuPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjAuNTU1NTU2XCIvPlxyXG48ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIi8+XHJcbjxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMjAyM18xMzcxOFwiLz5cclxuPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCIgcmVzdWx0PVwic2hhcGVcIi8+XHJcbjwvZmlsdGVyPlxyXG48L2RlZnM+XHJcbjwvc3ZnPlxyXG48L3NwYW4+XHJcblxyXG48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VVcmwgKyBvcmlnaW5hbD8uZmlsZVBhdGhcIiBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDAgcm91bmRlZCBib3JkZXJcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXRpdGxlIG1zLTIgbXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhbmdvIElEOiB7eyBvcmlnaW5hbC50ZW1wSWQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBY3Rpb24ob3JpZ2luYWwsICdyZXZpZXcnKT8uYWN0aW9uID09PSAnYXBwcm92ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAxMCAxMVwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjAuNVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiNVwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4xMjIyIDMuNTc5MTlMNC4xMzg4NyA2LjQ1ODM2TDMuMzQ3MiA1LjYxMjUzQzMuMjAxMzcgNS40NzUwMyAyLjk3MjIgNS40NjY2OSAyLjgwNTUzIDUuNTgzMzZDMi42NDMwMyA1LjcwNDE5IDIuNTk3MiA1LjkxNjY5IDIuNjk3MiA2LjA4NzUzTDMuNjM0NyA3LjYxMjUzQzMuNzI2MzcgNy43NTQxOSAzLjg4NDcgNy44NDE2OSA0LjA2Mzg3IDcuODQxNjlDNC4yMzQ3IDcuODQxNjkgNC4zOTcyIDcuNzU0MTkgNC40ODg4NyA3LjYxMjUzQzQuNjM4ODcgNy40MTY2OSA3LjUwMTM3IDQuMDA0MTkgNy41MDEzNyA0LjAwNDE5QzcuODc2MzcgMy42MjA4NiA3LjQyMjIgMy4yODMzNiA3LjEyMjIgMy41NzUwM1YzLjU3OTE5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTJCNzZBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEFjdGlvbihvcmlnaW5hbCwgJ3JldmlldycpPy5hY3Rpb24gPT09ICdyZWplY3RlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG4gICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEzIDEzXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE0MjhfNTk0ODQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkVFNEUyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wOTk2MSA1TDUuMDk5NjEgOE01LjA5OTYxIDVMOC4wOTk2MSA4TTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE0MjhfNTk0ODRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuNTk5NjA5IDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdmFsdWUgbXMtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5IFRpbWU6IHt7IGdldEZvcm1hdHRlZEVudHJ5VGltZShvcmlnaW5hbD8uZW50cnlUaW1lKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBweS01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRzLWFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBIZWFkZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbW1lbnRzQWNjb3JkaW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRzLWNvdW50XCI+e3sgY29tbWVudHM/Lmxlbmd0aCB9fSBDb21tZW50czwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1hcnJvdyBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLnJvdGF0ZWRdPVwiY29tbWVudHNBY2NvcmRpb25PcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBDb250ZW50IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWJvZHlcIiAqbmdJZj1cImNvbW1lbnRzQWNjb3JkaW9uT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBjb21tZW50c1wiIGNsYXNzPVwiY29tbWVudC10aHJlYWQgZC1mbGV4IG1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGF2YXRhciAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29tbWVudC1hdmF0YXIgbWUtM1wiIFtzcmNdPVwiYy5hdmF0YXJcIiBhbHQ9XCJhdmF0YXJcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbnRlbnQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgYy5lbWFpbCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYy50aW1lIHwgZGF0ZTonaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gb3B0aW9uYWwgbWFpbiBsaW5lIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTIgbXQtMlwiICpuZ0lmPVwiYy5tYWluVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYy5tYWluVGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1hcmtlZCBhcyDigJzigKbigJ0gbGluZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCIgKm5nSWY9XCJjLnN0YXR1c0xhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZWQgYXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIid0ZXh0LScgKyBjLnN0YXR1c1R5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDigJx7eyBjLnN0YXR1c0xhYmVsIH194oCdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbm90ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJjLm5vdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMubm90ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGltYWdlIGNhcmRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaW1nIG9mIGMuaW1hZ2VzXCIgY2xhc3M9XCJ0YW5nby1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWltYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCIndXJsKCcgKyBpbWcudXJsICsgJyknXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1tZXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiPlRhbmdvIElEOiB7eyBpbWcudGFuZ29JZCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpbWcuc3RhdHVzID09PSAnYXBwcm92ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtYXBwcm92ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nLnN0YXR1cyA9PT0gJ3JlamVjdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtcmVqZWN0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIj5FbnRyeSB0aW1lOiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLmVudHJ5VGltZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gK04gbW9yZSBjYXJkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImMubW9yZUNvdW50ID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YW5nby1jYXJkIG1vcmUtY2FyZCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAre3sgYy5tb3JlQ291bnQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5ZXJzIG15LTJcIiAqbmdJZj1cImhhc1Jldm9wc1R5cGUoJ2hvdXNlS2VlcGluZycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgbWluLWgtMjVweCBwdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR1cGxpY2F0ZS1oZWFkIHRleHQtbGcgbXktM1wiPjxzcGFuIGNsYXNzPVwibWUtMlwiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy41MTk5NSAwLjYxMzA2NUM4LjMzNzM5IC0wLjIwNDM1NSA5LjY2MjY3IC0wLjIwNDM1NSAxMC40ODAxIDAuNjEzMDY1TDE3LjM4NyA3LjUxOTk1QzE4LjIwNDMgOC4zMzczOSAxOC4yMDQzIDkuNjYyNjcgMTcuMzg3IDEwLjQ4MDFMMTAuNDgwMSAxNy4zODdDOS42NjI2NyAxOC4yMDQzIDguMzM3MzkgMTguMjA0MyA3LjUxOTk1IDE3LjM4N0w1LjU0NjI2IDE1LjQxMzNMMy43MzcwOCAxNy4yMjI0QzIuOTE5NjYgMTguMDM5OSAxLjU5NDM2IDE4LjAzOTkgMC43NzY5NDQgMTcuMjIyNEMtMC4wNDA0NzY3IDE2LjQwNTEgLTAuMDQwNDc2NyAxNS4wNzk3IDAuNzc2OTQ0IDE0LjI2MjRMMi41ODYxMiAxMi40NTMxTDAuNjEzMDY1IDEwLjQ4MDFDLTAuMjA0MzU1IDkuNjYyNjcgLTAuMjA0MzU1IDguMzM3MzkgMC42MTMwNjUgNy41MTk5NUw3LjUxOTk1IDAuNjEzMDY1Wk05LjQ5MzM2IDEuNTk5NzhDOS4yMjA4OCAxLjMyNzMxIDguNzc5MDkgMS4zMjczMSA4LjUwNjYxIDEuNTk5NzhMMy41NzI4NiA2LjUzMzU3TDExLjQ2NjUgMTQuNDI3MkwxNi40MDAyIDkuNDkzMzZDMTYuNjcyNyA5LjIyMDg4IDE2LjY3MjcgOC43NzkwOSAxNi40MDAyIDguNTA2N0wxMi45NDY1IDUuMDUyODZMMTEuNzk1MiA2LjIwNDAzQzExLjUyMjggNi40NzY1IDExLjA4MTEgNi40NzY1IDEwLjgwODYgNi4yMDQwM0MxMC41MzYxIDUuOTMxNTUgMTAuNTM2MSA1LjQ4OTc4IDEwLjgwODYgNS4yMTczMUwxMS45NTk3IDQuMDY2MTRMMTAuOTczMiAzLjA3OTY0TDguMTc3NTcgNS44NzUzM0M3LjkwNTA5IDYuMTQ3OCA3LjQ2MzI5IDYuMTQ3OCA3LjE5MDgxIDUuODc1MzNDNi45MTgzMyA1LjYwMjg2IDYuOTE4MzMgNS4xNjEwOSA3LjE5MDgxIDQuODg4NjJMOS45ODY1IDIuMDkyOTNMOS40OTMzNiAxLjU5OTc4Wk0xMC40Nzk3IDE1LjQxMzlMMi41ODYxNSA3LjUyMDI4TDEuNTk5NzggOC41MDY3QzEuMzI3MyA4Ljc3OTA5IDEuMzI3MyA5LjIyMDg4IDEuNTk5NzggOS40OTMzNkw4LjUwNjYxIDE2LjQwMDJDOC43NzkwOSAxNi42NzI3IDkuMjIwODggMTYuNjcyNyA5LjQ5MzM2IDE2LjQwMDJMMTAuNDc5NyAxNS40MTM5Wk0zLjU3Mjc1IDEzLjQzOTlMMS43NjM2NiAxNS4yNDlDMS40OTExOSAxNS41MjE1IDEuNDkxMTkgMTUuOTYzMyAxLjc2MzY2IDE2LjIzNThDMi4wMzYxMyAxNi41MDgyIDIuNDc3OSAxNi41MDgyIDIuNzUwMzcgMTYuMjM1OEw0LjU1OTQ2IDE0LjQyNjZMMy41NzI3NSAxMy40Mzk5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj4gSG91c2UgS2VlcGluZ1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIiBjbGFzcz1cIm1zLTMgbXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInNlbGVjdEFsbEJ5VHlwZS5ob3VzZUtlZXBpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsKCdob3VzZUtlZXBpbmcnLCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2VsZWN0IEFsbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1hcHBpbmcgb2Ygc291cmNlPy5tYXBwaW5nSW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQm9keSBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtYXBwaW5nPy50eXBlID09PXZpZXdNb2RlXCIgY2xhc3M9XCJjYXJkLWJvZHkgYmctd2hpdGUgbGF5ZXJzIHAtNSBtLTNcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9yaWdpbmFsIG9mIG1hcHBpbmc/LnJldmlzZWREZXRhaWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3JpZ2luYWw/LnJldm9wc1R5cGUgPT09J2hvdXNlS2VlcGluZydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0zIG1iLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYi0zIGgtMTAwIHJvdW5kZWQtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAnbGF5ZXItYXBwcm92ZWQnOiBpc0FwcHJvdmVkKG9yaWdpbmFsKSxcclxuICAgICdsYXllci1yZWplY3RlZCc6IGlzUmVqZWN0ZWQob3JpZ2luYWwpLFxyXG4gICAgJ2ltZy1ib3JkZXIgYm9yZGVyIGJvcmRlci0xJzogIWlzQXBwcm92ZWQob3JpZ2luYWwpICYmICFpc1JlamVjdGVkKG9yaWdpbmFsKX1cIj5cclxuIFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVG9wLXJpZ2h0IENoZWNrYm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NoZWNrYm94RW5hYmxlXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhaXNBcHByb3ZlZChvcmlnaW5hbCkgJiYgIWlzUmVqZWN0ZWQob3JpZ2luYWwpXCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgYWJzb2x1dGUgZm9ybS1jaGVjay1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEJ5VHlwZS5ob3VzZUtlZXBpbmcuaW5jbHVkZXMob3JpZ2luYWw/LnRlbXBJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkltYWdlQ2hlY2tib3hDaGFuZ2UoJ2hvdXNlS2VlcGluZycsIG9yaWdpbmFsLnRlbXBJZClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBcclxuICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBhYnNvbHV0ZVwiXHJcbiAgICAgKm5nSWY9XCJpc0FwcHJvdmVkKG9yaWdpbmFsKSB8fCBpc1JlamVjdGVkKG9yaWdpbmFsKVwiXHJcbiAgKGNsaWNrKT1cInJlc2V0Q2hlY2tib3goJ2VtcGxveWVlJywgb3JpZ2luYWwpXCIgPlxyXG5cclxuPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjE5XCIgdmlld0JveD1cIjAgMCAxOSAxOVwiIGZpbGw9XCJub25lXCI+XHJcbjxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzIwMjNfMTM3MTgpXCI+XHJcbjxyZWN0IHg9XCIxLjExMTMzXCIgeT1cIjAuNTU1NjY0XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgcng9XCIyXCIgZmlsbD1cIndoaXRlXCIvPlxyXG48cmVjdCB4PVwiMS4zODkxMVwiIHk9XCIwLjgzMzQ0MlwiIHdpZHRoPVwiMTUuNDQ0NFwiIGhlaWdodD1cIjE1LjQ0NDRcIiByeD1cIjEuNzIyMjJcIiBzdHJva2U9XCIjRDBENUREXCIgc3Ryb2tlLXdpZHRoPVwiMC41NTU1NTZcIi8+XHJcbjxwYXRoIGQ9XCJNNS44NzEwOSA4LjU1NTY2SDEyLjM1MjZcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMC45Mjc3NzhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvZz5cclxuPGRlZnM+XHJcbjxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMjAyM18xMzcxOFwiIHg9XCIwLjAwMDIxNzA4XCIgeT1cIjAuMDAwMTA4NTRcIiB3aWR0aD1cIjE4LjIyMjJcIiBoZWlnaHQ9XCIxOC4yMjIyXCIgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cclxuPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIi8+XHJcbjxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIiByZXN1bHQ9XCJoYXJkQWxwaGFcIi8+XHJcbjxmZU9mZnNldCBkeT1cIjAuNTU1NTU2XCIvPlxyXG48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiMC41NTU1NTZcIi8+XHJcbjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiLz5cclxuPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCIvPlxyXG48ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzIwMjNfMTM3MThcIiByZXN1bHQ9XCJzaGFwZVwiLz5cclxuPC9maWx0ZXI+XHJcbjwvZGVmcz5cclxuPC9zdmc+XHJcbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgb3JpZ2luYWw/LmZpbGVQYXRoXCIgYWx0PVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIHJvdW5kZWQgYm9yZGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXRpdGxlIG1zLTIgbXktMlwiPlRhbmdvIElEOiB7eyBvcmlnaW5hbC50ZW1wSWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEFjdGlvbihvcmlnaW5hbCwgJ3JldmlldycpPy5hY3Rpb24gPT09ICdhcHByb3ZlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG4gICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEwIDExXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMC41XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgcng9XCI1XCIgZmlsbD1cIiNEMUZBREZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjEyMjIgMy41NzkxOUw0LjEzODg3IDYuNDU4MzZMMy4zNDcyIDUuNjEyNTNDMy4yMDEzNyA1LjQ3NTAzIDIuOTcyMiA1LjQ2NjY5IDIuODA1NTMgNS41ODMzNkMyLjY0MzAzIDUuNzA0MTkgMi41OTcyIDUuOTE2NjkgMi42OTcyIDYuMDg3NTNMMy42MzQ3IDcuNjEyNTNDMy43MjYzNyA3Ljc1NDE5IDMuODg0NyA3Ljg0MTY5IDQuMDYzODcgNy44NDE2OUM0LjIzNDcgNy44NDE2OSA0LjM5NzIgNy43NTQxOSA0LjQ4ODg3IDcuNjEyNTNDNC42Mzg4NyA3LjQxNjY5IDcuNTAxMzcgNC4wMDQxOSA3LjUwMTM3IDQuMDA0MTlDNy44NzYzNyAzLjYyMDg2IDcuNDIyMiAzLjI4MzM2IDcuMTIyMiAzLjU3NTAzVjMuNTc5MTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxMkI3NkFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBY3Rpb24ob3JpZ2luYWwsICdyZXZpZXcnKT8uYWN0aW9uID09PSAncmVqZWN0ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNDI4XzU5NDg0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZFRTRFMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDk5NjEgNUw1LjA5OTYxIDhNNS4wOTk2MSA1TDguMDk5NjEgOE00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNDI4XzU5NDg0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLjU5OTYwOSAwLjUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy12YWx1ZSBtcy0yXCI+RW50cnkgVGltZToge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXR0ZWRFbnRyeVRpbWUob3JpZ2luYWw/LmVudHJ5VGltZSkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBweS01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRzLWFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBIZWFkZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbW1lbnRzQWNjb3JkaW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRzLWNvdW50XCI+e3sgY29tbWVudHM/Lmxlbmd0aCB9fSBDb21tZW50czwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1hcnJvdyBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLnJvdGF0ZWRdPVwiY29tbWVudHNBY2NvcmRpb25PcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBDb250ZW50IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWJvZHlcIiAqbmdJZj1cImNvbW1lbnRzQWNjb3JkaW9uT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBjb21tZW50c1wiIGNsYXNzPVwiY29tbWVudC10aHJlYWQgZC1mbGV4IG1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGF2YXRhciAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29tbWVudC1hdmF0YXIgbWUtM1wiIFtzcmNdPVwiYy5hdmF0YXJcIiBhbHQ9XCJhdmF0YXJcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbnRlbnQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgYy5lbWFpbCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYy50aW1lIHwgZGF0ZTonaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gb3B0aW9uYWwgbWFpbiBsaW5lIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTIgbXQtMlwiICpuZ0lmPVwiYy5tYWluVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYy5tYWluVGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1hcmtlZCBhcyDigJzigKbigJ0gbGluZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCIgKm5nSWY9XCJjLnN0YXR1c0xhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZWQgYXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIid0ZXh0LScgKyBjLnN0YXR1c1R5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDigJx7eyBjLnN0YXR1c0xhYmVsIH194oCdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbm90ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJjLm5vdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMubm90ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGltYWdlIGNhcmRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaW1nIG9mIGMuaW1hZ2VzXCIgY2xhc3M9XCJ0YW5nby1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWltYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCIndXJsKCcgKyBpbWcudXJsICsgJyknXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1tZXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiPlRhbmdvIElEOiB7eyBpbWcudGFuZ29JZCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpbWcuc3RhdHVzID09PSAnYXBwcm92ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtYXBwcm92ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nLnN0YXR1cyA9PT0gJ3JlamVjdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtcmVqZWN0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIj5FbnRyeSB0aW1lOiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLmVudHJ5VGltZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gK04gbW9yZSBjYXJkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImMubW9yZUNvdW50ID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YW5nby1jYXJkIG1vcmUtY2FyZCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAre3sgYy5tb3JlQ291bnQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5ZXJzIG15LTJcIiAqbmdJZj1cImhhc1Jldm9wc1R5cGUoJ2p1bmsnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIG1pbi1oLTI1cHggcHQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkdXBsaWNhdGUtaGVhZCB0ZXh0LWxnIG15LTNcIj48c3BhbiBjbGFzcz1cIm1lLTJcIj48c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNTE5OTUgMC42MTMwNjVDOC4zMzczOSAtMC4yMDQzNTUgOS42NjI2NyAtMC4yMDQzNTUgMTAuNDgwMSAwLjYxMzA2NUwxNy4zODcgNy41MTk5NUMxOC4yMDQzIDguMzM3MzkgMTguMjA0MyA5LjY2MjY3IDE3LjM4NyAxMC40ODAxTDEwLjQ4MDEgMTcuMzg3QzkuNjYyNjcgMTguMjA0MyA4LjMzNzM5IDE4LjIwNDMgNy41MTk5NSAxNy4zODdMNS41NDYyNiAxNS40MTMzTDMuNzM3MDggMTcuMjIyNEMyLjkxOTY2IDE4LjAzOTkgMS41OTQzNiAxOC4wMzk5IDAuNzc2OTQ0IDE3LjIyMjRDLTAuMDQwNDc2NyAxNi40MDUxIC0wLjA0MDQ3NjcgMTUuMDc5NyAwLjc3Njk0NCAxNC4yNjI0TDIuNTg2MTIgMTIuNDUzMUwwLjYxMzA2NSAxMC40ODAxQy0wLjIwNDM1NSA5LjY2MjY3IC0wLjIwNDM1NSA4LjMzNzM5IDAuNjEzMDY1IDcuNTE5OTVMNy41MTk5NSAwLjYxMzA2NVpNOS40OTMzNiAxLjU5OTc4QzkuMjIwODggMS4zMjczMSA4Ljc3OTA5IDEuMzI3MzEgOC41MDY2MSAxLjU5OTc4TDMuNTcyODYgNi41MzM1N0wxMS40NjY1IDE0LjQyNzJMMTYuNDAwMiA5LjQ5MzM2QzE2LjY3MjcgOS4yMjA4OCAxNi42NzI3IDguNzc5MDkgMTYuNDAwMiA4LjUwNjdMMTIuOTQ2NSA1LjA1Mjg2TDExLjc5NTIgNi4yMDQwM0MxMS41MjI4IDYuNDc2NSAxMS4wODExIDYuNDc2NSAxMC44MDg2IDYuMjA0MDNDMTAuNTM2MSA1LjkzMTU1IDEwLjUzNjEgNS40ODk3OCAxMC44MDg2IDUuMjE3MzFMMTEuOTU5NyA0LjA2NjE0TDEwLjk3MzIgMy4wNzk2NEw4LjE3NzU3IDUuODc1MzNDNy45MDUwOSA2LjE0NzggNy40NjMyOSA2LjE0NzggNy4xOTA4MSA1Ljg3NTMzQzYuOTE4MzMgNS42MDI4NiA2LjkxODMzIDUuMTYxMDkgNy4xOTA4MSA0Ljg4ODYyTDkuOTg2NSAyLjA5MjkzTDkuNDkzMzYgMS41OTk3OFpNMTAuNDc5NyAxNS40MTM5TDIuNTg2MTUgNy41MjAyOEwxLjU5OTc4IDguNTA2N0MxLjMyNzMgOC43NzkwOSAxLjMyNzMgOS4yMjA4OCAxLjU5OTc4IDkuNDkzMzZMOC41MDY2MSAxNi40MDAyQzguNzc5MDkgMTYuNjcyNyA5LjIyMDg4IDE2LjY3MjcgOS40OTMzNiAxNi40MDAyTDEwLjQ3OTcgMTUuNDEzOVpNMy41NzI3NSAxMy40Mzk5TDEuNzYzNjYgMTUuMjQ5QzEuNDkxMTkgMTUuNTIxNSAxLjQ5MTE5IDE1Ljk2MzMgMS43NjM2NiAxNi4yMzU4QzIuMDM2MTMgMTYuNTA4MiAyLjQ3NzkgMTYuNTA4MiAyLjc1MDM3IDE2LjIzNThMNC41NTk0NiAxNC40MjY2TDMuNTcyNzUgMTMuNDM5OVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+IEp1bmtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NoZWNrYm94RW5hYmxlXCIgY2xhc3M9XCJtcy0zIG15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RBbGxCeVR5cGUuanVua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGwoJ2p1bmsnLCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2VsZWN0IEFsbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1hcHBpbmcgb2Ygc291cmNlPy5tYXBwaW5nSW5mb1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9uZSBjYXJkIGZvciBhbGwganVuayBpbWFnZXMgaW4gdGhpcyBtYXBwaW5nIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtYXBwaW5nPy50eXBlID09PXZpZXdNb2RlXCIgY2xhc3M9XCJjYXJkLWJvZHkgYmctd2hpdGUgbGF5ZXJzIHAtNSBtLTNcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTG9vcCB0aHJvdWdoIGFsbCBpdGVtcyBpbiByZXZpc2VkRGV0YWlsIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3JpZ2luYWwgb2YgbWFwcGluZz8ucmV2aXNlZERldGFpbFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNob3cgb25seSBqdW5rIGl0ZW1zIGFzIGNvbHVtbnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm9yaWdpbmFsPy5yZXZvcHNUeXBlID09PSAnanVuaydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0zIG1iLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGItMyBoLTEwMCByb3VuZGVkLTMgcG9zaXRpb24tcmVsYXRpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgJ2xheWVyLWFwcHJvdmVkJzogaXNBcHByb3ZlZChvcmlnaW5hbCksXHJcbiAgICAnbGF5ZXItcmVqZWN0ZWQnOiBpc1JlamVjdGVkKG9yaWdpbmFsKSxcclxuICAgICdpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSc6ICFpc0FwcHJvdmVkKG9yaWdpbmFsKSAmJiAhaXNSZWplY3RlZChvcmlnaW5hbCl9XCI+XHJcbiAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUb3AtcmlnaHQgQ2hlY2tib3ggLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFpc0FwcHJvdmVkKG9yaWdpbmFsKSAmJiAhaXNSZWplY3RlZChvcmlnaW5hbClcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBhYnNvbHV0ZSBmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkQnlUeXBlLmp1bmsuaW5jbHVkZXMob3JpZ2luYWw/LnRlbXBJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkltYWdlQ2hlY2tib3hDaGFuZ2UoJ2p1bmsnLCBvcmlnaW5hbC50ZW1wSWQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBcclxuICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBhYnNvbHV0ZVwiXHJcbiAgICAgKm5nSWY9XCJpc0FwcHJvdmVkKG9yaWdpbmFsKSB8fCBpc1JlamVjdGVkKG9yaWdpbmFsKVwiXHJcbiAgKGNsaWNrKT1cInJlc2V0Q2hlY2tib3goJ2VtcGxveWVlJywgb3JpZ2luYWwpXCIgPlxyXG5cclxuPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjE5XCIgdmlld0JveD1cIjAgMCAxOSAxOVwiIGZpbGw9XCJub25lXCI+XHJcbjxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzIwMjNfMTM3MTgpXCI+XHJcbjxyZWN0IHg9XCIxLjExMTMzXCIgeT1cIjAuNTU1NjY0XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgcng9XCIyXCIgZmlsbD1cIndoaXRlXCIvPlxyXG48cmVjdCB4PVwiMS4zODkxMVwiIHk9XCIwLjgzMzQ0MlwiIHdpZHRoPVwiMTUuNDQ0NFwiIGhlaWdodD1cIjE1LjQ0NDRcIiByeD1cIjEuNzIyMjJcIiBzdHJva2U9XCIjRDBENUREXCIgc3Ryb2tlLXdpZHRoPVwiMC41NTU1NTZcIi8+XHJcbjxwYXRoIGQ9XCJNNS44NzEwOSA4LjU1NTY2SDEyLjM1MjZcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMC45Mjc3NzhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvZz5cclxuPGRlZnM+XHJcbjxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMjAyM18xMzcxOFwiIHg9XCIwLjAwMDIxNzA4XCIgeT1cIjAuMDAwMTA4NTRcIiB3aWR0aD1cIjE4LjIyMjJcIiBoZWlnaHQ9XCIxOC4yMjIyXCIgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cclxuPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIi8+XHJcbjxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIiByZXN1bHQ9XCJoYXJkQWxwaGFcIi8+XHJcbjxmZU9mZnNldCBkeT1cIjAuNTU1NTU2XCIvPlxyXG48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiMC41NTU1NTZcIi8+XHJcbjxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiLz5cclxuPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCIvPlxyXG48ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzIwMjNfMTM3MThcIiByZXN1bHQ9XCJzaGFwZVwiLz5cclxuPC9maWx0ZXI+XHJcbjwvZGVmcz5cclxuPC9zdmc+XHJcbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VVcmwgKyBvcmlnaW5hbD8uZmlsZVBhdGhcIiBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDAgcm91bmRlZCBib3JkZXJcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXRpdGxlIG1zLTIgbXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhbmdvIElEOiB7eyBvcmlnaW5hbC50ZW1wSWQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBY3Rpb24ob3JpZ2luYWwsICdyZXZpZXcnKT8uYWN0aW9uID09PSAnYXBwcm92ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAxMCAxMVwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjAuNVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiNVwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4xMjIyIDMuNTc5MTlMNC4xMzg4NyA2LjQ1ODM2TDMuMzQ3MiA1LjYxMjUzQzMuMjAxMzcgNS40NzUwMyAyLjk3MjIgNS40NjY2OSAyLjgwNTUzIDUuNTgzMzZDMi42NDMwMyA1LjcwNDE5IDIuNTk3MiA1LjkxNjY5IDIuNjk3MiA2LjA4NzUzTDMuNjM0NyA3LjYxMjUzQzMuNzI2MzcgNy43NTQxOSAzLjg4NDcgNy44NDE2OSA0LjA2Mzg3IDcuODQxNjlDNC4yMzQ3IDcuODQxNjkgNC4zOTcyIDcuNzU0MTkgNC40ODg4NyA3LjYxMjUzQzQuNjM4ODcgNy40MTY2OSA3LjUwMTM3IDQuMDA0MTkgNy41MDEzNyA0LjAwNDE5QzcuODc2MzcgMy42MjA4NiA3LjQyMjIgMy4yODMzNiA3LjEyMjIgMy41NzUwM1YzLjU3OTE5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTJCNzZBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEFjdGlvbihvcmlnaW5hbCwgJ3JldmlldycpPy5hY3Rpb24gPT09ICdyZWplY3RlZCdcclxuICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG4gICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEzIDEzXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE0MjhfNTk0ODQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkVFNEUyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wOTk2MSA1TDUuMDk5NjEgOE01LjA5OTYxIDVMOC4wOTk2MSA4TTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE0MjhfNTk0ODRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuNTk5NjA5IDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXZhbHVlIG1zLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeSBUaW1lOiB7eyBnZXRGb3JtYXR0ZWRFbnRyeVRpbWUob3JpZ2luYWw/LmVudHJ5VGltZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBweS01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRzLWFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBIZWFkZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbW1lbnRzQWNjb3JkaW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRzLWNvdW50XCI+e3sgY29tbWVudHM/Lmxlbmd0aCB9fSBDb21tZW50czwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1hcnJvdyBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLnJvdGF0ZWRdPVwiY29tbWVudHNBY2NvcmRpb25PcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBDb250ZW50IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWJvZHlcIiAqbmdJZj1cImNvbW1lbnRzQWNjb3JkaW9uT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBjb21tZW50c1wiIGNsYXNzPVwiY29tbWVudC10aHJlYWQgZC1mbGV4IG1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGF2YXRhciAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY29tbWVudC1hdmF0YXIgbWUtM1wiIFtzcmNdPVwiYy5hdmF0YXJcIiBhbHQ9XCJhdmF0YXJcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbnRlbnQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgYy5lbWFpbCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYy50aW1lIHwgZGF0ZTonaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gb3B0aW9uYWwgbWFpbiBsaW5lIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTIgbXQtMlwiICpuZ0lmPVwiYy5tYWluVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYy5tYWluVGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1hcmtlZCBhcyDigJzigKbigJ0gbGluZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCIgKm5nSWY9XCJjLnN0YXR1c0xhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZWQgYXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIid0ZXh0LScgKyBjLnN0YXR1c1R5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDigJx7eyBjLnN0YXR1c0xhYmVsIH194oCdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbm90ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJjLm5vdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMubm90ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGltYWdlIGNhcmRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaW1nIG9mIGMuaW1hZ2VzXCIgY2xhc3M9XCJ0YW5nby1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWltYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCIndXJsKCcgKyBpbWcudXJsICsgJyknXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1tZXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiPlRhbmdvIElEOiB7eyBpbWcudGFuZ29JZCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpbWcuc3RhdHVzID09PSAnYXBwcm92ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtYXBwcm92ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nLnN0YXR1cyA9PT0gJ3JlamVjdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtcmVqZWN0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIj5FbnRyeSB0aW1lOiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLmVudHJ5VGltZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gK04gbW9yZSBjYXJkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImMubW9yZUNvdW50ID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YW5nby1jYXJkIG1vcmUtY2FyZCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAre3sgYy5tb3JlQ291bnQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInNvdXJjZT8uaG91c2VLZWVwaW5nPy5sZW5ndGhcIiBjbGFzcz1cIm15LTcgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cIiFob3VzZUtlZXBpbmdBQ0NvdW50XCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbWUtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwb3B1cE9wZW4oJ3JlamVjdGVkJywnaG91c2VLZWVwaW5nJylcIj5SZWplY3Q8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCIhaG91c2VLZWVwaW5nQUNDb3VudFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1zLTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicG9wdXBPcGVuKCdhcHByb3ZlZCcsJ2hvdXNlS2VlcGluZycpXCI+QXBwcm92ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgXHJcbjwvc2VjdGlvbj5cclxuXHJcblxyXG48bmctdGVtcGxhdGUgI3pvb21Qb3B1cCBsZXQtbW9kZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwicC00IG0tNFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgYm9yZGVyLTAgcC0wIHctMTAwIGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEhlYWRpbmcgLS0+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIHt7IHBvcHVwVHlwZSA9PT0gJ2FwcHJvdmVkJyA/ICdBcHByb3ZlJyA6ICdSZWplY3QnIH19IFNlbGVjdGVkIEltYWdlc1xyXG4gICAgICAgICAgICA8L2g1PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0zIHRlc3QtYXBwdmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIFlvdSdyZSBhYm91dCB0byAge3sgcG9wdXBUeXBlID09PSAnYXBwcm92ZWQnID8gJ0FwcHJvdmUnIDogJ1JlamVjdCcgfX0ge3sgIHRoaXMub3ZlcmFsbFNlbGVjdGVkSWRzPy5sZW5ndGggfHwgJy0tJyB9fSB7eyBwb3B1cHZhbHVlIHwgdGl0bGVjYXNlIH19XHJcbiAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQ291bnQgQm94IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlJlbWFya3MgKE9wdGlvbmFsKTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByb3dzPVwiNFwiIFsobmdNb2RlbCldPVwicmVtYXJrc1wiPjwvdGV4dGFyZWE+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtZS0yXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInN1Ym1pdFZhbHVlKHBvcHVwVHlwZSwgcG9wdXB2YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBwb3B1cFR5cGUgPT09ICdhcHByb3ZlZCcgPyAnQXBwcm92ZScgOiAnUmVqZWN0JyB9fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|