tango-app-ui-store-builder 1.0.10 → 1.0.13
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/fixture-template/fixture-template.component.mjs +9 -23
- package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +47 -84
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +1 -1
- package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +5 -4
- package/esm2022/lib/components/manage-store-plano/manage-store-plano-feedback/manage-store-plano-feedback.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +40 -337
- package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +5 -3
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +9 -27
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +2 -3
- package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +73 -102
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +3 -3
- package/esm2022/lib/interfaces/fixture-template.interface.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +4 -4
- package/esm2022/lib/tango-store-builder.module.mjs +7 -11
- package/fesm2022/tango-app-ui-store-builder.mjs +1139 -2387
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/fixture-template/fixture-template.component.d.ts +0 -1
- package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +9 -9
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +5 -19
- package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +6 -7
- package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +9 -9
- package/lib/interfaces/fixture-template.interface.d.ts +2 -2
- package/lib/services/store-builder.service.d.ts +1 -1
- package/lib/tango-store-builder.module.d.ts +33 -35
- package/package.json +1 -1
- package/esm2022/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.mjs +0 -80
- package/esm2022/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.mjs +0 -375
- package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +0 -420
- package/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.d.ts +0 -21
- package/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.d.ts +0 -48
- package/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.d.ts +0 -74
|
@@ -1,420 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, } from "@angular/core";
|
|
2
|
-
import { Subject } from "rxjs";
|
|
3
|
-
import { ActionConfirmPopupComponent } from "./action-confirm-popup/action-confirm-popup.component";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
6
|
-
import * as i2 from "@angular/common";
|
|
7
|
-
import * as i3 from "@angular/forms";
|
|
8
|
-
import * as i4 from "./fixture/fixture.component";
|
|
9
|
-
export class VerificationFeedbackComponent {
|
|
10
|
-
ngbModal;
|
|
11
|
-
floorData;
|
|
12
|
-
totalFixtures = [];
|
|
13
|
-
feedbackDetails;
|
|
14
|
-
cdn;
|
|
15
|
-
showAction = true;
|
|
16
|
-
changeFixture = new EventEmitter();
|
|
17
|
-
action = new EventEmitter();
|
|
18
|
-
selectedFeedbackData;
|
|
19
|
-
isPageLoading = true;
|
|
20
|
-
currentFixtureIndex;
|
|
21
|
-
planoFixtureQuickDetails = [];
|
|
22
|
-
aiFixtureQuickDetails = [];
|
|
23
|
-
planoFixture;
|
|
24
|
-
aiFixture;
|
|
25
|
-
editingPlanoFixture = null;
|
|
26
|
-
editingAiFixture = null;
|
|
27
|
-
selectedAiVmImageForPreview = null;
|
|
28
|
-
isPlanoQuickEdit = false;
|
|
29
|
-
isAIQuickEdit = false;
|
|
30
|
-
highlightDifferences = true;
|
|
31
|
-
destroy$ = new Subject();
|
|
32
|
-
constructor(ngbModal) {
|
|
33
|
-
this.ngbModal = ngbModal;
|
|
34
|
-
}
|
|
35
|
-
ngOnInit() { }
|
|
36
|
-
ngOnChanges(changes) {
|
|
37
|
-
if (changes["feedbackDetails"]?.currentValue) {
|
|
38
|
-
this.currentFixtureIndex =
|
|
39
|
-
this.totalFixtures.findIndex((f) => f._id === this.feedbackDetails?.fixtureFeedback?.fixtureId) + 1;
|
|
40
|
-
this.planoFixture = structuredClone(this.feedbackDetails?.fixtureFeedback?.FixtureData);
|
|
41
|
-
this.aiFixture = structuredClone(this.feedbackDetails?.fixtureFeedback?.fixtureAIData);
|
|
42
|
-
this.planoFixtureQuickDetails = this.buildFixtureQuickDetails(this.feedbackDetails?.fixtureFeedback?.FixtureData);
|
|
43
|
-
this.aiFixtureQuickDetails = this.buildFixtureQuickDetails(this.feedbackDetails?.fixtureFeedback?.fixtureAIData);
|
|
44
|
-
if (!this.isApproved) {
|
|
45
|
-
this.compareQuickDetails();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
get isApproved() {
|
|
50
|
-
return this.feedbackDetails?.fixtureFeedback?.approvalStatus === "approved";
|
|
51
|
-
}
|
|
52
|
-
buildFixtureQuickDetails(fixture) {
|
|
53
|
-
if (!fixture)
|
|
54
|
-
return [];
|
|
55
|
-
const list = [];
|
|
56
|
-
const safe = (v) => v === null || v === undefined || v === "" ? "-" : v;
|
|
57
|
-
list.push({
|
|
58
|
-
key: "fixtureHeader",
|
|
59
|
-
label: "Fixture Header:",
|
|
60
|
-
value: safe(fixture?.header?.label),
|
|
61
|
-
editable: true,
|
|
62
|
-
meta: { type: "fixture" },
|
|
63
|
-
});
|
|
64
|
-
list.push({
|
|
65
|
-
key: "fixtureType",
|
|
66
|
-
label: "Fixture type:",
|
|
67
|
-
value: safe(fixture.fixtureCategory),
|
|
68
|
-
editable: false,
|
|
69
|
-
});
|
|
70
|
-
const fWidth = fixture.fixtureWidth || {};
|
|
71
|
-
list.push({
|
|
72
|
-
key: "fixtureWidth",
|
|
73
|
-
label: "Size (Width):",
|
|
74
|
-
value: fWidth?.value ? `${safe(fWidth.value)}${safe(fWidth.unit)}` : "-",
|
|
75
|
-
editable: false,
|
|
76
|
-
});
|
|
77
|
-
const shelves = Array.isArray(fixture.shelfConfig)
|
|
78
|
-
? fixture.shelfConfig
|
|
79
|
-
: [];
|
|
80
|
-
list.push({
|
|
81
|
-
key: "totalShelves",
|
|
82
|
-
label: "Total shelves:",
|
|
83
|
-
value: shelves.length ? String(shelves.length) : "-",
|
|
84
|
-
editable: false,
|
|
85
|
-
});
|
|
86
|
-
shelves
|
|
87
|
-
.sort((a, b) => a.shelfNumber - b.shelfNumber)
|
|
88
|
-
.forEach((s) => {
|
|
89
|
-
const shelfNum = Number(safe(s.shelfNumber));
|
|
90
|
-
const isShelf = s.shelfType === "shelf";
|
|
91
|
-
const key = `${isShelf ? "shelf" : "tray"}_${shelfNum}`;
|
|
92
|
-
const label = isShelf
|
|
93
|
-
? `Shelf ${shelfNum} capacity:`
|
|
94
|
-
: `Tray ${shelfNum} capacity:`;
|
|
95
|
-
let capacity = "-";
|
|
96
|
-
if (s.productPerShelf) {
|
|
97
|
-
if (isShelf) {
|
|
98
|
-
capacity = String(s.productPerShelf);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
const trayRows = s.trayRows || 0;
|
|
102
|
-
capacity = trayRows ? String(s.productPerShelf * trayRows) : "-";
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
list.push({
|
|
106
|
-
key,
|
|
107
|
-
label,
|
|
108
|
-
value: capacity,
|
|
109
|
-
editable: true,
|
|
110
|
-
meta: {
|
|
111
|
-
type: isShelf ? "shelf" : "tray",
|
|
112
|
-
shelfNumber: shelfNum,
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
const totalCapacity = shelves.reduce((acc, s) => {
|
|
117
|
-
if (!s.productPerShelf)
|
|
118
|
-
return acc;
|
|
119
|
-
if (s.shelfType === "shelf")
|
|
120
|
-
return acc + s.productPerShelf;
|
|
121
|
-
const rows = s.trayRows || 0;
|
|
122
|
-
return acc + (rows ? s.productPerShelf * rows : 0);
|
|
123
|
-
}, 0);
|
|
124
|
-
list.push({
|
|
125
|
-
key: "totalCapacity",
|
|
126
|
-
label: "Total capacity:",
|
|
127
|
-
value: totalCapacity ? String(totalCapacity) : "-",
|
|
128
|
-
editable: false,
|
|
129
|
-
});
|
|
130
|
-
const vm = Array.isArray(fixture.vmConfig) ? fixture.vmConfig : [];
|
|
131
|
-
vm.forEach((v, i) => {
|
|
132
|
-
list.push({
|
|
133
|
-
key: `vmType_${i}`,
|
|
134
|
-
label: `VM type ${i + 1}:`,
|
|
135
|
-
value: safe(v.vmType),
|
|
136
|
-
editable: false,
|
|
137
|
-
});
|
|
138
|
-
list.push({
|
|
139
|
-
key: `vmName_${i}`,
|
|
140
|
-
label: "VM Collection:",
|
|
141
|
-
value: safe(v.vmName),
|
|
142
|
-
editable: false,
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
return list;
|
|
146
|
-
}
|
|
147
|
-
compareQuickDetails() {
|
|
148
|
-
const plano = this.planoFixtureQuickDetails;
|
|
149
|
-
const ai = this.aiFixtureQuickDetails;
|
|
150
|
-
if (!plano?.length || !ai?.length)
|
|
151
|
-
return;
|
|
152
|
-
const planoMap = new Map(plano.map((i) => [i.key, i]));
|
|
153
|
-
const planoVMKeySet = new Set((this.feedbackDetails?.fixtureFeedback?.FixtureData?.vmConfig ?? []).map((v) => `${v.vmType}|${v.vmName}`.toLowerCase()));
|
|
154
|
-
const aiVMList = (this.feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig ?? []).map((v) => `${v.vmType}|${v.vmName}`.toLowerCase());
|
|
155
|
-
ai.forEach((item) => (item.isDifferent = false));
|
|
156
|
-
ai.forEach((aiItem) => {
|
|
157
|
-
const pItem = planoMap.get(aiItem.key);
|
|
158
|
-
if (!pItem) {
|
|
159
|
-
aiItem.isDifferent = true;
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
const pVal = (pItem.value ?? "-").toString().trim().toLowerCase();
|
|
163
|
-
const aVal = (aiItem.value ?? "-").toString().trim().toLowerCase();
|
|
164
|
-
if (aiItem.key.startsWith("vm")) {
|
|
165
|
-
const idx = Number(aiItem.key.split("_")[1]);
|
|
166
|
-
const aiVMKey = aiVMList[idx] ?? "";
|
|
167
|
-
if (!planoVMKeySet.has(aiVMKey)) {
|
|
168
|
-
aiItem.isDifferent = true;
|
|
169
|
-
}
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
const isShelfPlano = pItem.key.startsWith("shelf_");
|
|
173
|
-
const isShelfAI = aiItem.key.startsWith("shelf_");
|
|
174
|
-
const isTrayPlano = pItem.key.startsWith("tray_");
|
|
175
|
-
const isTrayAI = aiItem.key.startsWith("tray_");
|
|
176
|
-
if (isShelfPlano || isTrayPlano) {
|
|
177
|
-
if (isShelfPlano !== isShelfAI || isTrayPlano !== isTrayAI) {
|
|
178
|
-
aiItem.isDifferent = true;
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
if (pVal !== aVal) {
|
|
182
|
-
aiItem.isDifferent = true;
|
|
183
|
-
}
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
if (pVal !== aVal) {
|
|
187
|
-
aiItem.isDifferent = true;
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
onChangeFixture(change) {
|
|
192
|
-
this.changeFixture.emit({
|
|
193
|
-
currentFixture: this.feedbackDetails.fixtureFeedback.fixtureId,
|
|
194
|
-
action: change,
|
|
195
|
-
});
|
|
196
|
-
this.onCancelAIQuickEdit();
|
|
197
|
-
this.onCancelPlanoQuickEdit();
|
|
198
|
-
}
|
|
199
|
-
async onClickKeepPlano() {
|
|
200
|
-
try {
|
|
201
|
-
const result = await this.confirmAction("keepPlano");
|
|
202
|
-
if (result?.action === "notOk")
|
|
203
|
-
return false;
|
|
204
|
-
this.action.emit({
|
|
205
|
-
action: "keepPlano",
|
|
206
|
-
type: "agree",
|
|
207
|
-
fixtureData: this.planoFixture,
|
|
208
|
-
feedback: this.feedbackDetails?.fixtureFeedback,
|
|
209
|
-
remarks: result?.remark,
|
|
210
|
-
planoId: this.floorData.planoId,
|
|
211
|
-
floorId: this.floorData._id,
|
|
212
|
-
taskType: "fixture",
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
catch (error) {
|
|
216
|
-
console.log("@@ ~ onClickKeepPlano [ERR]:", error);
|
|
217
|
-
return false;
|
|
218
|
-
}
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
async onClickAcceptAI() {
|
|
222
|
-
try {
|
|
223
|
-
const result = await this.confirmAction("acceptAI");
|
|
224
|
-
if (result?.action === "notOk")
|
|
225
|
-
return false;
|
|
226
|
-
this.action.emit({
|
|
227
|
-
action: "acceptAi",
|
|
228
|
-
type: "agree",
|
|
229
|
-
fixtureData: this.aiFixture,
|
|
230
|
-
feedback: this.feedbackDetails?.fixtureFeedback,
|
|
231
|
-
remarks: result?.remark,
|
|
232
|
-
planoId: this.floorData.planoId,
|
|
233
|
-
floorId: this.floorData._id,
|
|
234
|
-
taskType: "fixture",
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
catch (error) {
|
|
238
|
-
console.log("@@ ~ onClickAcceptAI [ERR]:", error);
|
|
239
|
-
return false;
|
|
240
|
-
}
|
|
241
|
-
return true;
|
|
242
|
-
}
|
|
243
|
-
async onClickRedo() {
|
|
244
|
-
if (this.isAIQuickEdit || this.isPlanoQuickEdit)
|
|
245
|
-
return;
|
|
246
|
-
try {
|
|
247
|
-
const result = await this.confirmAction("redo");
|
|
248
|
-
if (result?.action === "notOk")
|
|
249
|
-
return;
|
|
250
|
-
this.action.emit({
|
|
251
|
-
action: "redo",
|
|
252
|
-
type: "disagree",
|
|
253
|
-
fixtureData: null,
|
|
254
|
-
feedback: this.feedbackDetails?.fixtureFeedback,
|
|
255
|
-
remark: result,
|
|
256
|
-
planoId: this.floorData.planoId,
|
|
257
|
-
floorId: this.floorData._id,
|
|
258
|
-
taskType: "fixture",
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
catch (error) {
|
|
262
|
-
console.log("@@ ~ onClickRedo [ERR]:", error);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
onEditCurrentFixture() {
|
|
266
|
-
this.action.emit({
|
|
267
|
-
action: "editWithPlano",
|
|
268
|
-
type: "agree",
|
|
269
|
-
fixtureData: this.planoFixture,
|
|
270
|
-
feedback: this.feedbackDetails?.fixtureFeedback,
|
|
271
|
-
planoId: this.floorData.planoId,
|
|
272
|
-
floorId: this.floorData._id,
|
|
273
|
-
taskType: "fixture",
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
onEditAIFeedback() {
|
|
277
|
-
this.action.emit({
|
|
278
|
-
action: "editWithAi",
|
|
279
|
-
type: "agree",
|
|
280
|
-
fixtureData: this.aiFixture,
|
|
281
|
-
feedback: this.feedbackDetails?.fixtureFeedback,
|
|
282
|
-
planoId: this.floorData.planoId,
|
|
283
|
-
floorId: this.floorData._id,
|
|
284
|
-
taskType: "fixture",
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
togglePlanoQuickEdit() {
|
|
288
|
-
if (this.isAIQuickEdit)
|
|
289
|
-
return;
|
|
290
|
-
if (!this.isPlanoQuickEdit) {
|
|
291
|
-
this.editingPlanoFixture = structuredClone(this.planoFixture);
|
|
292
|
-
}
|
|
293
|
-
this.isPlanoQuickEdit = !this.isPlanoQuickEdit;
|
|
294
|
-
}
|
|
295
|
-
toggleAIQuickEdit() {
|
|
296
|
-
if (this.isPlanoQuickEdit)
|
|
297
|
-
return;
|
|
298
|
-
if (!this.isAIQuickEdit) {
|
|
299
|
-
this.editingAiFixture = structuredClone(this.aiFixture);
|
|
300
|
-
}
|
|
301
|
-
console.log("@@ ~ this.editingAiFixture:", this.editingAiFixture);
|
|
302
|
-
this.isAIQuickEdit = !this.isAIQuickEdit;
|
|
303
|
-
}
|
|
304
|
-
onCancelPlanoQuickEdit() {
|
|
305
|
-
this.editingPlanoFixture = null;
|
|
306
|
-
this.planoFixtureQuickDetails = this.buildFixtureQuickDetails(this.planoFixture);
|
|
307
|
-
this.isPlanoQuickEdit = false;
|
|
308
|
-
}
|
|
309
|
-
async onSavePlanoQuickEdit() {
|
|
310
|
-
if (this.editingPlanoFixture) {
|
|
311
|
-
this.planoFixture = structuredClone(this.editingPlanoFixture);
|
|
312
|
-
}
|
|
313
|
-
this.editingPlanoFixture = null;
|
|
314
|
-
this.planoFixtureQuickDetails = this.buildFixtureQuickDetails(this.planoFixture);
|
|
315
|
-
this.compareQuickDetails();
|
|
316
|
-
const res = await this.onClickKeepPlano();
|
|
317
|
-
if (res)
|
|
318
|
-
this.isPlanoQuickEdit = false;
|
|
319
|
-
}
|
|
320
|
-
onCancelAIQuickEdit() {
|
|
321
|
-
this.editingAiFixture = null;
|
|
322
|
-
this.aiFixtureQuickDetails = this.buildFixtureQuickDetails(this.aiFixture);
|
|
323
|
-
this.isAIQuickEdit = false;
|
|
324
|
-
}
|
|
325
|
-
async onSaveAIQuickEdit() {
|
|
326
|
-
if (this.editingAiFixture) {
|
|
327
|
-
this.aiFixture = structuredClone(this.editingAiFixture);
|
|
328
|
-
}
|
|
329
|
-
this.editingAiFixture = null;
|
|
330
|
-
this.aiFixtureQuickDetails = this.buildFixtureQuickDetails(this.aiFixture);
|
|
331
|
-
this.compareQuickDetails();
|
|
332
|
-
const res = await this.onClickAcceptAI();
|
|
333
|
-
if (res)
|
|
334
|
-
this.isAIQuickEdit = false;
|
|
335
|
-
}
|
|
336
|
-
onCapacityInput(event, item, source) {
|
|
337
|
-
const input = event.target;
|
|
338
|
-
let v = input.value.replace(/[^0-9]/g, "").slice(0, 2);
|
|
339
|
-
input.value = v;
|
|
340
|
-
item.value = v || "0";
|
|
341
|
-
this.onQuickValueChange(item, item.value, source);
|
|
342
|
-
}
|
|
343
|
-
onQuickValueChange(item, newValue, source) {
|
|
344
|
-
const targetFixture = source === "plano" ? this.editingPlanoFixture : this.editingAiFixture;
|
|
345
|
-
if (!targetFixture || !item?.meta)
|
|
346
|
-
return;
|
|
347
|
-
const value = newValue?.trim();
|
|
348
|
-
item.value = value;
|
|
349
|
-
if (item.meta.type === "fixture" && item.key === "fixtureHeader") {
|
|
350
|
-
targetFixture.header.label = value || "";
|
|
351
|
-
return;
|
|
352
|
-
}
|
|
353
|
-
const shelfNumber = item.meta.shelfNumber;
|
|
354
|
-
if (!shelfNumber)
|
|
355
|
-
return;
|
|
356
|
-
const shelf = (targetFixture.shelfConfig ?? []).find((s) => Number(s.shelfNumber) === shelfNumber);
|
|
357
|
-
if (!shelf)
|
|
358
|
-
return;
|
|
359
|
-
const numericValue = Number(value);
|
|
360
|
-
if (isNaN(numericValue) || numericValue < 0)
|
|
361
|
-
return;
|
|
362
|
-
// Shelf → direct mapping
|
|
363
|
-
if (item.meta.type === "shelf") {
|
|
364
|
-
shelf.productPerShelf = numericValue;
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
// Tray → reverse calculate
|
|
368
|
-
if (item.meta.type === "tray") {
|
|
369
|
-
const rows = Number(shelf.trayRows) || 0;
|
|
370
|
-
if (!rows)
|
|
371
|
-
return;
|
|
372
|
-
shelf.productPerShelf = Math.floor(numericValue / rows);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
async confirmAction(type) {
|
|
376
|
-
try {
|
|
377
|
-
const modelRef = this.ngbModal.open(ActionConfirmPopupComponent, {
|
|
378
|
-
centered: true,
|
|
379
|
-
size: "md",
|
|
380
|
-
backdrop: "static",
|
|
381
|
-
});
|
|
382
|
-
modelRef.componentInstance.type = type;
|
|
383
|
-
return await modelRef.result.then((result) => result);
|
|
384
|
-
}
|
|
385
|
-
catch (error) {
|
|
386
|
-
return null;
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
onClickVMImagePreview(imgUrl) {
|
|
390
|
-
this.selectedAiVmImageForPreview = imgUrl;
|
|
391
|
-
}
|
|
392
|
-
closeVMImagePreview() {
|
|
393
|
-
this.selectedAiVmImageForPreview = null;
|
|
394
|
-
}
|
|
395
|
-
ngOnDestroy() {
|
|
396
|
-
this.destroy$.next();
|
|
397
|
-
this.destroy$.complete();
|
|
398
|
-
}
|
|
399
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VerificationFeedbackComponent, deps: [{ token: i1.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
400
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: VerificationFeedbackComponent, selector: "lib-verification-feedback", inputs: { floorData: "floorData", totalFixtures: "totalFixtures", feedbackDetails: "feedbackDetails", cdn: "cdn", showAction: "showAction" }, outputs: { changeFixture: "changeFixture", action: "action" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"verification-feedback\">\r\n\r\n <div *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"feedbackDetails?.taskInfoToggle\">\r\n <div ngbAccordionHeader class=\"accordion-button task-info-header\">\r\n <div ngbAccordionToggle class=\"w-100\">\r\n <h2>Fixture verification assigned</h2>\r\n <p>{{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{feedbackDetails?.fixtureFeedback?.taskData?.createdByName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mma, dd MMM yyyy'}}\r\n </p>\r\n <h5>Assigner</h5>\r\n </div>\r\n </div>\r\n\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4> {{feedbackDetails?.fixtureFeedback?.taskData?.userName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.submitTime_string}}\r\n </p>\r\n <h5>Assignee</h5>\r\n </div>\r\n </div>\r\n\r\n\r\n @if (feedbackDetails?.globalComments?.length) {\r\n <h5 class=\"mb-2\">Comments</h5>\r\n <div class=\"log-block\" *ngFor=\"let c of feedbackDetails?.globalComments;let i= index\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n <h5>{{c?.comment}}</h5>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\">\r\n\r\n <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{planoFixture?.header?.label}}</h3>\r\n\r\n <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n {{currentFixtureIndex}}/{{totalFixtures.length}}\r\n </h3>\r\n\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n\r\n @if( this.aiFixture?.fixtureId){\r\n\r\n <div id=\"fixture-quick-details\" class=\"row g-0 \">\r\n <div class=\"col-6 p-2\">\r\n <div class=\"quick-edit-container\">\r\n\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button class=\"btn btn-outline quick-btn ms-auto\" type=\"button\"\r\n (click)=\"onEditCurrentFixture()\" [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onClickKeepPlano()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n Keep plano\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <h4>Planogram: </h4>\r\n\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'keepPlano' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithPlano' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }@else{\r\n <svg *ngIf=\"showAction && !isPlanoQuickEdit\" class=\"ms-auto cursor-pointer\"\r\n (click)=\"togglePlanoQuickEdit()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n [class.disabled]=\"isAIQuickEdit\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div *ngIf=\"showAction && isPlanoQuickEdit && !isAIQuickEdit\"\r\n class=\"d-flex gap-2 align-items-center ms-auto\">\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\"\r\n (click)=\"onCancelPlanoQuickEdit()\">\r\n Cancel\r\n </button>\r\n <button class=\"btn btn-primary quick-btn\" type=\"button\"\r\n (click)=\"onSavePlanoQuickEdit()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"quick-details\">\r\n <div *ngFor=\"let item of planoFixtureQuickDetails\" class=\"row g-0 mb-4\">\r\n\r\n <p class=\"col-6 label\">{{ item.label }}</p>\r\n\r\n <!-- Inline editing -->\r\n <ng-container *ngIf=\"isPlanoQuickEdit && item.editable; else planoValue\">\r\n <!-- FIXTURE NAME (text) -->\r\n <ng-container *ngIf=\"item.meta?.type === 'fixture'; else capacityInput\">\r\n <input class=\"col-6 value edit-input form-control\" [ngModel]=\"item.value\"\r\n (ngModelChange)=\"onQuickValueChange(item, $event, 'plano')\" type=\"text\"\r\n maxlength=\"150\" />\r\n </ng-container>\r\n\r\n <!-- CAPACITY (number) -->\r\n <ng-template #capacityInput>\r\n <input class=\"col-6 value edit-input form-control\" [value]=\"item.value\" type=\"text\"\r\n inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\"\r\n (input)=\"onCapacityInput($event, item, 'plano')\" />\r\n\r\n </ng-template>\r\n\r\n\r\n </ng-container>\r\n\r\n <!-- Normal text -->\r\n <ng-template #planoValue>\r\n <p class=\"col-6 value\">{{ item.value | titlecase}}</p>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n <div class=\"col-6 p-2\">\r\n <div class=\"quick-edit-container\">\r\n\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <span class=\"redo-btn\" (click)=\"onClickRedo()\"\r\n [class.disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">Redo</span>\r\n\r\n <button class=\"btn btn-outline quick-btn ms-auto\" type=\"button\" (click)=\"onEditAIFeedback()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onClickAcceptAI()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_5774)\">\r\n <path\r\n d=\"M4.16602 1.6665L4.32435 2.44984C4.43782 3.01234 4.69457 3.53603 5.06977 3.97021C5.44497 4.40439 5.9259 4.73435 6.46602 4.92817L6.66602 4.99984L6.46602 5.0715C5.9259 5.26532 5.44497 5.59529 5.06977 6.02947C4.69457 6.46365 4.43782 6.98733 4.32435 7.54984L4.16602 8.33317L4.00768 7.54984C3.89422 6.98733 3.63746 6.46365 3.26226 6.02947C2.88706 5.59529 2.40613 5.26532 1.86602 5.0715L1.66602 4.99984L1.86602 4.92817C2.40613 4.73435 2.88706 4.40439 3.26226 3.97021C3.63746 3.53603 3.89422 3.01234 4.00768 2.44984L4.16602 1.6665ZM6.66602 13.3332L6.85768 14.3965C6.90745 14.6739 7.02674 14.9341 7.20439 15.1528C7.38204 15.3716 7.61226 15.5417 7.87352 15.6473L8.33268 15.8332L7.87352 16.019C7.61221 16.1244 7.38189 16.2944 7.20409 16.513C7.0263 16.7316 6.90683 16.9917 6.85685 17.269L6.66602 18.3332L6.47435 17.2698C6.42458 16.9925 6.30529 16.7322 6.12764 16.5135C5.94999 16.2947 5.71978 16.1246 5.45852 16.019L4.99935 15.8332L5.45852 15.6473C5.71983 15.5419 5.95014 15.372 6.12794 15.1534C6.30573 14.9348 6.4252 14.6746 6.47518 14.3973L6.66602 13.3332ZM13.3327 2.49984L13.796 4.7115C14.0322 5.83907 14.5565 6.88621 15.3178 7.75081C16.0791 8.61541 17.0515 9.26796 18.1402 9.64484L19.166 9.99984L18.1402 10.3548C17.0515 10.7317 16.0791 11.3843 15.3178 12.2489C14.5565 13.1135 14.0322 14.1606 13.796 15.2882L13.3327 17.4998L12.8693 15.2882C12.6332 14.1606 12.1089 13.1135 11.3476 12.2489C10.5862 11.3843 9.61382 10.7317 8.52518 10.3548L7.49935 9.99984L8.52518 9.64484C9.61382 9.26796 10.5862 8.61541 11.3476 7.75081C12.1089 6.88621 12.6332 5.83907 12.8693 4.7115L13.3327 2.49984Z\"\r\n stroke=\"black\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_5774\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n\r\n Accept AI\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_5774)\">\r\n <path\r\n d=\"M4.16602 1.6665L4.32435 2.44984C4.43782 3.01234 4.69457 3.53603 5.06977 3.97021C5.44497 4.40439 5.9259 4.73435 6.46602 4.92817L6.66602 4.99984L6.46602 5.0715C5.9259 5.26532 5.44497 5.59529 5.06977 6.02947C4.69457 6.46365 4.43782 6.98733 4.32435 7.54984L4.16602 8.33317L4.00768 7.54984C3.89422 6.98733 3.63746 6.46365 3.26226 6.02947C2.88706 5.59529 2.40613 5.26532 1.86602 5.0715L1.66602 4.99984L1.86602 4.92817C2.40613 4.73435 2.88706 4.40439 3.26226 3.97021C3.63746 3.53603 3.89422 3.01234 4.00768 2.44984L4.16602 1.6665ZM6.66602 13.3332L6.85768 14.3965C6.90745 14.6739 7.02674 14.9341 7.20439 15.1528C7.38204 15.3716 7.61226 15.5417 7.87352 15.6473L8.33268 15.8332L7.87352 16.019C7.61221 16.1244 7.38189 16.2944 7.20409 16.513C7.0263 16.7316 6.90683 16.9917 6.85685 17.269L6.66602 18.3332L6.47435 17.2698C6.42458 16.9925 6.30529 16.7322 6.12764 16.5135C5.94999 16.2947 5.71978 16.1246 5.45852 16.019L4.99935 15.8332L5.45852 15.6473C5.71983 15.5419 5.95014 15.372 6.12794 15.1534C6.30573 14.9348 6.4252 14.6746 6.47518 14.3973L6.66602 13.3332ZM13.3327 2.49984L13.796 4.7115C14.0322 5.83907 14.5565 6.88621 15.3178 7.75081C16.0791 8.61541 17.0515 9.26796 18.1402 9.64484L19.166 9.99984L18.1402 10.3548C17.0515 10.7317 16.0791 11.3843 15.3178 12.2489C14.5565 13.1135 14.0322 14.1606 13.796 15.2882L13.3327 17.4998L12.8693 15.2882C12.6332 14.1606 12.1089 13.1135 11.3476 12.2489C10.5862 11.3843 9.61382 10.7317 8.52518 10.3548L7.49935 9.99984L8.52518 9.64484C9.61382 9.26796 10.5862 8.61541 11.3476 7.75081C12.1089 6.88621 12.6332 5.83907 12.8693 4.7115L13.3327 2.49984Z\"\r\n stroke=\"black\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_5774\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <h4>AI Output: </h4>\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'acceptAi' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithAi'\"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }@else {\r\n <svg *ngIf=\"showAction && !isAIQuickEdit\" [class.disabled]=\"isPlanoQuickEdit\"\r\n class=\"ms-auto cursor-pointer\" (click)=\"toggleAIQuickEdit()\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div *ngIf=\"showAction && isAIQuickEdit && !isPlanoQuickEdit\"\r\n class=\"d-flex gap-2 align-items-center ms-auto\">\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onCancelAIQuickEdit()\">\r\n Cancel\r\n </button>\r\n <button class=\"btn btn-primary quick-btn\" type=\"button\" (click)=\"onSaveAIQuickEdit()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"quick-details\">\r\n <div *ngFor=\"let item of aiFixtureQuickDetails\" class=\"row g-0 mb-4\"\r\n [class.diff]=\"highlightDifferences && item.isDifferent\">\r\n\r\n <p class=\"col-6 label\">{{ item.label }}</p>\r\n\r\n <!-- Inline editing -->\r\n <ng-container *ngIf=\"isAIQuickEdit && item.editable; else aiValue\">\r\n <!-- FIXTURE NAME (text) -->\r\n <ng-container *ngIf=\"item.meta?.type === 'fixture'; else capacityInput\">\r\n <input class=\"col-6 value edit-input form-control\" [ngModel]=\"item.value\"\r\n (ngModelChange)=\"onQuickValueChange(item, $event, 'ai')\" type=\"text\"\r\n maxlength=\"150\" />\r\n </ng-container>\r\n\r\n <!-- CAPACITY (number) -->\r\n <ng-template #capacityInput>\r\n <input class=\"col-6 value edit-input form-control\" [value]=\"item.value\" type=\"text\"\r\n inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\"\r\n (input)=\"onCapacityInput($event, item, 'ai')\" />\r\n\r\n </ng-template>\r\n\r\n\r\n </ng-container>\r\n\r\n <!-- Normal text -->\r\n <ng-template #aiValue>\r\n <p class=\"col-6 value\">{{ item.value |titlecase}}</p>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n <div class=\"col-6 p-2\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"mb-1\">Planogram design</h5>\r\n <p>Template designed by the planogram team</p>\r\n </div>\r\n <lib-fixture [fixture]=\"planoFixture\"></lib-fixture>\r\n </div>\r\n\r\n <div class=\"col-6 p-2\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"mb-1\">Store response</h5>\r\n <p>Planogram response by the store team</p>\r\n </div>\r\n @if(cdn && aiFixture?.fixtureImage){\r\n <div class=\"fixture-image\">\r\n <img [src]=\"cdn + aiFixture?.fixtureImage\" alt=\"Store response image\">\r\n </div>\r\n }@else {\r\n <div class=\"text-center my-7\">\r\n <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n fill=\"#EAECF0\" />\r\n <path\r\n d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n fill=\"#6BCAFF\" />\r\n <path\r\n d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n fill=\"#00A3FF\" />\r\n <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <hr>\r\n\r\n <div id=\"vm-comparison\" *ngIf=\"feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig.length\">\r\n <h5 class=\"mb-1\">Visual Merchandise Images from AI output:</h5>\r\n\r\n <div class=\"row g-0\">\r\n\r\n @for (vm of feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig; track $index) {\r\n <div class=\"col-6 p-2\">\r\n <div class=\"vm-container\" (click)=\"onClickVMImagePreview(cdn+vm?.vmImage)\">\r\n <div class=\"vm-img\">\r\n <img [src]=\"cdn+vm?.vmImage\" alt=\"VM Image\">\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 vm-details \">\r\n <h5>{{vm?.vmType}}</h5>\r\n <h5>{{vm?.vmName}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"img-preview\" *ngIf=\"selectedAiVmImageForPreview\" (click)=\"closeVMImagePreview()\">\r\n <img [src]=\"selectedAiVmImageForPreview\" class=\"full-img\" />\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"my-6\">\r\n <div class=\"text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" 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\" stroke-width=\"13.3333\" />\r\n <path\r\n d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"mt-3 text-center\">\r\n <div class=\"fw-bold h3 mt-2\">No response</div>\r\n <div class=\"mt-4\">No AI response found for this fixture.</div>\r\n </div>\r\n </div>\r\n <!-- <hr class=\"mb-6\"> -->\r\n }\r\n\r\n\r\n @if (feedbackDetails?.fixtureFeedback?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of feedbackDetails?.fixtureFeedback?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }@else if(c?.responsetype === 'agree'){\r\n\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n Marked as \"Keep Plano\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithPlano'\">\r\n Marked as \"Keep Plano with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'acceptAi'\">\r\n Marked as \"Accept AI\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithAi'\">\r\n Marked as \"Accept AI with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }@else if(c?.responsetype === 'disagree'){\r\n <h5>\r\n Marked as \"Redo\"\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</section>", styles: ["#verification-feedback{height:100%;overflow-y:auto}#verification-feedback .fixture-navigate,#verification-feedback .task-info-header{user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#verification-feedback h5{color:#1d2939;font-family:Inter;font-weight:600;font-size:12px;line-height:18px;margin:0}#verification-feedback .log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}#verification-feedback .log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback .log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}#verification-feedback #task-info .task-info-header{background-color:#fff!important;padding:6px;width:100%}#verification-feedback #task-info .task-info-header h2{font-weight:600;font-size:14px;line-height:20px;color:#1d2939}#verification-feedback #task-info .task-info-header p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085}#verification-feedback #fixture-quick-details .quick-edit-container{background:#f9fafb;padding:12px;border-radius:6px;width:100%;height:100%}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-quick-details .quick-edit-container .redo-btn{font-family:Inter;font-weight:600;font-size:14px;line-height:18px;color:#1d2939;cursor:pointer}#verification-feedback #fixture-quick-details .quick-edit-container h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .label{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;color:#475467;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .value{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .diff .value{color:#d92d20!important;font-weight:600}#verification-feedback #fixture-quick-details .quick-edit-container .edit-input{padding:0 4px;border-radius:4px;width:50%;height:20px}#verification-feedback #fixture-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison p{font-weight:400;font-size:12px;line-height:18px;color:#475467;margin:0}#verification-feedback #fixture-comparison .fixture-image{margin-bottom:12px}#verification-feedback #fixture-comparison .fixture-image img{object-fit:contain;width:100%}#verification-feedback #vm-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #vm-comparison .vm-container{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);margin-bottom:12px;display:flex;gap:12px;cursor:pointer}#verification-feedback #vm-comparison .vm-container .vm-img{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}#verification-feedback #vm-comparison .vm-container .vm-img img{border-radius:2px;min-width:132px;min-height:134px;object-fit:contain;width:100%;height:100%;display:block}#verification-feedback #vm-comparison .vm-container .vm-details,#verification-feedback #vm-comparison .vm-container .vm-details h5{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#verification-feedback #vm-comparison .img-preview{position:fixed;inset:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:9999;cursor:zoom-out}#verification-feedback #vm-comparison .full-img{max-width:90vw;max-height:90vh;border-radius:10px;object-fit:contain}#verification-feedback .disabled{pointer-events:none;cursor:not-allowed!important;opacity:.6}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i1.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i1.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i1.NgbAccordionToggle, selector: "[ngbAccordionToggle]" }, { kind: "directive", type: i1.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i1.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: i4.FixtureComponent, selector: "lib-fixture", inputs: ["fixture"] }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
401
|
-
}
|
|
402
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VerificationFeedbackComponent, decorators: [{
|
|
403
|
-
type: Component,
|
|
404
|
-
args: [{ selector: "lib-verification-feedback", template: "<section id=\"verification-feedback\">\r\n\r\n <div *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"feedbackDetails?.taskInfoToggle\">\r\n <div ngbAccordionHeader class=\"accordion-button task-info-header\">\r\n <div ngbAccordionToggle class=\"w-100\">\r\n <h2>Fixture verification assigned</h2>\r\n <p>{{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n </div>\r\n\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4>{{feedbackDetails?.fixtureFeedback?.taskData?.createdByName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mma, dd MMM yyyy'}}\r\n </p>\r\n <h5>Assigner</h5>\r\n </div>\r\n </div>\r\n\r\n <div class=\"log-block\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <h4> {{feedbackDetails?.fixtureFeedback?.taskData?.userName}}</h4>\r\n <p>\r\n {{feedbackDetails?.fixtureFeedback?.taskData?.submitTime_string}}\r\n </p>\r\n <h5>Assignee</h5>\r\n </div>\r\n </div>\r\n\r\n\r\n @if (feedbackDetails?.globalComments?.length) {\r\n <h5 class=\"mb-2\">Comments</h5>\r\n <div class=\"log-block\" *ngFor=\"let c of feedbackDetails?.globalComments;let i= index\">\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n <h5>{{c?.comment}}</h5>\r\n </div>\r\n </div>\r\n }\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\">\r\n\r\n <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{planoFixture?.header?.label}}</h3>\r\n\r\n <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n {{currentFixtureIndex}}/{{totalFixtures.length}}\r\n </h3>\r\n\r\n <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n </div>\r\n\r\n @if( this.aiFixture?.fixtureId){\r\n\r\n <div id=\"fixture-quick-details\" class=\"row g-0 \">\r\n <div class=\"col-6 p-2\">\r\n <div class=\"quick-edit-container\">\r\n\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button class=\"btn btn-outline quick-btn ms-auto\" type=\"button\"\r\n (click)=\"onEditCurrentFixture()\" [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onClickKeepPlano()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n Keep plano\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <h4>Planogram: </h4>\r\n\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'keepPlano' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithPlano' \"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }@else{\r\n <svg *ngIf=\"showAction && !isPlanoQuickEdit\" class=\"ms-auto cursor-pointer\"\r\n (click)=\"togglePlanoQuickEdit()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n [class.disabled]=\"isAIQuickEdit\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div *ngIf=\"showAction && isPlanoQuickEdit && !isAIQuickEdit\"\r\n class=\"d-flex gap-2 align-items-center ms-auto\">\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\"\r\n (click)=\"onCancelPlanoQuickEdit()\">\r\n Cancel\r\n </button>\r\n <button class=\"btn btn-primary quick-btn\" type=\"button\"\r\n (click)=\"onSavePlanoQuickEdit()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"quick-details\">\r\n <div *ngFor=\"let item of planoFixtureQuickDetails\" class=\"row g-0 mb-4\">\r\n\r\n <p class=\"col-6 label\">{{ item.label }}</p>\r\n\r\n <!-- Inline editing -->\r\n <ng-container *ngIf=\"isPlanoQuickEdit && item.editable; else planoValue\">\r\n <!-- FIXTURE NAME (text) -->\r\n <ng-container *ngIf=\"item.meta?.type === 'fixture'; else capacityInput\">\r\n <input class=\"col-6 value edit-input form-control\" [ngModel]=\"item.value\"\r\n (ngModelChange)=\"onQuickValueChange(item, $event, 'plano')\" type=\"text\"\r\n maxlength=\"150\" />\r\n </ng-container>\r\n\r\n <!-- CAPACITY (number) -->\r\n <ng-template #capacityInput>\r\n <input class=\"col-6 value edit-input form-control\" [value]=\"item.value\" type=\"text\"\r\n inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\"\r\n (input)=\"onCapacityInput($event, item, 'plano')\" />\r\n\r\n </ng-template>\r\n\r\n\r\n </ng-container>\r\n\r\n <!-- Normal text -->\r\n <ng-template #planoValue>\r\n <p class=\"col-6 value\">{{ item.value | titlecase}}</p>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n <div class=\"col-6 p-2\">\r\n <div class=\"quick-edit-container\">\r\n\r\n @if (!isApproved && showAction) {\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <span class=\"redo-btn\" (click)=\"onClickRedo()\"\r\n [class.disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">Redo</span>\r\n\r\n <button class=\"btn btn-outline quick-btn ms-auto\" type=\"button\" (click)=\"onEditAIFeedback()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_12536)\">\r\n <path\r\n d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_12536\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </button>\r\n\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onClickAcceptAI()\"\r\n [disabled]=\"isAIQuickEdit || isPlanoQuickEdit\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_5774)\">\r\n <path\r\n d=\"M4.16602 1.6665L4.32435 2.44984C4.43782 3.01234 4.69457 3.53603 5.06977 3.97021C5.44497 4.40439 5.9259 4.73435 6.46602 4.92817L6.66602 4.99984L6.46602 5.0715C5.9259 5.26532 5.44497 5.59529 5.06977 6.02947C4.69457 6.46365 4.43782 6.98733 4.32435 7.54984L4.16602 8.33317L4.00768 7.54984C3.89422 6.98733 3.63746 6.46365 3.26226 6.02947C2.88706 5.59529 2.40613 5.26532 1.86602 5.0715L1.66602 4.99984L1.86602 4.92817C2.40613 4.73435 2.88706 4.40439 3.26226 3.97021C3.63746 3.53603 3.89422 3.01234 4.00768 2.44984L4.16602 1.6665ZM6.66602 13.3332L6.85768 14.3965C6.90745 14.6739 7.02674 14.9341 7.20439 15.1528C7.38204 15.3716 7.61226 15.5417 7.87352 15.6473L8.33268 15.8332L7.87352 16.019C7.61221 16.1244 7.38189 16.2944 7.20409 16.513C7.0263 16.7316 6.90683 16.9917 6.85685 17.269L6.66602 18.3332L6.47435 17.2698C6.42458 16.9925 6.30529 16.7322 6.12764 16.5135C5.94999 16.2947 5.71978 16.1246 5.45852 16.019L4.99935 15.8332L5.45852 15.6473C5.71983 15.5419 5.95014 15.372 6.12794 15.1534C6.30573 14.9348 6.4252 14.6746 6.47518 14.3973L6.66602 13.3332ZM13.3327 2.49984L13.796 4.7115C14.0322 5.83907 14.5565 6.88621 15.3178 7.75081C16.0791 8.61541 17.0515 9.26796 18.1402 9.64484L19.166 9.99984L18.1402 10.3548C17.0515 10.7317 16.0791 11.3843 15.3178 12.2489C14.5565 13.1135 14.0322 14.1606 13.796 15.2882L13.3327 17.4998L12.8693 15.2882C12.6332 14.1606 12.1089 13.1135 11.3476 12.2489C10.5862 11.3843 9.61382 10.7317 8.52518 10.3548L7.49935 9.99984L8.52518 9.64484C9.61382 9.26796 10.5862 8.61541 11.3476 7.75081C12.1089 6.88621 12.6332 5.83907 12.8693 4.7115L13.3327 2.49984Z\"\r\n stroke=\"black\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_5774\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n\r\n Accept AI\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"d-flex align-items-center gap-2 my-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_228_5774)\">\r\n <path\r\n d=\"M4.16602 1.6665L4.32435 2.44984C4.43782 3.01234 4.69457 3.53603 5.06977 3.97021C5.44497 4.40439 5.9259 4.73435 6.46602 4.92817L6.66602 4.99984L6.46602 5.0715C5.9259 5.26532 5.44497 5.59529 5.06977 6.02947C4.69457 6.46365 4.43782 6.98733 4.32435 7.54984L4.16602 8.33317L4.00768 7.54984C3.89422 6.98733 3.63746 6.46365 3.26226 6.02947C2.88706 5.59529 2.40613 5.26532 1.86602 5.0715L1.66602 4.99984L1.86602 4.92817C2.40613 4.73435 2.88706 4.40439 3.26226 3.97021C3.63746 3.53603 3.89422 3.01234 4.00768 2.44984L4.16602 1.6665ZM6.66602 13.3332L6.85768 14.3965C6.90745 14.6739 7.02674 14.9341 7.20439 15.1528C7.38204 15.3716 7.61226 15.5417 7.87352 15.6473L8.33268 15.8332L7.87352 16.019C7.61221 16.1244 7.38189 16.2944 7.20409 16.513C7.0263 16.7316 6.90683 16.9917 6.85685 17.269L6.66602 18.3332L6.47435 17.2698C6.42458 16.9925 6.30529 16.7322 6.12764 16.5135C5.94999 16.2947 5.71978 16.1246 5.45852 16.019L4.99935 15.8332L5.45852 15.6473C5.71983 15.5419 5.95014 15.372 6.12794 15.1534C6.30573 14.9348 6.4252 14.6746 6.47518 14.3973L6.66602 13.3332ZM13.3327 2.49984L13.796 4.7115C14.0322 5.83907 14.5565 6.88621 15.3178 7.75081C16.0791 8.61541 17.0515 9.26796 18.1402 9.64484L19.166 9.99984L18.1402 10.3548C17.0515 10.7317 16.0791 11.3843 15.3178 12.2489C14.5565 13.1135 14.0322 14.1606 13.796 15.2882L13.3327 17.4998L12.8693 15.2882C12.6332 14.1606 12.1089 13.1135 11.3476 12.2489C10.5862 11.3843 9.61382 10.7317 8.52518 10.3548L7.49935 9.99984L8.52518 9.64484C9.61382 9.26796 10.5862 8.61541 11.3476 7.75081C12.1089 6.88621 12.6332 5.83907 12.8693 4.7115L13.3327 2.49984Z\"\r\n stroke=\"black\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_228_5774\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <h4>AI Output: </h4>\r\n @if (isApproved) {\r\n <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'acceptAi' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithAi'\"\r\n class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n }@else {\r\n <svg *ngIf=\"showAction && !isAIQuickEdit\" [class.disabled]=\"isPlanoQuickEdit\"\r\n class=\"ms-auto cursor-pointer\" (click)=\"toggleAIQuickEdit()\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div *ngIf=\"showAction && isAIQuickEdit && !isPlanoQuickEdit\"\r\n class=\"d-flex gap-2 align-items-center ms-auto\">\r\n <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onCancelAIQuickEdit()\">\r\n Cancel\r\n </button>\r\n <button class=\"btn btn-primary quick-btn\" type=\"button\" (click)=\"onSaveAIQuickEdit()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"quick-details\">\r\n <div *ngFor=\"let item of aiFixtureQuickDetails\" class=\"row g-0 mb-4\"\r\n [class.diff]=\"highlightDifferences && item.isDifferent\">\r\n\r\n <p class=\"col-6 label\">{{ item.label }}</p>\r\n\r\n <!-- Inline editing -->\r\n <ng-container *ngIf=\"isAIQuickEdit && item.editable; else aiValue\">\r\n <!-- FIXTURE NAME (text) -->\r\n <ng-container *ngIf=\"item.meta?.type === 'fixture'; else capacityInput\">\r\n <input class=\"col-6 value edit-input form-control\" [ngModel]=\"item.value\"\r\n (ngModelChange)=\"onQuickValueChange(item, $event, 'ai')\" type=\"text\"\r\n maxlength=\"150\" />\r\n </ng-container>\r\n\r\n <!-- CAPACITY (number) -->\r\n <ng-template #capacityInput>\r\n <input class=\"col-6 value edit-input form-control\" [value]=\"item.value\" type=\"text\"\r\n inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\"\r\n (input)=\"onCapacityInput($event, item, 'ai')\" />\r\n\r\n </ng-template>\r\n\r\n\r\n </ng-container>\r\n\r\n <!-- Normal text -->\r\n <ng-template #aiValue>\r\n <p class=\"col-6 value\">{{ item.value |titlecase}}</p>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n <div class=\"col-6 p-2\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"mb-1\">Planogram design</h5>\r\n <p>Template designed by the planogram team</p>\r\n </div>\r\n <lib-fixture [fixture]=\"planoFixture\"></lib-fixture>\r\n </div>\r\n\r\n <div class=\"col-6 p-2\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"mb-1\">Store response</h5>\r\n <p>Planogram response by the store team</p>\r\n </div>\r\n @if(cdn && aiFixture?.fixtureImage){\r\n <div class=\"fixture-image\">\r\n <img [src]=\"cdn + aiFixture?.fixtureImage\" alt=\"Store response image\">\r\n </div>\r\n }@else {\r\n <div class=\"text-center my-7\">\r\n <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n fill=\"#EAECF0\" />\r\n <path\r\n d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n fill=\"#6BCAFF\" />\r\n <path\r\n d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n fill=\"#00A3FF\" />\r\n <path\r\n d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n fill=\"#00A3FF\" />\r\n <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n </svg>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <hr>\r\n\r\n <div id=\"vm-comparison\" *ngIf=\"feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig.length\">\r\n <h5 class=\"mb-1\">Visual Merchandise Images from AI output:</h5>\r\n\r\n <div class=\"row g-0\">\r\n\r\n @for (vm of feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig; track $index) {\r\n <div class=\"col-6 p-2\">\r\n <div class=\"vm-container\" (click)=\"onClickVMImagePreview(cdn+vm?.vmImage)\">\r\n <div class=\"vm-img\">\r\n <img [src]=\"cdn+vm?.vmImage\" alt=\"VM Image\">\r\n </div>\r\n <div class=\"d-flex flex-column gap-2 vm-details \">\r\n <h5>{{vm?.vmType}}</h5>\r\n <h5>{{vm?.vmName}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"img-preview\" *ngIf=\"selectedAiVmImageForPreview\" (click)=\"closeVMImagePreview()\">\r\n <img [src]=\"selectedAiVmImageForPreview\" class=\"full-img\" />\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"my-6\">\r\n <div class=\"text-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" 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\" stroke-width=\"13.3333\" />\r\n <path\r\n d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"mt-3 text-center\">\r\n <div class=\"fw-bold h3 mt-2\">No response</div>\r\n <div class=\"mt-4\">No AI response found for this fixture.</div>\r\n </div>\r\n </div>\r\n <!-- <hr class=\"mb-6\"> -->\r\n }\r\n\r\n\r\n @if (feedbackDetails?.fixtureFeedback?.answers?.[0]?.comments.length) {\r\n <div id=\"fixture-comments\">\r\n <h5 class=\"mb-2\">Comments</h5>\r\n\r\n <div class=\"log-block\"\r\n *ngFor=\"let c of feedbackDetails?.fixtureFeedback?.answers[0]?.comments;let i= index\">\r\n <!-- User avatar -->\r\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <div class=\"d-flex gap-1 flex-column\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <h4>{{c?.userName}}</h4>\r\n <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n </div>\r\n\r\n @if(c?.responsetype === 'comment'){\r\n <h5>{{c?.comment}}</h5>\r\n }@else if(c?.responsetype === 'agree'){\r\n\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n Marked as \"Keep Plano\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithPlano'\">\r\n Marked as \"Keep Plano with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'acceptAi'\">\r\n Marked as \"Accept AI\".\r\n </h5>\r\n <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithAi'\">\r\n Marked as \"Accept AI with Modification\".\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }@else if(c?.responsetype === 'disagree'){\r\n <h5>\r\n Marked as \"Redo\"\r\n </h5>\r\n <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</section>", styles: ["#verification-feedback{height:100%;overflow-y:auto}#verification-feedback .fixture-navigate,#verification-feedback .task-info-header{user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#verification-feedback h5{color:#1d2939;font-family:Inter;font-weight:600;font-size:12px;line-height:18px;margin:0}#verification-feedback .log-block{display:flex;gap:12px;padding:4px;margin-bottom:18px}#verification-feedback .log-block h4{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback .log-block p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085;margin:0}#verification-feedback #task-info .task-info-header{background-color:#fff!important;padding:6px;width:100%}#verification-feedback #task-info .task-info-header h2{font-weight:600;font-size:14px;line-height:20px;color:#1d2939}#verification-feedback #task-info .task-info-header p{font-family:Inter;font-weight:400;font-size:12px;line-height:18px;color:#667085}#verification-feedback #fixture-quick-details .quick-edit-container{background:#f9fafb;padding:12px;border-radius:6px;width:100%;height:100%}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn{font-size:13px!important;line-height:10px!important;padding:6px 8px!important;border:1px solid rgb(208,213,221);box-shadow:0 1px 2px #1018280d;background:#fff}#verification-feedback #fixture-quick-details .quick-edit-container .quick-btn:hover{box-shadow:0 1px 2px #10182834}#verification-feedback #fixture-quick-details .quick-edit-container .redo-btn{font-family:Inter;font-weight:600;font-size:14px;line-height:18px;color:#1d2939;cursor:pointer}#verification-feedback #fixture-quick-details .quick-edit-container h4{font-family:Inter;font-weight:500;font-size:16px;line-height:24px;color:#1d2939;margin:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .label{font-family:Inter;font-weight:500;font-size:14px;line-height:20px;color:#475467;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .quick-details .value{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin-bottom:0}#verification-feedback #fixture-quick-details .quick-edit-container .diff .value{color:#d92d20!important;font-weight:600}#verification-feedback #fixture-quick-details .quick-edit-container .edit-input{padding:0 4px;border-radius:4px;width:50%;height:20px}#verification-feedback #fixture-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #fixture-comparison p{font-weight:400;font-size:12px;line-height:18px;color:#475467;margin:0}#verification-feedback #fixture-comparison .fixture-image{margin-bottom:12px}#verification-feedback #fixture-comparison .fixture-image img{object-fit:contain;width:100%}#verification-feedback #vm-comparison h5{font-family:Inter;font-weight:600;font-size:14px;line-height:20px;color:#1d2939;margin:0}#verification-feedback #vm-comparison .vm-container{padding:12px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);margin-bottom:12px;display:flex;gap:12px;cursor:pointer}#verification-feedback #vm-comparison .vm-container .vm-img{width:134px;height:134px;border-radius:4px;border:1px solid var(--Gray-200, #eaecf0);background:var(--Gray-50, #f9fafb)}#verification-feedback #vm-comparison .vm-container .vm-img img{border-radius:2px;min-width:132px;min-height:134px;object-fit:contain;width:100%;height:100%;display:block}#verification-feedback #vm-comparison .vm-container .vm-details,#verification-feedback #vm-comparison .vm-container .vm-details h5{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#verification-feedback #vm-comparison .img-preview{position:fixed;inset:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:9999;cursor:zoom-out}#verification-feedback #vm-comparison .full-img{max-width:90vw;max-height:90vh;border-radius:10px;object-fit:contain}#verification-feedback .disabled{pointer-events:none;cursor:not-allowed!important;opacity:.6}\n"] }]
|
|
405
|
-
}], ctorParameters: () => [{ type: i1.NgbModal }], propDecorators: { floorData: [{
|
|
406
|
-
type: Input
|
|
407
|
-
}], totalFixtures: [{
|
|
408
|
-
type: Input
|
|
409
|
-
}], feedbackDetails: [{
|
|
410
|
-
type: Input
|
|
411
|
-
}], cdn: [{
|
|
412
|
-
type: Input
|
|
413
|
-
}], showAction: [{
|
|
414
|
-
type: Input
|
|
415
|
-
}], changeFixture: [{
|
|
416
|
-
type: Output
|
|
417
|
-
}], action: [{
|
|
418
|
-
type: Output
|
|
419
|
-
}] } });
|
|
420
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby92ZXJpZmljYXRpb24tZmVlZGJhY2svdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby92ZXJpZmljYXRpb24tZmVlZGJhY2svdmVyaWZpY2F0aW9uLWZlZWRiYWNrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQzs7Ozs7O0FBT3BHLE1BQU0sT0FBTyw2QkFBNkI7SUEyQ3BCO0lBeENYLFNBQVMsQ0FBTTtJQUNmLGFBQWEsR0FBVSxFQUFFLENBQUM7SUFDMUIsZUFBZSxDQUFNO0lBRXJCLEdBQUcsQ0FBUztJQUNaLFVBQVUsR0FBWSxJQUFJLENBQUM7SUFFMUIsYUFBYSxHQUFHLElBQUksWUFBWSxFQUd0QyxDQUFDO0lBRUssTUFBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFFM0Msb0JBQW9CLENBR2xCO0lBRUYsYUFBYSxHQUFZLElBQUksQ0FBQztJQUU5QixtQkFBbUIsQ0FBUztJQUU1Qix3QkFBd0IsR0FBeUIsRUFBRSxDQUFDO0lBQ3BELHFCQUFxQixHQUF5QixFQUFFLENBQUM7SUFFakQsWUFBWSxDQUFN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Q0FBQyxNQUFjO1FBQ2xDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxNQUFNLENBQUM7SUFDNUMsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDO0lBQzFDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7d0dBNWZVLDZCQUE2Qjs0RkFBN0IsNkJBQTZCLG1TQ3JCMUMsbTFzQ0EyZVU7OzRGRHRkRyw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UsMkJBQTJCOzZFQU81QixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNO2dCQUtHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgQWN0aW9uQ29uZmlybVBvcHVwQ29tcG9uZW50IH0gZnJvbSBcIi4vYWN0aW9uLWNvbmZpcm0tcG9wdXAvYWN0aW9uLWNvbmZpcm0tcG9wdXAuY29tcG9uZW50XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItdmVyaWZpY2F0aW9uLWZlZWRiYWNrXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi92ZXJpZmljYXRpb24tZmVlZGJhY2suY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL3ZlcmlmaWNhdGlvbi1mZWVkYmFjay5jb21wb25lbnQuc2Nzc1wiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmVyaWZpY2F0aW9uRmVlZGJhY2tDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcclxue1xyXG4gIEBJbnB1dCgpIGZsb29yRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIHRvdGFsRml4dHVyZXM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgZmVlZGJhY2tEZXRhaWxzOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpIGNkbjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBAT3V0cHV0KCkgY2hhbmdlRml4dHVyZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgY3VycmVudEZpeHR1cmU6IHN0cmluZztcclxuICAgIGFjdGlvbjogXCJuZXh0XCIgfCBcInByZXZpb3VzXCI7XHJcbiAgfT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBzZWxlY3RlZEZlZWRiYWNrRGF0YToge1xyXG4gICAgY3VycmVudEZpeHR1cmU6IGFueTtcclxuICAgIGFpRmVlZGJhY2tGaXh0dXJlOiBhbnk7XHJcbiAgfTtcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGN1cnJlbnRGaXh0dXJlSW5kZXg6IG51bWJlcjtcclxuXHJcbiAgcGxhbm9GaXh0dXJlUXVpY2tEZXRhaWxzOiBGaXh0dXJlUXVpY2tEZXRhaWxbXSA9IFtdO1xyXG4gIGFpRml4dHVyZVF1aWNrRGV0YWlsczogRml4dHVyZVF1aWNrRGV0YWlsW10gPSBbXTtcclxuXHJcbiAgcGxhbm9GaXh0dXJlOiBhbnk7XHJcbiAgYWlGaXh0dXJlOiBhbnk7XHJcblxyXG4gIGVkaXRpbmdQbGFub0ZpeHR1cmU6IGFueSB8IG51bGwgPSBudWxsO1xyXG4gIGVkaXRpbmdBaUZpeHR1cmU6IGFueSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBzZWxlY3RlZEFpVm1JbWFnZUZvclByZXZpZXc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBpc1BsYW5vUXVpY2tFZGl0ID0gZmFsc2U7XHJcbiAgaXNBSVF1aWNrRWRpdCA9IGZhbHNlO1xyXG4gIGhpZ2hsaWdodERpZmZlcmVuY2VzID0gdHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdiTW9kYWw6IE5nYk1vZGFsKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzW1wiZmVlZGJhY2tEZXRhaWxzXCJdPy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rml4dHVyZUluZGV4ID1cclxuICAgICAgICB0aGlzLnRvdGFsRml4dHVyZXMuZmluZEluZGV4KFxyXG4gICAgICAgICAgKGY6IGFueSkgPT4gZi5faWQgPT09IHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVJZFxyXG4gICAgICAgICkgKyAxO1xyXG5cclxuICAgICAgdGhpcy5wbGFub0ZpeHR1cmUgPSBzdHJ1Y3R1cmVkQ2xvbmUoXHJcbiAgICAgICAgdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uRml4dHVyZURhdGFcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuYWlGaXh0dXJlID0gc3RydWN0dXJlZENsb25lKFxyXG4gICAgICAgIHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVBSURhdGFcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMucGxhbm9GaXh0dXJlUXVpY2tEZXRhaWxzID0gdGhpcy5idWlsZEZpeHR1cmVRdWlja0RldGFpbHMoXHJcbiAgICAgICAgdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uRml4dHVyZURhdGFcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuYWlGaXh0dXJlUXVpY2tEZXRhaWxzID0gdGhpcy5idWlsZEZpeHR1cmVRdWlja0RldGFpbHMoXHJcbiAgICAgICAgdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uZml4dHVyZUFJRGF0YVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmlzQXBwcm92ZWQpIHtcclxuICAgICAgICB0aGlzLmNvbXBhcmVRdWlja0RldGFpbHMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQXBwcm92ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYXBwcm92YWxTdGF0dXMgPT09IFwiYXBwcm92ZWRcIjtcclxuICB9XHJcblxyXG4gIGJ1aWxkRml4dHVyZVF1aWNrRGV0YWlscyhmaXh0dXJlOiBhbnkpIHtcclxuICAgIGlmICghZml4dHVyZSkgcmV0dXJuIFtdO1xyXG5cclxuICAgIGNvbnN0IGxpc3Q6IEZpeHR1cmVRdWlja0RldGFpbFtdID0gW107XHJcblxyXG4gICAgY29uc3Qgc2FmZSA9ICh2OiBhbnkpID0+XHJcbiAgICAgIHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IFwiXCIgPyBcIi1cIiA6IHY7XHJcblxyXG4gICAgbGlzdC5wdXNoKHtcclxuICAgICAga2V5OiBcImZpeHR1cmVIZWFkZXJcIixcclxuICAgICAgbGFiZWw6IFwiRml4dHVyZSBIZWFkZXI6XCIsXHJcbiAgICAgIHZhbHVlOiBzYWZlKGZpeHR1cmU/LmhlYWRlcj8ubGFiZWwpLFxyXG4gICAgICBlZGl0YWJsZTogdHJ1ZSxcclxuICAgICAgbWV0YTogeyB0eXBlOiBcImZpeHR1cmVcIiB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgbGlzdC5wdXNoKHtcclxuICAgICAga2V5OiBcImZpeHR1cmVUeXBlXCIsXHJcbiAgICAgIGxhYmVsOiBcIkZpeHR1cmUgdHlwZTpcIixcclxuICAgICAgdmFsdWU6IHNhZmUoZml4dHVyZS5maXh0dXJlQ2F0ZWdvcnkpLFxyXG4gICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBmV2lkdGggPSBmaXh0dXJlLmZpeHR1cmVXaWR0aCB8fCB7fTtcclxuICAgIGxpc3QucHVzaCh7XHJcbiAgICAgIGtleTogXCJmaXh0dXJlV2lkdGhcIixcclxuICAgICAgbGFiZWw6IFwiU2l6ZSAoV2lkdGgpOlwiLFxyXG4gICAgICB2YWx1ZTogZldpZHRoPy52YWx1ZSA/IGAke3NhZmUoZldpZHRoLnZhbHVlKX0ke3NhZmUoZldpZHRoLnVuaXQpfWAgOiBcIi1cIixcclxuICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2hlbHZlcyA9IEFycmF5LmlzQXJyYXkoZml4dHVyZS5zaGVsZkNvbmZpZylcclxuICAgICAgPyBmaXh0dXJlLnNoZWxmQ29uZmlnXHJcbiAgICAgIDogW107XHJcblxyXG4gICAgbGlzdC5wdXNoKHtcclxuICAgICAga2V5OiBcInRvdGFsU2hlbHZlc1wiLFxyXG4gICAgICBsYWJlbDogXCJUb3RhbCBzaGVsdmVzOlwiLFxyXG4gICAgICB2YWx1ZTogc2hlbHZlcy5sZW5ndGggPyBTdHJpbmcoc2hlbHZlcy5sZW5ndGgpIDogXCItXCIsXHJcbiAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICAgIH0pO1xyXG5cclxuICAgIHNoZWx2ZXNcclxuICAgICAgLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBhLnNoZWxmTnVtYmVyIC0gYi5zaGVsZk51bWJlcilcclxuICAgICAgLmZvckVhY2goKHM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNoZWxmTnVtID0gTnVtYmVyKHNhZmUocy5zaGVsZk51bWJlcikpO1xyXG4gICAgICAgIGNvbnN0IGlzU2hlbGYgPSBzLnNoZWxmVHlwZSA9PT0gXCJzaGVsZlwiO1xyXG5cclxuICAgICAgICBjb25zdCBrZXkgPSBgJHtpc1NoZWxmID8gXCJzaGVsZlwiIDogXCJ0cmF5XCJ9XyR7c2hlbGZOdW19YDtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IGlzU2hlbGZcclxuICAgICAgICAgID8gYFNoZWxmICR7c2hlbGZOdW19IGNhcGFjaXR5OmBcclxuICAgICAgICAgIDogYFRyYXkgJHtzaGVsZk51bX0gY2FwYWNpdHk6YDtcclxuXHJcbiAgICAgICAgbGV0IGNhcGFjaXR5ID0gXCItXCI7XHJcblxyXG4gICAgICAgIGlmIChzLnByb2R1Y3RQZXJTaGVsZikge1xyXG4gICAgICAgICAgaWYgKGlzU2hlbGYpIHtcclxuICAgICAgICAgICAgY2FwYWNpdHkgPSBTdHJpbmcocy5wcm9kdWN0UGVyU2hlbGYpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdHJheVJvd3MgPSBzLnRyYXlSb3dzIHx8IDA7XHJcbiAgICAgICAgICAgIGNhcGFjaXR5ID0gdHJheVJvd3MgPyBTdHJpbmcocy5wcm9kdWN0UGVyU2hlbGYgKiB0cmF5Um93cykgOiBcIi1cIjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxpc3QucHVzaCh7XHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgICBsYWJlbCxcclxuICAgICAgICAgIHZhbHVlOiBjYXBhY2l0eSxcclxuICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgbWV0YToge1xyXG4gICAgICAgICAgICB0eXBlOiBpc1NoZWxmID8gXCJzaGVsZlwiIDogXCJ0cmF5XCIsXHJcbiAgICAgICAgICAgIHNoZWxmTnVtYmVyOiBzaGVsZk51bSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRvdGFsQ2FwYWNpdHkgPSBzaGVsdmVzLnJlZHVjZSgoYWNjOiBudW1iZXIsIHM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIXMucHJvZHVjdFBlclNoZWxmKSByZXR1cm4gYWNjO1xyXG4gICAgICBpZiAocy5zaGVsZlR5cGUgPT09IFwic2hlbGZcIikgcmV0dXJuIGFjYyArIHMucHJvZHVjdFBlclNoZWxmO1xyXG5cclxuICAgICAgY29uc3Qgcm93cyA9IHMudHJheVJvd3MgfHwgMDtcclxuICAgICAgcmV0dXJuIGFjYyArIChyb3dzID8gcy5wcm9kdWN0UGVyU2hlbGYgKiByb3dzIDogMCk7XHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICBsaXN0LnB1c2goe1xyXG4gICAgICBrZXk6IFwidG90YWxDYXBhY2l0eVwiLFxyXG4gICAgICBsYWJlbDogXCJUb3RhbCBjYXBhY2l0eTpcIixcclxuICAgICAgdmFsdWU6IHRvdGFsQ2FwYWNpdHkgPyBTdHJpbmcodG90YWxDYXBhY2l0eSkgOiBcIi1cIixcclxuICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgdm0gPSBBcnJheS5pc0FycmF5KGZpeHR1cmUudm1Db25maWcpID8gZml4dHVyZS52bUNvbmZpZyA6IFtdO1xyXG5cclxuICAgIHZtLmZvckVhY2goKHY6IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGxpc3QucHVzaCh7XHJcbiAgICAgICAga2V5OiBgdm1UeXBlXyR7aX1gLFxyXG4gICAgICAgIGxhYmVsOiBgVk0gdHlwZSAke2kgKyAxfTpgLFxyXG4gICAgICAgIHZhbHVlOiBzYWZlKHYudm1UeXBlKSxcclxuICAgICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbGlzdC5wdXNoKHtcclxuICAgICAgICBrZXk6IGB2bU5hbWVfJHtpfWAsXHJcbiAgICAgICAgbGFiZWw6IFwiVk0gQ29sbGVjdGlvbjpcIixcclxuICAgICAgICB2YWx1ZTogc2FmZSh2LnZtTmFtZSksXHJcbiAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBsaXN0O1xyXG4gIH1cclxuXHJcbiAgY29tcGFyZVF1aWNrRGV0YWlscygpIHtcclxuICAgIGNvbnN0IHBsYW5vID0gdGhpcy5wbGFub0ZpeHR1cmVRdWlja0RldGFpbHM7XHJcbiAgICBjb25zdCBhaSA9IHRoaXMuYWlGaXh0dXJlUXVpY2tEZXRhaWxzO1xyXG5cclxuICAgIGlmICghcGxhbm8/Lmxlbmd0aCB8fCAhYWk/Lmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBsYW5vTWFwID0gbmV3IE1hcChwbGFuby5tYXAoKGkpID0+IFtpLmtleSwgaV0pKTtcclxuXHJcbiAgICBjb25zdCBwbGFub1ZNS2V5U2V0ID0gbmV3IFNldChcclxuICAgICAgKHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LkZpeHR1cmVEYXRhPy52bUNvbmZpZyA/PyBbXSkubWFwKFxyXG4gICAgICAgICh2OiBhbnkpID0+IGAke3Yudm1UeXBlfXwke3Yudm1OYW1lfWAudG9Mb3dlckNhc2UoKVxyXG4gICAgICApXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGFpVk1MaXN0ID0gKFxyXG4gICAgICB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5maXh0dXJlQUlEYXRhPy52bUNvbmZpZyA/PyBbXVxyXG4gICAgKS5tYXAoKHY6IGFueSkgPT4gYCR7di52bVR5cGV9fCR7di52bU5hbWV9YC50b0xvd2VyQ2FzZSgpKTtcclxuXHJcbiAgICBhaS5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5pc0RpZmZlcmVudCA9IGZhbHNlKSk7XHJcblxyXG4gICAgYWkuZm9yRWFjaCgoYWlJdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBJdGVtID0gcGxhbm9NYXAuZ2V0KGFpSXRlbS5rZXkpO1xyXG5cclxuICAgICAgaWYgKCFwSXRlbSkge1xyXG4gICAgICAgIGFpSXRlbS5pc0RpZmZlcmVudCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBwVmFsID0gKHBJdGVtLnZhbHVlID8/IFwiLVwiKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBhVmFsID0gKGFpSXRlbS52YWx1ZSA/PyBcIi1cIikudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgIGlmIChhaUl0ZW0ua2V5LnN0YXJ0c1dpdGgoXCJ2bVwiKSkge1xyXG4gICAgICAgIGNvbnN0IGlkeCA9IE51bWJlcihhaUl0ZW0ua2V5LnNwbGl0KFwiX1wiKVsxXSk7XHJcbiAgICAgICAgY29uc3QgYWlWTUtleSA9IGFpVk1MaXN0W2lkeF0gPz8gXCJcIjtcclxuXHJcbiAgICAgICAgaWYgKCFwbGFub1ZNS2V5U2V0LmhhcyhhaVZNS2V5KSkge1xyXG4gICAgICAgICAgYWlJdGVtLmlzRGlmZmVyZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBpc1NoZWxmUGxhbm8gPSBwSXRlbS5rZXkuc3RhcnRzV2l0aChcInNoZWxmX1wiKTtcclxuICAgICAgY29uc3QgaXNTaGVsZkFJID0gYWlJdGVtLmtleS5zdGFydHNXaXRoKFwic2hlbGZfXCIpO1xyXG4gICAgICBjb25zdCBpc1RyYXlQbGFubyA9IHBJdGVtLmtleS5zdGFydHNXaXRoKFwidHJheV9cIik7XHJcbiAgICAgIGNvbnN0IGlzVHJheUFJID0gYWlJdGVtLmtleS5zdGFydHNXaXRoKFwidHJheV9cIik7XHJcblxyXG4gICAgICBpZiAoaXNTaGVsZlBsYW5vIHx8IGlzVHJheVBsYW5vKSB7XHJcbiAgICAgICAgaWYgKGlzU2hlbGZQbGFubyAhPT0gaXNTaGVsZkFJIHx8IGlzVHJheVBsYW5vICE9PSBpc1RyYXlBSSkge1xyXG4gICAgICAgICAgYWlJdGVtLmlzRGlmZmVyZW50ID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwVmFsICE9PSBhVmFsKSB7XHJcbiAgICAgICAgICBhaUl0ZW0uaXNEaWZmZXJlbnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChwVmFsICE9PSBhVmFsKSB7XHJcbiAgICAgICAgYWlJdGVtLmlzRGlmZmVyZW50ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUZpeHR1cmUoY2hhbmdlOiBcIm5leHRcIiB8IFwicHJldmlvdXNcIikge1xyXG4gICAgdGhpcy5jaGFuZ2VGaXh0dXJlLmVtaXQoe1xyXG4gICAgICBjdXJyZW50Rml4dHVyZTogdGhpcy5mZWVkYmFja0RldGFpbHMuZml4dHVyZUZlZWRiYWNrLmZpeHR1cmVJZCxcclxuICAgICAgYWN0aW9uOiBjaGFuZ2UsXHJcbiAgICB9KTtcclxuICAgIHRoaXMub25DYW5jZWxBSVF1aWNrRWRpdCgpO1xyXG4gICAgdGhpcy5vbkNhbmNlbFBsYW5vUXVpY2tFZGl0KCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNsaWNrS2VlcFBsYW5vKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtQWN0aW9uKFwia2VlcFBsYW5vXCIpO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSBcIm5vdE9rXCIpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICAgIGFjdGlvbjogXCJrZWVwUGxhbm9cIixcclxuICAgICAgICB0eXBlOiBcImFncmVlXCIsXHJcbiAgICAgICAgZml4dHVyZURhdGE6IHRoaXMucGxhbm9GaXh0dXJlLFxyXG5cclxuICAgICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjayxcclxuICAgICAgICByZW1hcmtzOiByZXN1bHQ/LnJlbWFyayxcclxuICAgICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICAgIGZsb29ySWQ6IHRoaXMuZmxvb3JEYXRhLl9pZCxcclxuICAgICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IG9uQ2xpY2tLZWVwUGxhbm8gW0VSUl06XCIsIGVycm9yKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNsaWNrQWNjZXB0QUkoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbmZpcm1BY3Rpb24oXCJhY2NlcHRBSVwiKTtcclxuICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSBcIm5vdE9rXCIpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICAgIGFjdGlvbjogXCJhY2NlcHRBaVwiLFxyXG4gICAgICAgIHR5cGU6IFwiYWdyZWVcIixcclxuICAgICAgICBmaXh0dXJlRGF0YTogdGhpcy5haUZpeHR1cmUsXHJcbiAgICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2ssXHJcbiAgICAgICAgcmVtYXJrczogcmVzdWx0Py5yZW1hcmssXHJcbiAgICAgICAgcGxhbm9JZDogdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgICAgdGFza1R5cGU6IFwiZml4dHVyZVwiLFxyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBvbkNsaWNrQWNjZXB0QUkgW0VSUl06XCIsIGVycm9yKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNsaWNrUmVkbygpIHtcclxuICAgIGlmICh0aGlzLmlzQUlRdWlja0VkaXQgfHwgdGhpcy5pc1BsYW5vUXVpY2tFZGl0KSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtQWN0aW9uKFwicmVkb1wiKTtcclxuICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSBcIm5vdE9rXCIpIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuYWN0aW9uLmVtaXQoe1xyXG4gICAgICAgIGFjdGlvbjogXCJyZWRvXCIsXHJcbiAgICAgICAgdHlwZTogXCJkaXNhZ3JlZVwiLFxyXG4gICAgICAgIGZpeHR1cmVEYXRhOiBudWxsLFxyXG4gICAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICAgIHJlbWFyazogcmVzdWx0LFxyXG4gICAgICAgIHBsYW5vSWQ6IHRoaXMuZmxvb3JEYXRhLnBsYW5vSWQsXHJcbiAgICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25DbGlja1JlZG8gW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRWRpdEN1cnJlbnRGaXh0dXJlKCkge1xyXG4gICAgdGhpcy5hY3Rpb24uZW1pdCh7XHJcbiAgICAgIGFjdGlvbjogXCJlZGl0V2l0aFBsYW5vXCIsXHJcbiAgICAgIHR5cGU6IFwiYWdyZWVcIixcclxuICAgICAgZml4dHVyZURhdGE6IHRoaXMucGxhbm9GaXh0dXJlLFxyXG4gICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjayxcclxuICAgICAgcGxhbm9JZDogdGhpcy5mbG9vckRhdGEucGxhbm9JZCxcclxuICAgICAgZmxvb3JJZDogdGhpcy5mbG9vckRhdGEuX2lkLFxyXG4gICAgICB0YXNrVHlwZTogXCJmaXh0dXJlXCIsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uRWRpdEFJRmVlZGJhY2soKSB7XHJcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHtcclxuICAgICAgYWN0aW9uOiBcImVkaXRXaXRoQWlcIixcclxuICAgICAgdHlwZTogXCJhZ3JlZVwiLFxyXG4gICAgICBmaXh0dXJlRGF0YTogdGhpcy5haUZpeHR1cmUsXHJcbiAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrLFxyXG4gICAgICBwbGFub0lkOiB0aGlzLmZsb29yRGF0YS5wbGFub0lkLFxyXG4gICAgICBmbG9vcklkOiB0aGlzLmZsb29yRGF0YS5faWQsXHJcbiAgICAgIHRhc2tUeXBlOiBcImZpeHR1cmVcIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUGxhbm9RdWlja0VkaXQoKSB7XHJcbiAgICBpZiAodGhpcy5pc0FJUXVpY2tFZGl0KSByZXR1cm47XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzUGxhbm9RdWlja0VkaXQpIHtcclxuICAgICAgdGhpcy5lZGl0aW5nUGxhbm9GaXh0dXJlID0gc3RydWN0dXJlZENsb25lKHRoaXMucGxhbm9GaXh0dXJlKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNQbGFub1F1aWNrRWRpdCA9ICF0aGlzLmlzUGxhbm9RdWlja0VkaXQ7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBSVF1aWNrRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLmlzUGxhbm9RdWlja0VkaXQpIHJldHVybjtcclxuICAgIGlmICghdGhpcy5pc0FJUXVpY2tFZGl0KSB7XHJcbiAgICAgIHRoaXMuZWRpdGluZ0FpRml4dHVyZSA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLmFpRml4dHVyZSk7XHJcbiAgICAgIFxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCJAQCB+IHRoaXMuZWRpdGluZ0FpRml4dHVyZTpcIiwgdGhpcy5lZGl0aW5nQWlGaXh0dXJlKTtcclxuICAgIHRoaXMuaXNBSVF1aWNrRWRpdCA9ICF0aGlzLmlzQUlRdWlja0VkaXQ7XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbFBsYW5vUXVpY2tFZGl0KCkge1xyXG4gICAgdGhpcy5lZGl0aW5nUGxhbm9GaXh0dXJlID0gbnVsbDtcclxuICAgIHRoaXMucGxhbm9GaXh0dXJlUXVpY2tEZXRhaWxzID0gdGhpcy5idWlsZEZpeHR1cmVRdWlja0RldGFpbHMoXHJcbiAgICAgIHRoaXMucGxhbm9GaXh0dXJlXHJcbiAgICApO1xyXG4gICAgdGhpcy5pc1BsYW5vUXVpY2tFZGl0ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblNhdmVQbGFub1F1aWNrRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLmVkaXRpbmdQbGFub0ZpeHR1cmUpIHtcclxuICAgICAgdGhpcy5wbGFub0ZpeHR1cmUgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5lZGl0aW5nUGxhbm9GaXh0dXJlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRpbmdQbGFub0ZpeHR1cmUgPSBudWxsO1xyXG4gICAgdGhpcy5wbGFub0ZpeHR1cmVRdWlja0RldGFpbHMgPSB0aGlzLmJ1aWxkRml4dHVyZVF1aWNrRGV0YWlscyhcclxuICAgICAgdGhpcy5wbGFub0ZpeHR1cmVcclxuICAgICk7XHJcbiAgICB0aGlzLmNvbXBhcmVRdWlja0RldGFpbHMoKTtcclxuXHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9uQ2xpY2tLZWVwUGxhbm8oKTtcclxuICAgIGlmIChyZXMpIHRoaXMuaXNQbGFub1F1aWNrRWRpdCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWxBSVF1aWNrRWRpdCgpIHtcclxuICAgIHRoaXMuZWRpdGluZ0FpRml4dHVyZSA9IG51bGw7XHJcbiAgICB0aGlzLmFpRml4dHVyZVF1aWNrRGV0YWlscyA9IHRoaXMuYnVpbGRGaXh0dXJlUXVpY2tEZXRhaWxzKHRoaXMuYWlGaXh0dXJlKTtcclxuICAgIHRoaXMuaXNBSVF1aWNrRWRpdCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TYXZlQUlRdWlja0VkaXQoKSB7XHJcbiAgICBpZiAodGhpcy5lZGl0aW5nQWlGaXh0dXJlKSB7XHJcbiAgICAgIHRoaXMuYWlGaXh0dXJlID0gc3RydWN0dXJlZENsb25lKHRoaXMuZWRpdGluZ0FpRml4dHVyZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lZGl0aW5nQWlGaXh0dXJlID0gbnVsbDtcclxuICAgIHRoaXMuYWlGaXh0dXJlUXVpY2tEZXRhaWxzID0gdGhpcy5idWlsZEZpeHR1cmVRdWlja0RldGFpbHModGhpcy5haUZpeHR1cmUpO1xyXG4gICAgdGhpcy5jb21wYXJlUXVpY2tEZXRhaWxzKCk7XHJcblxyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vbkNsaWNrQWNjZXB0QUkoKTtcclxuICAgIGlmIChyZXMpIHRoaXMuaXNBSVF1aWNrRWRpdCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25DYXBhY2l0eUlucHV0KFxyXG4gICAgZXZlbnQ6IEV2ZW50LFxyXG4gICAgaXRlbTogRml4dHVyZVF1aWNrRGV0YWlsLFxyXG4gICAgc291cmNlOiBcInBsYW5vXCIgfCBcImFpXCJcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBsZXQgdiA9IGlucHV0LnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCBcIlwiKS5zbGljZSgwLCAyKTtcclxuXHJcbiAgICBpbnB1dC52YWx1ZSA9IHY7XHJcbiAgICBpdGVtLnZhbHVlID0gdiB8fCBcIjBcIjtcclxuXHJcbiAgICB0aGlzLm9uUXVpY2tWYWx1ZUNoYW5nZShpdGVtLCBpdGVtLnZhbHVlLCBzb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgb25RdWlja1ZhbHVlQ2hhbmdlKFxyXG4gICAgaXRlbTogRml4dHVyZVF1aWNrRGV0YWlsLFxyXG4gICAgbmV3VmFsdWU6IHN0cmluZyxcclxuICAgIHNvdXJjZTogXCJwbGFub1wiIHwgXCJhaVwiXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YXJnZXRGaXh0dXJlID1cclxuICAgICAgc291cmNlID09PSBcInBsYW5vXCIgPyB0aGlzLmVkaXRpbmdQbGFub0ZpeHR1cmUgOiB0aGlzLmVkaXRpbmdBaUZpeHR1cmU7XHJcblxyXG4gICAgaWYgKCF0YXJnZXRGaXh0dXJlIHx8ICFpdGVtPy5tZXRhKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBuZXdWYWx1ZT8udHJpbSgpO1xyXG4gICAgaXRlbS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIGlmIChpdGVtLm1ldGEudHlwZSA9PT0gXCJmaXh0dXJlXCIgJiYgaXRlbS5rZXkgPT09IFwiZml4dHVyZUhlYWRlclwiKSB7XHJcbiAgICAgIHRhcmdldEZpeHR1cmUuaGVhZGVyLmxhYmVsID0gdmFsdWUgfHwgXCJcIjtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNoZWxmTnVtYmVyID0gaXRlbS5tZXRhLnNoZWxmTnVtYmVyO1xyXG4gICAgaWYgKCFzaGVsZk51bWJlcikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNoZWxmID0gKHRhcmdldEZpeHR1cmUuc2hlbGZDb25maWcgPz8gW10pLmZpbmQoXHJcbiAgICAgIChzOiBhbnkpID0+IE51bWJlcihzLnNoZWxmTnVtYmVyKSA9PT0gc2hlbGZOdW1iZXJcclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFzaGVsZikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICBpZiAoaXNOYU4obnVtZXJpY1ZhbHVlKSB8fCBudW1lcmljVmFsdWUgPCAwKSByZXR1cm47XHJcblxyXG4gICAgLy8gU2hlbGYg4oaSIGRpcmVjdCBtYXBwaW5nXHJcbiAgICBpZiAoaXRlbS5tZXRhLnR5cGUgPT09IFwic2hlbGZcIikge1xyXG4gICAgICBzaGVsZi5wcm9kdWN0UGVyU2hlbGYgPSBudW1lcmljVmFsdWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUcmF5IOKGkiByZXZlcnNlIGNhbGN1bGF0ZVxyXG4gICAgaWYgKGl0ZW0ubWV0YS50eXBlID09PSBcInRyYXlcIikge1xyXG4gICAgICBjb25zdCByb3dzID0gTnVtYmVyKHNoZWxmLnRyYXlSb3dzKSB8fCAwO1xyXG4gICAgICBpZiAoIXJvd3MpIHJldHVybjtcclxuXHJcbiAgICAgIHNoZWxmLnByb2R1Y3RQZXJTaGVsZiA9IE1hdGguZmxvb3IobnVtZXJpY1ZhbHVlIC8gcm93cyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtQWN0aW9uKFxyXG4gICAgdHlwZTogXCJyZWRvXCIgfCBcImFjY2VwdEFJXCIgfCBcImtlZXBQbGFub1wiXHJcbiAgKTogUHJvbWlzZTx7IGFjdGlvbjogc3RyaW5nOyByZW1hcms6IHN0cmluZyB8IG51bGwgfSB8IG51bGw+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKEFjdGlvbkNvbmZpcm1Qb3B1cENvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICAgIHNpemU6IFwibWRcIixcclxuICAgICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAgfSk7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnR5cGUgPSB0eXBlO1xyXG5cclxuICAgICAgcmV0dXJuIGF3YWl0IG1vZGVsUmVmLnJlc3VsdC50aGVuPHtcclxuICAgICAgICBhY3Rpb246IHN0cmluZztcclxuICAgICAgICByZW1hcms6IHN0cmluZyB8IG51bGw7XHJcbiAgICAgIH0+KChyZXN1bHQpID0+IHJlc3VsdCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xpY2tWTUltYWdlUHJldmlldyhpbWdVcmw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zZWxlY3RlZEFpVm1JbWFnZUZvclByZXZpZXcgPSBpbWdVcmw7XHJcbiAgfVxyXG5cclxuICBjbG9zZVZNSW1hZ2VQcmV2aWV3KCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEFpVm1JbWFnZUZvclByZXZpZXcgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBGaXh0dXJlUXVpY2tEZXRhaWwge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBlZGl0YWJsZTogYm9vbGVhbjtcclxuICBpc0RpZmZlcmVudD86IGJvb2xlYW47XHJcblxyXG4gIG1ldGE/OiB7XHJcbiAgICB0eXBlOiBcImZpeHR1cmVcIiB8IFwic2hlbGZcIiB8IFwidHJheVwiO1xyXG4gICAgc2hlbGZOdW1iZXI/OiBudW1iZXI7XHJcbiAgfTtcclxufVxyXG4iLCI8c2VjdGlvbiBpZD1cInZlcmlmaWNhdGlvbi1mZWVkYmFja1wiPlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGFcIiBpZD1cInRhc2staW5mb1wiIG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmVlZGJhY2tEZXRhaWxzPy50YXNrSW5mb1RvZ2dsZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImFjY29yZGlvbi1idXR0b24gdGFzay1pbmZvLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Ub2dnbGUgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMj5GaXh0dXJlIHZlcmlmaWNhdGlvbiBhc3NpZ25lZDwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+e3tmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGE/LmNyZWF0ZWRBdCB8IGRhdGU6ICdoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBVc2VyIGF2YXRhciAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgdmlld0JveD1cIjAgMCAzMiAzMlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgcng9XCIxNlwiIGZpbGw9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIyLjY2NzMgMjMuNVYyMS44MzMzQzIyLjY2NzMgMjAuOTQ5MyAyMi4zMTYxIDIwLjEwMTQgMjEuNjkxIDE5LjQ3NjNDMjEuMDY1OSAxOC44NTEyIDIwLjIxOCAxOC41IDE5LjMzNCAxOC41SDEyLjY2NzNDMTEuNzgzMyAxOC41IDEwLjkzNTQgMTguODUxMiAxMC4zMTAzIDE5LjQ3NjNDOS42ODUxNyAyMC4xMDE0IDkuMzMzOTggMjAuOTQ5MyA5LjMzMzk4IDIxLjgzMzNWMjMuNU0xOS4zMzQgMTEuODMzM0MxOS4zMzQgMTMuNjc0MyAxNy44NDE2IDE1LjE2NjcgMTYuMDAwNyAxNS4xNjY3QzE0LjE1OTcgMTUuMTY2NyAxMi42NjczIDEzLjY3NDMgMTIuNjY3MyAxMS44MzMzQzEyLjY2NzMgOS45OTIzOCAxNC4xNTk3IDguNSAxNi4wMDA3IDguNUMxNy44NDE2IDguNSAxOS4zMzQgOS45OTIzOCAxOS4zMzQgMTEuODMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0Pnt7ZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LnRhc2tEYXRhPy5jcmVhdGVkQnlOYW1lfX08L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy50YXNrRGF0YT8uY3JlYXRlZEF0IHwgZGF0ZTogJ2hoOm1tYSwgZGQgTU1NIHl5eXknfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkFzc2lnbmVyPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVXNlciBhdmF0YXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0VBRjhGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMi42NjczIDIzLjVWMjEuODMzM0MyMi42NjczIDIwLjk0OTMgMjIuMzE2MSAyMC4xMDE0IDIxLjY5MSAxOS40NzYzQzIxLjA2NTkgMTguODUxMiAyMC4yMTggMTguNSAxOS4zMzQgMTguNUgxMi42NjczQzExLjc4MzMgMTguNSAxMC45MzU0IDE4Ljg1MTIgMTAuMzEwMyAxOS40NzYzQzkuNjg1MTcgMjAuMTAxNCA5LjMzMzk4IDIwLjk0OTMgOS4zMzM5OCAyMS44MzMzVjIzLjVNMTkuMzM0IDExLjgzMzNDMTkuMzM0IDEzLjY3NDMgMTcuODQxNiAxNS4xNjY3IDE2LjAwMDcgMTUuMTY2N0MxNC4xNTk3IDE1LjE2NjcgMTIuNjY3MyAxMy42NzQzIDEyLjY2NzMgMTEuODMzM0MxMi42NjczIDkuOTkyMzggMTQuMTU5NyA4LjUgMTYuMDAwNyA4LjVDMTcuODQxNiA4LjUgMTkuMzM0IDkuOTkyMzggMTkuMzM0IDExLjgzMzNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMSBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND4ge3tmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8udGFza0RhdGE/LnVzZXJOYW1lfX08L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy50YXNrRGF0YT8uc3VibWl0VGltZV9zdHJpbmd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+QXNzaWduZWU8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmVlZGJhY2tEZXRhaWxzPy5nbG9iYWxDb21tZW50cz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0yXCI+Q29tbWVudHM8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1ibG9ja1wiICpuZ0Zvcj1cImxldCBjIG9mIGZlZWRiYWNrRGV0YWlscz8uZ2xvYmFsQ29tbWVudHM7bGV0IGk9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0VBRjhGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIyLjY2NzMgMjMuNVYyMS44MzMzQzIyLjY2NzMgMjAuOTQ5MyAyMi4zMTYxIDIwLjEwMTQgMjEuNjkxIDE5LjQ3NjNDMjEuMDY1OSAxOC44NTEyIDIwLjIxOCAxOC41IDE5LjMzNCAxOC41SDEyLjY2NzNDMTEuNzgzMyAxOC41IDEwLjkzNTQgMTguODUxMiAxMC4zMTAzIDE5LjQ3NjNDOS42ODUxNyAyMC4xMDE0IDkuMzMzOTggMjAuOTQ5MyA5LjMzMzk4IDIxLjgzMzNWMjMuNU0xOS4zMzQgMTEuODMzM0MxOS4zMzQgMTMuNjc0MyAxNy44NDE2IDE1LjE2NjcgMTYuMDAwNyAxNS4xNjY3QzE0LjE1OTcgMTUuMTY2NyAxMi42NjczIDEzLjY3NDMgMTIuNjY3MyAxMS44MzMzQzEyLjY2NzMgOS45OTIzOCAxNC4xNTk3IDguNSAxNi4wMDA3IDguNUMxNy44NDE2IDguNSAxOS4zMzQgOS45OTIzOCAxOS4zMzQgMTEuODMzM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMSBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0Pnt7Yz8udXNlck5hbWV9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57e2M/LmNyZWF0ZWRBdHxkYXRlOidoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+e3tjPy5jb21tZW50fX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGhyICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LnRhc2tEYXRhXCI+XHJcblxyXG4gICAgPGRpdiBpZD1cImZlZWRiYWNrLWhhbmRsZXJcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTYgbXktNiBweC0zIGZpeHR1cmUtbmF2aWdhdGVcIj5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwic2hvd0FjdGlvblwiIChjbGljayk9XCJvbkNoYW5nZUZpeHR1cmUoJ3ByZXZpb3VzJylcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCJcclxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDZMOSAxMkwxNSAxOFwiIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcblxyXG5cclxuICAgICAgICA8aDMgY2xhc3M9XCJtLTBcIj57e3BsYW5vRml4dHVyZT8uaGVhZGVyPy5sYWJlbH19PC9oMz5cclxuXHJcbiAgICAgICAgPGgzICpuZ0lmPVwic2hvd0FjdGlvblwiIGNsYXNzPVwibS0wIG1zLWF1dG9cIj5cclxuICAgICAgICAgICAge3tjdXJyZW50Rml4dHVyZUluZGV4fX0ve3t0b3RhbEZpeHR1cmVzLmxlbmd0aH19XHJcbiAgICAgICAgPC9oMz5cclxuXHJcbiAgICAgICAgPHN2ZyAqbmdJZj1cInNob3dBY3Rpb25cIiAoY2xpY2spPVwib25DaGFuZ2VGaXh0dXJlKCduZXh0JylcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCJcclxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTkgMThMMTUgMTJMOSA2XCIgc3Ryb2tlPVwiIzFEMjkzOVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICBAaWYoIHRoaXMuYWlGaXh0dXJlPy5maXh0dXJlSWQpe1xyXG5cclxuICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1xdWljay1kZXRhaWxzXCIgY2xhc3M9XCJyb3cgZy0wIFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stZWRpdC1jb250YWluZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgQGlmICghaXNBcHByb3ZlZCAmJiBzaG93QWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHF1aWNrLWJ0biBtcy1hdXRvXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdEN1cnJlbnRGaXh0dXJlKClcIiBbZGlzYWJsZWRdPVwiaXNBSVF1aWNrRWRpdCB8fCBpc1BsYW5vUXVpY2tFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMjI4XzEyNTM2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkuMTY2MDIgMy4zMzMySDMuMzMyNjhDMi44OTA2NSAzLjMzMzIgMi40NjY3MyAzLjUwODc5IDIuMTU0MTcgMy44MjEzNUMxLjg0MTYxIDQuMTMzOTEgMS42NjYwMiA0LjU1Nzg0IDEuNjY2MDIgNC45OTk4NlYxNi42NjY1QzEuNjY2MDIgMTcuMTA4NiAxLjg0MTYxIDE3LjUzMjUgMi4xNTQxNyAxNy44NDVDMi40NjY3MyAxOC4xNTc2IDIuODkwNjUgMTguMzMzMiAzLjMzMjY4IDE4LjMzMzJIMTQuOTk5M0MxNS40NDE0IDE4LjMzMzIgMTUuODY1MyAxOC4xNTc2IDE2LjE3NzkgMTcuODQ1QzE2LjQ5MDQgMTcuNTMyNSAxNi42NjYgMTcuMTA4NiAxNi42NjYgMTYuNjY2NVYxMC44MzMyTTE1LjQxNiAyLjA4MzJDMTUuNzQ3NSAxLjc1MTY4IDE2LjE5NzIgMS41NjU0MyAxNi42NjYgMS41NjU0M0MxNy4xMzQ5IDEuNTY1NDMgMTcuNTg0NSAxLjc1MTY4IDE3LjkxNiAyLjA4MzJDMTguMjQ3NSAyLjQxNDcyIDE4LjQzMzggMi44NjQzNiAxOC40MzM4IDMuMzMzMkMxOC40MzM4IDMuODAyMDQgMTguMjQ3NSA0LjI1MTY4IDE3LjkxNiA0LjU4MzJMOS45OTkzNSAxMi40OTk5TDYuNjY2MDIgMTMuMzMzMkw3LjQ5OTM1IDkuOTk5ODZMMTUuNDE2IDIuMDgzMlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMjI4XzEyNTM2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBxdWljay1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xpY2tLZWVwUGxhbm8oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQUlRdWlja0VkaXQgfHwgaXNQbGFub1F1aWNrRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjcyNSA1LjgwMDA4TDEwIDEwLjAwODRMMTcuMjc1IDUuODAwMDhNMTAgMTguNDAwMVYxMC4wMDAxTTE3LjUgMTMuMzMzNFY2LjY2Njc1QzE3LjQ5OTcgNi4zNzQ0OCAxNy40MjI1IDYuMDg3NDIgMTcuMjc2MyA1LjgzNDM4QzE3LjEzIDUuNTgxMzQgMTYuOTE5OCA1LjM3MTIyIDE2LjY2NjcgNS4yMjUwOEwxMC44MzMzIDEuODkxNzVDMTAuNTggMS43NDU0NyAxMC4yOTI2IDEuNjY4NDYgMTAgMS42Njg0NkM5LjcwNzQ0IDEuNjY4NDYgOS40MjAwMyAxLjc0NTQ3IDkuMTY2NjcgMS44OTE3NUwzLjMzMzMzIDUuMjI1MDhDMy4wODAyMiA1LjM3MTIyIDIuODY5OTggNS41ODEzNCAyLjcyMzcyIDUuODM0MzhDMi41Nzc0NSA2LjA4NzQyIDIuNTAwMyA2LjM3NDQ4IDIuNSA2LjY2Njc1VjEzLjMzMzRDMi41MDAzIDEzLjYyNTcgMi41Nzc0NSAxMy45MTI3IDIuNzIzNzIgMTQuMTY1OEMyLjg2OTk4IDE0LjQxODggMy4wODAyMiAxNC42Mjg5IDMuMzMzMzMgMTQuNzc1MUw5LjE2NjY3IDE4LjEwODRDOS40MjAwMyAxOC4yNTQ3IDkuNzA3NDQgMTguMzMxNyAxMCAxOC4zMzE3QzEwLjI5MjYgMTguMzMxNyAxMC41OCAxOC4yNTQ3IDEwLjgzMzMgMTguMTA4NEwxNi42NjY3IDE0Ljc3NTFDMTYuOTE5OCAxNC42Mjg5IDE3LjEzIDE0LjQxODggMTcuMjc2MyAxNC4xNjU4QzE3LjQyMjUgMTMuOTEyNyAxNy40OTk3IDEzLjYyNTcgMTcuNSAxMy4zMzM0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZWVwIHBsYW5vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiAgbXktNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjcyNSA1LjgwMDA4TDEwIDEwLjAwODRMMTcuMjc1IDUuODAwMDhNMTAgMTguNDAwMVYxMC4wMDAxTTE3LjUgMTMuMzMzNFY2LjY2Njc1QzE3LjQ5OTcgNi4zNzQ0OCAxNy40MjI1IDYuMDg3NDIgMTcuMjc2MyA1LjgzNDM4QzE3LjEzIDUuNTgxMzQgMTYuOTE5OCA1LjM3MTIyIDE2LjY2NjcgNS4yMjUwOEwxMC44MzMzIDEuODkxNzVDMTAuNTggMS43NDU0NyAxMC4yOTI2IDEuNjY4NDYgMTAgMS42Njg0NkM5LjcwNzQ0IDEuNjY4NDYgOS40MjAwMyAxLjc0NTQ3IDkuMTY2NjcgMS44OTE3NUwzLjMzMzMzIDUuMjI1MDhDMy4wODAyMiA1LjM3MTIyIDIuODY5OTggNS41ODEzNCAyLjcyMzcyIDUuODM0MzhDMi41Nzc0NSA2LjA4NzQyIDIuNTAwMyA2LjM3NDQ4IDIuNSA2LjY2Njc1VjEzLjMzMzRDMi41MDAzIDEzLjYyNTcgMi41Nzc0NSAxMy45MTI3IDIuNzIzNzIgMTQuMTY1OEMyLjg2OTk4IDE0LjQxODggMy4wODAyMiAxNC42Mjg5IDMuMzMzMzMgMTQuNzc1MUw5LjE2NjY3IDE4LjEwODRDOS40MjAwMyAxOC4yNTQ3IDkuNzA3NDQgMTguMzMxNyAxMCAxOC4zMzE3QzEwLjI5MjYgMTguMzMxNyAxMC41OCAxOC4yNTQ3IDEwLjgzMzMgMTguMTA4NEwxNi42NjY3IDE0Ljc3NTFDMTYuOTE5OCAxNC42Mjg5IDE3LjEzIDE0LjQxODggMTcuMjc2MyAxNC4xNjU4QzE3LjQyMjUgMTMuOTEyNyAxNy40OTk3IDEzLjYyNTcgMTcuNSAxMy4zMzM0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoND5QbGFub2dyYW06IDwvaDQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGlzQXBwcm92ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vyc1swXT8udXNlckFjdGlvbiA9PT0gJ2tlZXBQbGFubycgfHwgZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdlZGl0V2l0aFBsYW5vJyBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtYXV0b1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHk9XCI4Ljc0MjI4ZS0wN1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHJ4PVwiMTBcIiBmaWxsPVwiI0QxRkFERlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0LjI0NjQgNi4xNTgzOUw4LjI3OTY5IDExLjkxNjdMNi42OTYzNSAxMC4yMjUxQzYuNDA0NjkgOS45NTAwNSA1Ljk0NjM1IDkuOTMzMzkgNS42MTMwMiAxMC4xNjY3QzUuMjg4MDIgMTAuNDA4NCA1LjE5NjM1IDEwLjgzMzQgNS4zOTYzNSAxMS4xNzUxTDcuMjcxMzUgMTQuMjI1MUM3LjQ1NDY5IDE0LjUwODQgNy43NzEzNSAxNC42ODM0IDguMTI5NjkgMTQuNjgzNEM4LjQ3MTM1IDE0LjY4MzQgOC43OTYzNSAxNC41MDg0IDguOTc5NjkgMTQuMjI1MUM5LjI3OTY5IDEzLjgzMzQgMTUuMDA0NyA3LjAwODM5IDE1LjAwNDcgNy4wMDgzOUMxNS43NTQ3IDYuMjQxNzIgMTQuODQ2NCA1LjU2NjcyIDE0LjI0NjQgNi4xNTAwNUwxNC4yNDY0IDYuMTU4MzlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxMkI3NkFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1AZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJzaG93QWN0aW9uICYmICFpc1BsYW5vUXVpY2tFZGl0XCIgY2xhc3M9XCJtcy1hdXRvIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxhbm9RdWlja0VkaXQoKVwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzQUlRdWlja0VkaXRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05IDE1LjAwMDJIMTUuNzVNMTIuMzc1IDIuNjI1MTdDMTIuNjczNCAyLjMyNjggMTMuMDc4IDIuMTU5MTggMTMuNSAyLjE1OTE4QzEzLjcwODkgMi4xNTkxOCAxMy45MTU4IDIuMjAwMzMgMTQuMTA4OCAyLjI4MDI5QzE0LjMwMTkgMi4zNjAyNCAxNC40NzczIDIuNDc3NDMgMTQuNjI1IDIuNjI1MTdDMTQuNzcyNyAyLjc3MjkxIDE0Ljg4OTkgMi45NDgzIDE0Ljk2OTkgMy4xNDEzMkMxNS4wNDk4IDMuMzM0MzUgMTUuMDkxIDMuNTQxMjQgMTUuMDkxIDMuNzUwMTdDMTUuMDkxIDMuOTU5MSAxNS4wNDk4IDQuMTY1OTkgMTQuOTY5OSA0LjM1OTAyQzE0Ljg4OTkgNC41NTIwNCAxNC43NzI3IDQuNzI3NDMgMTQuNjI1IDQuODc1MTdMNS4yNSAxNC4yNTAyTDIuMjUgMTUuMDAwMkwzIDEyLjAwMDJMMTIuMzc1IDIuNjI1MTdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dBY3Rpb24gJiYgaXNQbGFub1F1aWNrRWRpdCAmJiAhaXNBSVF1aWNrRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyIG1zLWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHF1aWNrLWJ0blwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYW5jZWxQbGFub1F1aWNrRWRpdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcXVpY2stYnRuXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNhdmVQbGFub1F1aWNrRWRpdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIHBsYW5vRml4dHVyZVF1aWNrRGV0YWlsc1wiIGNsYXNzPVwicm93IGctMCBtYi00XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjb2wtNiBsYWJlbFwiPnt7IGl0ZW0ubGFiZWwgfX08L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbmxpbmUgZWRpdGluZyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1BsYW5vUXVpY2tFZGl0ICYmIGl0ZW0uZWRpdGFibGU7IGVsc2UgcGxhbm9WYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRklYVFVSRSBOQU1FICh0ZXh0KSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5tZXRhPy50eXBlID09PSAnZml4dHVyZSc7IGVsc2UgY2FwYWNpdHlJbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJjb2wtNiB2YWx1ZSBlZGl0LWlucHV0IGZvcm0tY29udHJvbFwiIFtuZ01vZGVsXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWlja1ZhbHVlQ2hhbmdlKGl0ZW0sICRldmVudCwgJ3BsYW5vJylcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxNTBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBUEFDSVRZIChudW1iZXIpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2FwYWNpdHlJbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiY29sLTYgdmFsdWUgZWRpdC1pbnB1dCBmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIiBwYXR0ZXJuPVwiWzAtOV0qXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkNhcGFjaXR5SW5wdXQoJGV2ZW50LCBpdGVtLCAncGxhbm8nKVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm9ybWFsIHRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYW5vVmFsdWU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjb2wtNiB2YWx1ZVwiPnt7IGl0ZW0udmFsdWUgfCB0aXRsZWNhc2V9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stZWRpdC1jb250YWluZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgQGlmICghaXNBcHByb3ZlZCAmJiBzaG93QWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlZG8tYnRuXCIgKGNsaWNrKT1cIm9uQ2xpY2tSZWRvKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0IHx8IGlzUGxhbm9RdWlja0VkaXRcIj5SZWRvPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcXVpY2stYnRuIG1zLWF1dG9cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRWRpdEFJRmVlZGJhY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQUlRdWlja0VkaXQgfHwgaXNQbGFub1F1aWNrRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzIyOF8xMjUzNilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjE2NjAyIDMuMzMzMkgzLjMzMjY4QzIuODkwNjUgMy4zMzMyIDIuNDY2NzMgMy41MDg3OSAyLjE1NDE3IDMuODIxMzVDMS44NDE2MSA0LjEzMzkxIDEuNjY2MDIgNC41NTc4NCAxLjY2NjAyIDQuOTk5ODZWMTYuNjY2NUMxLjY2NjAyIDE3LjEwODYgMS44NDE2MSAxNy41MzI1IDIuMTU0MTcgMTcuODQ1QzIuNDY2NzMgMTguMTU3NiAyLjg5MDY1IDE4LjMzMzIgMy4zMzI2OCAxOC4zMzMySDE0Ljk5OTNDMTUuNDQxNCAxOC4zMzMyIDE1Ljg2NTMgMTguMTU3NiAxNi4xNzc5IDE3Ljg0NUMxNi40OTA0IDE3LjUzMjUgMTYuNjY2IDE3LjEwODYgMTYuNjY2IDE2LjY2NjVWMTAuODMzMk0xNS40MTYgMi4wODMyQzE1Ljc0NzUgMS43NTE2OCAxNi4xOTcyIDEuNTY1NDMgMTYuNjY2IDEuNTY1NDNDMTcuMTM0OSAxLjU2NTQzIDE3LjU4NDUgMS43NTE2OCAxNy45MTYgMi4wODMyQzE4LjI0NzUgMi40MTQ3MiAxOC40MzM4IDIuODY0MzYgMTguNDMzOCAzLjMzMzJDMTguNDMzOCAzLjgwMjA0IDE4LjI0NzUgNC4yNTE2OCAxNy45MTYgNC41ODMyTDkuOTk5MzUgMTIuNDk5OUw2LjY2NjAyIDEzLjMzMzJMNy40OTkzNSA5Ljk5OTg2TDE1LjQxNiAyLjA4MzJaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzIyOF8xMjUzNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHF1aWNrLWJ0blwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DbGlja0FjY2VwdEFJKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FJUXVpY2tFZGl0IHx8IGlzUGxhbm9RdWlja0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8yMjhfNTc3NClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00LjE2NjAyIDEuNjY2NUw0LjMyNDM1IDIuNDQ5ODRDNC40Mzc4MiAzLjAxMjM0IDQuNjk0NTcgMy41MzYwMyA1LjA2OTc3IDMuOTcwMjFDNS40NDQ5NyA0LjQwNDM5IDUuOTI1OSA0LjczNDM1IDYuNDY2MDIgNC45MjgxN0w2LjY2NjAyIDQuOTk5ODRMNi40NjYwMiA1LjA3MTVDNS45MjU5IDUuMjY1MzIgNS40NDQ5NyA1LjU5NTI5IDUuMDY5NzcgNi4wMjk0N0M0LjY5NDU3IDYuNDYzNjUgNC40Mzc4MiA2Ljk4NzMzIDQuMzI0MzUgNy41NDk4NEw0LjE2NjAyIDguMzMzMTdMNC4wMDc2OCA3LjU0OTg0QzMuODk0MjIgNi45ODczMyAzLjYzNzQ2IDYuNDYzNjUgMy4yNjIyNiA2LjAyOTQ3QzIuODg3MDYgNS41OTUyOSAyLjQwNjEzIDUuMjY1MzIgMS44NjYwMiA1LjA3MTVMMS42NjYwMiA0Ljk5OTg0TDEuODY2MDIgNC45MjgxN0MyLjQwNjEzIDQuNzM0MzUgMi44ODcwNiA0LjQwNDM5IDMuMjYyMjYgMy45NzAyMUMzLjYzNzQ2IDMuNTM2MDMgMy44OTQyMiAzLjAxMjM0IDQuMDA3NjggMi40NDk4NEw0LjE2NjAyIDEuNjY2NVpNNi42NjYwMiAxMy4zMzMyTDYuODU3NjggMTQuMzk2NUM2LjkwNzQ1IDE0LjY3MzkgNy4wMjY3NCAxNC45MzQxIDcuMjA0MzkgMTUuMTUyOEM3LjM4MjA0IDE1LjM3MTYgNy42MTIyNiAxNS41NDE3IDcuODczNTIgMTUuNjQ3M0w4LjMzMjY4IDE1LjgzMzJMNy44NzM1MiAxNi4wMTlDNy42MTIyMSAxNi4xMjQ0IDcuMzgxODkgMTYuMjk0NCA3LjIwNDA5IDE2LjUxM0M3LjAyNjMgMTYuNzMxNiA2LjkwNjgzIDE2Ljk5MTcgNi44NTY4NSAxNy4yNjlMNi42NjYwMiAxOC4zMzMyTDYuNDc0MzUgMTcuMjY5OEM2LjQyNDU4IDE2Ljk5MjUgNi4zMDUyOSAxNi43MzIyIDYuMTI3NjQgMTYuNTEzNUM1Ljk0OTk5IDE2LjI5NDcgNS43MTk3OCAxNi4xMjQ2IDUuNDU4NTIgMTYuMDE5TDQuOTk5MzUgMTUuODMzMkw1LjQ1ODUyIDE1LjY0NzNDNS43MTk4MyAxNS41NDE5IDUuOTUwMTQgMTUuMzcyIDYuMTI3OTQgMTUuMTUzNEM2LjMwNTczIDE0LjkzNDggNi40MjUyIDE0LjY3NDYgNi40NzUxOCAxNC4zOTczTDYuNjY2MDIgMTMuMzMzMlpNMTMuMzMyNyAyLjQ5OTg0TDEzLjc5NiA0LjcxMTVDMTQuMDMyMiA1LjgzOTA3IDE0LjU1NjUgNi44ODYyMSAxNS4zMTc4IDcuNzUwODFDMTYuMDc5MSA4LjYxNTQxIDE3LjA1MTUgOS4yNjc5NiAxOC4xNDAyIDkuNjQ0ODRMMTkuMTY2IDkuOTk5ODRMMTguMTQwMiAxMC4zNTQ4QzE3LjA1MTUgMTAuNzMxNyAxNi4wNzkxIDExLjM4NDMgMTUuMzE3OCAxMi4yNDg5QzE0LjU1NjUgMTMuMTEzNSAxNC4wMzIyIDE0LjE2MDYgMTMuNzk2IDE1LjI4ODJMMTMuMzMyNyAxNy40OTk4TDEyLjg2OTMgMTUuMjg4MkMxMi42MzMyIDE0LjE2MDYgMTIuMTA4OSAxMy4xMTM1IDExLjM0NzYgMTIuMjQ4OUMxMC41ODYyIDExLjM4NDMgOS42MTM4MiAxMC43MzE3IDguNTI1MTggMTAuMzU0OEw3LjQ5OTM1IDkuOTk5ODRMOC41MjUxOCA5LjY0NDg0QzkuNjEzODIgOS4yNjc5NiAxMC41ODYyIDguNjE1NDEgMTEuMzQ3NiA3Ljc1MDgxQzEyLjEwODkgNi44ODYyMSAxMi42MzMyIDUuODM5MDcgMTIuODY5MyA0LjcxMTVMMTMuMzMyNyAyLjQ5OTg0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiYmxhY2tcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8yMjhfNTc3NFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHQgQUlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG15LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzIyOF81Nzc0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNC4xNjYwMiAxLjY2NjVMNC4zMjQzNSAyLjQ0OTg0QzQuNDM3ODIgMy4wMTIzNCA0LjY5NDU3IDMuNTM2MDMgNS4wNjk3NyAzLjk3MDIxQzUuNDQ0OTcgNC40MDQzOSA1LjkyNTkgNC43MzQzNSA2LjQ2NjAyIDQuOTI4MTdMNi42NjYwMiA0Ljk5OTg0TDYuNDY2MDIgNS4wNzE1QzUuOTI1OSA1LjI2NTMyIDUuNDQ0OTcgNS41OTUyOSA1LjA2OTc3IDYuMDI5NDdDNC42OTQ1NyA2LjQ2MzY1IDQuNDM3ODIgNi45ODczMyA0LjMyNDM1IDcuNTQ5ODRMNC4xNjYwMiA4LjMzMzE3TDQuMDA3NjggNy41NDk4NEMzLjg5NDIyIDYuOTg3MzMgMy42Mzc0NiA2LjQ2MzY1IDMuMjYyMjYgNi4wMjk0N0MyLjg4NzA2IDUuNTk1MjkgMi40MDYxMyA1LjI2NTMyIDEuODY2MDIgNS4wNzE1TDEuNjY2MDIgNC45OTk4NEwxLjg2NjAyIDQuOTI4MTdDMi40MDYxMyA0LjczNDM1IDIuODg3MDYgNC40MDQzOSAzLjI2MjI2IDMuOTcwMjFDMy42Mzc0NiAzLjUzNjAzIDMuODk0MjIgMy4wMTIzNCA0LjAwNzY4IDIuNDQ5ODRMNC4xNjYwMiAxLjY2NjVaTTYuNjY2MDIgMTMuMzMzMkw2Ljg1NzY4IDE0LjM5NjVDNi45MDc0NSAxNC42NzM5IDcuMDI2NzQgMTQuOTM0MSA3LjIwNDM5IDE1LjE1MjhDNy4zODIwNCAxNS4zNzE2IDcuNjEyMjYgMTUuNTQxNyA3Ljg3MzUyIDE1LjY0NzNMOC4zMzI2OCAxNS44MzMyTDcuODczNTIgMTYuMDE5QzcuNjEyMjEgMTYuMTI0NCA3LjM4MTg5IDE2LjI5NDQgNy4yMDQwOSAxNi41MTNDNy4wMjYzIDE2LjczMTYgNi45MDY4MyAxNi45OTE3IDYuODU2ODUgMTcuMjY5TDYuNjY2MDIgMTguMzMzMkw2LjQ3NDM1IDE3LjI2OThDNi40MjQ1OCAxNi45OTI1IDYuMzA1MjkgMTYuNzMyMiA2LjEyNzY0IDE2LjUxMzVDNS45NDk5OSAxNi4yOTQ3IDUuNzE5NzggMTYuMTI0NiA1LjQ1ODUyIDE2LjAxOUw0Ljk5OTM1IDE1LjgzMzJMNS40NTg1MiAxNS42NDczQzUuNzE5ODMgMTUuNTQxOSA1Ljk1MDE0IDE1LjM3MiA2LjEyNzk0IDE1LjE1MzRDNi4zMDU3MyAxNC45MzQ4IDYuNDI1MiAxNC42NzQ2IDYuNDc1MTggMTQuMzk3M0w2LjY2NjAyIDEzLjMzMzJaTTEzLjMzMjcgMi40OTk4NEwxMy43OTYgNC43MTE1QzE0LjAzMjIgNS44MzkwNyAxNC41NTY1IDYuODg2MjEgMTUuMzE3OCA3Ljc1MDgxQzE2LjA3OTEgOC42MTU0MSAxNy4wNTE1IDkuMjY3OTYgMTguMTQwMiA5LjY0NDg0TDE5LjE2NiA5Ljk5OTg0TDE4LjE0MDIgMTAuMzU0OEMxNy4wNTE1IDEwLjczMTcgMTYuMDc5MSAxMS4zODQzIDE1LjMxNzggMTIuMjQ4OUMxNC41NTY1IDEzLjExMzUgMTQuMDMyMiAxNC4xNjA2IDEzLjc5NiAxNS4yODgyTDEzLjMzMjcgMTcuNDk5OEwxMi44NjkzIDE1LjI4ODJDMTIuNjMzMiAxNC4xNjA2IDEyLjEwODkgMTMuMTEzNSAxMS4zNDc2IDEyLjI0ODlDMTAuNTg2MiAxMS4zODQzIDkuNjEzODIgMTAuNzMxNyA4LjUyNTE4IDEwLjM1NDhMNy40OTkzNSA5Ljk5OTg0TDguNTI1MTggOS42NDQ4NEM5LjYxMzgyIDkuMjY3OTYgMTAuNTg2MiA4LjYxNTQxIDExLjM0NzYgNy43NTA4MUMxMi4xMDg5IDYuODg2MjEgMTIuNjMzMiA1LjgzOTA3IDEyLjg2OTMgNC43MTE1TDEzLjMzMjcgMi40OTk4NFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8yMjhfNTc3NFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkFJIE91dHB1dDogPC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpc0FwcHJvdmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdhY2NlcHRBaScgfHwgZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnNbMF0/LnVzZXJBY3Rpb24gPT09ICdlZGl0V2l0aEFpJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy1hdXRvXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjguNzQyMjhlLTA3XCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgcng9XCIxMFwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuMjQ2NCA2LjE1ODM5TDguMjc5NjkgMTEuOTE2N0w2LjY5NjM1IDEwLjIyNTFDNi40MDQ2OSA5Ljk1MDA1IDUuOTQ2MzUgOS45MzMzOSA1LjYxMzAyIDEwLjE2NjdDNS4yODgwMiAxMC40MDg0IDUuMTk2MzUgMTAuODMzNCA1LjM5NjM1IDExLjE3NTFMNy4yNzEzNSAxNC4yMjUxQzcuNDU0NjkgMTQuNTA4NCA3Ljc3MTM1IDE0LjY4MzQgOC4xMjk2OSAxNC42ODM0QzguNDcxMzUgMTQuNjgzNCA4Ljc5NjM1IDE0LjUwODQgOC45Nzk2OSAxNC4yMjUxQzkuMjc5NjkgMTMuODMzNCAxNS4wMDQ3IDcuMDA4MzkgMTUuMDA0NyA3LjAwODM5QzE1Ljc1NDcgNi4yNDE3MiAxNC44NDY0IDUuNTY2NzIgMTQuMjQ2NCA2LjE1MDA1TDE0LjI0NjQgNi4xNTgzOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJzaG93QWN0aW9uICYmICFpc0FJUXVpY2tFZGl0XCIgW2NsYXNzLmRpc2FibGVkXT1cImlzUGxhbm9RdWlja0VkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtYXV0byBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJ0b2dnbGVBSVF1aWNrRWRpdCgpXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05IDE1LjAwMDJIMTUuNzVNMTIuMzc1IDIuNjI1MTdDMTIuNjczNCAyLjMyNjggMTMuMDc4IDIuMTU5MTggMTMuNSAyLjE1OTE4QzEzLjcwODkgMi4xNTkxOCAxMy45MTU4IDIuMjAwMzMgMTQuMTA4OCAyLjI4MDI5QzE0LjMwMTkgMi4zNjAyNCAxNC40NzczIDIuNDc3NDMgMTQuNjI1IDIuNjI1MTdDMTQuNzcyNyAyLjc3MjkxIDE0Ljg4OTkgMi45NDgzIDE0Ljk2OTkgMy4xNDEzMkMxNS4wNDk4IDMuMzM0MzUgMTUuMDkxIDMuNTQxMjQgMTUuMDkxIDMuNzUwMTdDMTUuMDkxIDMuOTU5MSAxNS4wNDk4IDQuMTY1OTkgMTQuOTY5OSA0LjM1OTAyQzE0Ljg4OTkgNC41NTIwNCAxNC43NzI3IDQuNzI3NDMgMTQuNjI1IDQuODc1MTdMNS4yNSAxNC4yNTAyTDIuMjUgMTUuMDAwMkwzIDEyLjAwMDJMMTIuMzc1IDIuNjI1MTdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dBY3Rpb24gJiYgaXNBSVF1aWNrRWRpdCAmJiAhaXNQbGFub1F1aWNrRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyIG1zLWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHF1aWNrLWJ0blwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYW5jZWxBSVF1aWNrRWRpdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcXVpY2stYnRuXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblNhdmVBSVF1aWNrRWRpdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFpRml4dHVyZVF1aWNrRGV0YWlsc1wiIGNsYXNzPVwicm93IGctMCBtYi00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaWZmXT1cImhpZ2hsaWdodERpZmZlcmVuY2VzICYmIGl0ZW0uaXNEaWZmZXJlbnRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNvbC02IGxhYmVsXCI+e3sgaXRlbS5sYWJlbCB9fTwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElubGluZSBlZGl0aW5nIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQUlRdWlja0VkaXQgJiYgaXRlbS5lZGl0YWJsZTsgZWxzZSBhaVZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGSVhUVVJFIE5BTUUgKHRleHQpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm1ldGE/LnR5cGUgPT09ICdmaXh0dXJlJzsgZWxzZSBjYXBhY2l0eUlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImNvbC02IHZhbHVlIGVkaXQtaW5wdXQgZm9ybS1jb250cm9sXCIgW25nTW9kZWxdPVwiaXRlbS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblF1aWNrVmFsdWVDaGFuZ2UoaXRlbSwgJGV2ZW50LCAnYWknKVwiIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjE1MFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FQQUNJVFkgKG51bWJlcikgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjYXBhY2l0eUlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJjb2wtNiB2YWx1ZSBlZGl0LWlucHV0IGZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiIHBhdHRlcm49XCJbMC05XSpcIiBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uQ2FwYWNpdHlJbnB1dCgkZXZlbnQsIGl0ZW0sICdhaScpXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3JtYWwgdGV4dCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYWlWYWx1ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNvbC02IHZhbHVlXCI+e3sgaXRlbS52YWx1ZSB8dGl0bGVjYXNlfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgaWQ9XCJmaXh0dXJlLWNvbXBhcmlzb25cIiBjbGFzcz1cInJvdyBnLTAgbXktM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTFcIj5QbGFub2dyYW0gZGVzaWduPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8cD5UZW1wbGF0ZSBkZXNpZ25lZCBieSB0aGUgcGxhbm9ncmFtIHRlYW08L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxsaWItZml4dHVyZSBbZml4dHVyZV09XCJwbGFub0ZpeHR1cmVcIj48L2xpYi1maXh0dXJlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBwLTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMVwiPlN0b3JlIHJlc3BvbnNlPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8cD5QbGFub2dyYW0gcmVzcG9uc2UgYnkgdGhlIHN0b3JlIHRlYW08L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIEBpZihjZG4gJiYgYWlGaXh0dXJlPy5maXh0dXJlSW1hZ2Upe1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXh0dXJlLWltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjZG4gKyBhaUZpeHR1cmU/LmZpeHR1cmVJbWFnZVwiIGFsdD1cIlN0b3JlIHJlc3BvbnNlIGltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBteS03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxODZcIiBoZWlnaHQ9XCI4NFwiIHZpZXdCb3g9XCIwIDAgMTg2IDg0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzMC4yNTYgMTUuMzI4NEMxNDAuMDkyIDE1LjMyODQgMTQ4LjA2NSAyMy4zMDIgMTQ4LjA2NSAzMy4xMzc5QzE0OC4wNjUgMzcuMjE3NiAxNTAuODI2IDQxLjg2ODQgMTU0LjkwNiA0MS44Njg0SDE2Ny45NzJDMTc3LjgwNyA0MS44Njg3IDE4NS43ODEgNDkuODQyMiAxODUuNzgxIDU5LjY3OEMxODUuNzgxIDY5LjUxNDEgMTc3LjgwNyA3Ny40ODg1IDE2Ny45NzEgNzcuNDg4NUg4MS4zNjYyQzY5LjcxODYgNzcuNDg4MyA1OC42MzQ5IDY4LjQwODQgNDYuOTg3MyA2OC40MDg0SDUuOTM2NTJDMi42NTc4MiA2OC40MDg0IDAgNjUuNzUwNiAwIDYyLjQ3MTlDMC4wMDAxMjc4MjMgNTkuMTkzMyAyLjY1NzkgNTYuNTM1NCA1LjkzNjUyIDU2LjUzNTRINjEuODcyOEM2My4wMDY5IDU2LjUzNTQgNjMuOTY2OSA1NS42OTI5IDY0LjI4OTcgNTQuNjA1NkM2NC43OTk0IDUyLjg4OTIgNjMuNjI2NyA1MC45NDg1IDYxLjgzNjEgNTAuOTQ4NUg0My42NTE0QzMzLjgxNTMgNTAuOTQ4NSAyNS44NDE4IDQyLjk3NCAyNS44NDE4IDMzLjEzNzlDMjUuODQyIDIzLjMwMiAzMy44MTU0IDE1LjMyODQgNDMuNjUxNCAxNS4zMjg0SDEzMC4yNTZaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0VBRUNGMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTI2LjY2NCAyNy4zMzVWNDguNjVMMTIwLjk1OSA0My43NUMxMTguMjI5IDQxLjQwNSAxMTMuODE5IDQxLjQwNSAxMTEuMDg5IDQzLjc1TDk2LjUyOTEgNTYuMjQ1QzkzLjc5OTEgNTguNTkgODkuMzg5MSA1OC41OSA4Ni42NTkxIDU2LjI0NUw4NS40NjkxIDU1LjI2NUM4Mi45ODQxIDUzLjA5NSA3OS4wMjkxIDUyLjg4NSA3Ni4yMjkxIDU0Ljc3NUw1OS4wMDkxIDY2LjMyNUw1OC42MjQxIDY2LjYwNUM1Ny4zMjkxIDYzLjgwNSA1Ni42NjQxIDYwLjQ4IDU2LjY2NDEgNTYuNjY1VjI3LjMzNUM1Ni42NjQxIDE0LjU5NSA2NC4yNTkxIDcgNzYuOTk5MSA3SDEwNi4zMjlDMTE5LjA2OSA3IDEyNi42NjQgMTQuNTk1IDEyNi42NjQgMjcuMzM1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM2QkNBRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTgxLjE2NCAzNi4zMjk5Qzg1Ljc2NDUgMzYuMzI5OSA4OS40OTQgMzIuNjAwNSA4OS40OTQgMjcuOTk5OUM4OS40OTQgMjMuMzk5NCA4NS43NjQ1IDE5LjY2OTkgODEuMTY0IDE5LjY2OTlDNzYuNTYzNSAxOS42Njk5IDcyLjgzNCAyMy4zOTk0IDcyLjgzNCAyNy45OTk5QzcyLjgzNCAzMi42MDA1IDc2LjU2MzUgMzYuMzI5OSA4MS4xNjQgMzYuMzI5OVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDBBM0ZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMjYuNjY1IDQ4LjY1VjU2LjY2NUMxMjYuNjY1IDY5LjQwNSAxMTkuMDcgNzcgMTA2LjMzIDc3SDc3QzY4LjA3NSA3NyA2MS42MzUgNzMuMjU1IDU4LjYyNSA2Ni42MDVMNTkuMDEgNjYuMzI1TDc2LjIzIDU0Ljc3NUM3OS4wMyA1Mi44ODUgODIuOTg1IDUzLjA5NSA4NS40NyA1NS4yNjVMODYuNjYgNTYuMjQ1Qzg5LjM5IDU4LjU5IDkzLjggNTguNTkgOTYuNTMgNTYuMjQ1TDExMS4wOSA0My43NUMxMTMuODIgNDEuNDA1IDExOC4yMyA0MS40MDUgMTIwLjk2IDQzLjc1TDEyNi42NjUgNDguNjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTM4LjA2NFwiIGN5PVwiMjguMzEyOFwiIHI9XCI0LjQwMDQyXCIgZmlsbD1cIiM2QkNBRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjQ3LjgyNTZcIiBjeT1cIjM5LjI0MDlcIiByPVwiMi40NTI1NVwiIGZpbGw9XCIjNkJDQUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIGN4PVwiMTM5LjE4M1wiIGN5PVwiNjEuMDA3MlwiIHJ4PVwiNC4yOTE5N1wiIHJ5PVwiNC41OTg1NFwiIGZpbGw9XCIjMDBBM0ZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxocj5cclxuXHJcbiAgICAgICAgPGRpdiBpZD1cInZtLWNvbXBhcmlzb25cIiAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5maXh0dXJlQUlEYXRhPy52bUNvbmZpZy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMVwiPlZpc3VhbCBNZXJjaGFuZGlzZSBJbWFnZXMgZnJvbSBBSSBvdXRwdXQ6PC9oNT5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0wXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgQGZvciAodm0gb2YgZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmZpeHR1cmVBSURhdGE/LnZtQ29uZmlnOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2bS1jb250YWluZXJcIiAoY2xpY2spPVwib25DbGlja1ZNSW1hZ2VQcmV2aWV3KGNkbit2bT8udm1JbWFnZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2bS1pbWdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiY2RuK3ZtPy52bUltYWdlXCIgYWx0PVwiVk0gSW1hZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMiB2bS1kZXRhaWxzIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT57e3ZtPy52bVR5cGV9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1Pnt7dm0/LnZtTmFtZX19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLXByZXZpZXdcIiAqbmdJZj1cInNlbGVjdGVkQWlWbUltYWdlRm9yUHJldmlld1wiIChjbGljayk9XCJjbG9zZVZNSW1hZ2VQcmV2aWV3KClcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJzZWxlY3RlZEFpVm1JbWFnZUZvclByZXZpZXdcIiBjbGFzcz1cImZ1bGwtaW1nXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9QGVsc2Uge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS02XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI5NFwiIGhlaWdodD1cIjk0XCIgdmlld0JveD1cIjAgMCA5NCA5NFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjdcIiB5PVwiN1wiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIHJ4PVwiNDBcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjdcIiB5PVwiN1wiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIHJ4PVwiNDBcIiBzdHJva2U9XCIjRUFGOEZGXCIgc3Ryb2tlLXdpZHRoPVwiMTMuMzMzM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zNS45NTAyIDQ4LjE5OTdDMzUuNjQ4OSA0OC4yMzE1IDM1LjM0MjIgNDguMjUwNSAzNS4wMzEyIDQ4LjI1MDVDMzQuODYxNyA0OC4yNTA1IDM0LjY5NDQgNDguMjQzNiAzNC41MjkzIDQ4LjIzMzlWNTguNjA2OUMzNC41MjkzIDYwLjAzNDkgMzUuNzEyMyA2MS4yMjYgMzcuMjAwMiA2MS4yMjYxSDU2LjgwNDdDNTguMjkyNyA2MS4yMjYxIDU5LjQ3NTYgNjAuMDM1IDU5LjQ3NTYgNTguNjA2OVY0OC4yMzQ5QzU5LjMxMzcgNDguMjQ0MSA1OS4xNDk4IDQ4LjI1MDUgNTguOTg1NCA0OC4yNTA1QzU4LjY3MTQgNDguMjUwNSA1OC4zNjA4IDQ4LjIzMjUgNTguMDU0NyA0OC4xOTk3VjU1Ljk4NzhIMzUuOTUwMlY0OC4xOTk3Wk01Ny45MzE2IDMyLjc3MzlIMzYuMDczMkMzNS44OTU5IDMyLjc3MzkgMzUuNzQwNiAzMi44NjY3IDM1LjY2MzEgMzIuOTg3OEwzNS42NjExIDMyLjk4OTdMMzIuMTUxNCAzOC40NzMxTDMyLjA1NjYgMzguNjIwNkMzMC44MzExIDQwLjc0MDQgMzIuMDk1NyA0My40Njc0IDM0LjQ0NzMgNDMuNzc2OUMzNC42NDgyIDQzLjgwMTMgMzQuODM3OSA0My44MTU5IDM1LjAyNTQgNDMuODE1OUMzNi4yNTU1IDQzLjgxNTkgMzcuMzQzNCA0My4yODcyIDM4LjEwMDYgNDIuNDY1M0wzOS4wMjI1IDQxLjQ2NDRMMzkuOTQxNCA0Mi40NjgzQzQwLjY5MDMgNDMuMjg2MyA0MS43NzcgNDMuODE1OSA0My4wMTQ2IDQzLjgxNTlDNDQuMjQ2NyA0My44MTU4IDQ1LjMzODYgNDMuMjg1NiA0Ni4wODY5IDQyLjQ2ODNMNDcuMDA4OCA0MS40NjE0TDQ3LjkzMDcgNDIuNDY4M0M0OC42NzkgNDMuMjg1NyA0OS43NzA3IDQzLjgxNTkgNTEuMDAyOSA0My44MTU5QzUyLjIzNTEgNDMuODE1OSA1My4zMjY4IDQzLjI4NTcgNTQuMDc1MiA0Mi40NjgzTDU0Ljk5NzEgNDEuNDYxNEw1NS45MTg5IDQyLjQ2ODNDNTYuNjY3MyA0My4yODU3IDU3Ljc2IDQzLjgxNTkgNTguOTkyMiA0My44MTU5QzU5LjE3MzYgNDMuODE1OSA1OS4zNjg3IDQzLjgwMjEgNTkuNTY4NCA0My43Nzc4SDU5LjU2NzRDNjEuOTYxMSA0My40NTczIDYzLjIyOTMgNDAuNjA3OCA2MS44NjEzIDM4LjQ3MzFMNjEuODYwNCAzOC40NzQxTDU4LjM0MzggMzIuOTkwN0w1OC4zNDI4IDMyLjk4NzhDNTguMjY1MyAzMi44NjY1IDU4LjEwOTIgMzIuNzczOSA1Ny45MzE2IDMyLjc3MzlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwOUJGM1wiIHN0cm9rZS13aWR0aD1cIjIuNVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctYm9sZCBoMyBtdC0yXCI+Tm8gcmVzcG9uc2U8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+Tm8gQUkgcmVzcG9uc2UgZm91bmQgZm9yIHRoaXMgZml4dHVyZS48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSA8aHIgY2xhc3M9XCJtYi02XCI+IC0tPlxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBAaWYgKGZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzPy5bMF0/LmNvbW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgIDxkaXYgaWQ9XCJmaXh0dXJlLWNvbW1lbnRzXCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTJcIj5Db21tZW50czwvaDU+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjIG9mIGZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzWzBdPy5jb21tZW50cztsZXQgaT0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gVXNlciBhdmF0YXIgLS0+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHZpZXdCb3g9XCIwIDAgMzIgMzJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgZmlsbD1cIiNFQUY4RkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjIuNjY3MyAyMy41VjIxLjgzMzNDMjIuNjY3MyAyMC45NDkzIDIyLjMxNjEgMjAuMTAxNCAyMS42OTEgMTkuNDc2M0MyMS4wNjU5IDE4Ljg1MTIgMjAuMjE4IDE4LjUgMTkuMzM0IDE4LjVIMTIuNjY3M0MxMS43ODMzIDE4LjUgMTAuOTM1NCAxOC44NTEyIDEwLjMxMDMgMTkuNDc2M0M5LjY4NTE3IDIwLjEwMTQgOS4zMzM5OCAyMC45NDkzIDkuMzMzOTggMjEuODMzM1YyMy41TTE5LjMzNCAxMS44MzMzQzE5LjMzNCAxMy42NzQzIDE3Ljg0MTYgMTUuMTY2NyAxNi4wMDA3IDE1LjE2NjdDMTQuMTU5NyAxNS4xNjY3IDEyLjY2NzMgMTMuNjc0MyAxMi42NjczIDExLjgzMzNDMTIuNjY3MyA5Ljk5MjM4IDE0LjE1OTcgOC41IDE2LjAwMDcgOC41QzE3Ljg0MTYgOC41IDE5LjMzNCA5Ljk5MjM4IDE5LjMzNCAxMS44MzMzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQ+e3tjPy51c2VyTmFtZX19PC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3tjPy50aW1lU3RhbXAgfCBkYXRlOidoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihjPy5yZXNwb25zZXR5cGUgPT09ICdjb21tZW50Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNT57e2M/LmNvbW1lbnR9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgfUBlbHNlIGlmKGM/LnJlc3BvbnNldHlwZSA9PT0gJ2FncmVlJyl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy51c2VyQWN0aW9uID09PSAna2VlcFBsYW5vJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2VkIGFzIFwiS2VlcCBQbGFub1wiLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJmZWVkYmFja0RldGFpbHM/LmZpeHR1cmVGZWVkYmFjaz8uYW5zd2Vycz8uWzBdPy51c2VyQWN0aW9uID09PSAnZWRpdFdpdGhQbGFubydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlZCBhcyBcIktlZXAgUGxhbm8gd2l0aCBNb2RpZmljYXRpb25cIi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1ICpuZ0lmPVwiZmVlZGJhY2tEZXRhaWxzPy5maXh0dXJlRmVlZGJhY2s/LmFuc3dlcnM/LlswXT8udXNlckFjdGlvbiA9PT0gJ2FjY2VwdEFpJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2VkIGFzIFwiQWNjZXB0IEFJXCIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSAqbmdJZj1cImZlZWRiYWNrRGV0YWlscz8uZml4dHVyZUZlZWRiYWNrPy5hbnN3ZXJzPy5bMF0/LnVzZXJBY3Rpb24gPT09ICdlZGl0V2l0aEFpJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2VkIGFzIFwiQWNjZXB0IEFJIHdpdGggTW9kaWZpY2F0aW9uXCIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSAqbmdJZj1cImM/LmNvbW1lbnRcIj5Ob3RlOiB7e2MuY29tbWVudH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICB9QGVsc2UgaWYoYz8ucmVzcG9uc2V0eXBlID09PSAnZGlzYWdyZWUnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2VkIGFzIFwiUmVkb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSAqbmdJZj1cImM/LmNvbW1lbnRcIj5Ob3RlOiB7e2MuY29tbWVudH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbjwvc2VjdGlvbj4iXX0=
|