@cqa-lib/cqa-ui 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/esm2020/lib/assets/images/image-assets.constants.mjs +3 -1
  2. package/esm2020/lib/button/button.component.mjs +74 -8
  3. package/esm2020/lib/column-visibility/column-visibility.component.mjs +1 -1
  4. package/esm2020/lib/compare-runs/compare-runs.component.mjs +451 -0
  5. package/esm2020/lib/configuration-card/configuration-card.component.mjs +26 -45
  6. package/esm2020/lib/dashboards/coverage-module-card/coverage-module-card.component.mjs +1 -1
  7. package/esm2020/lib/dashboards/dashboard-header/dashboard-header.component.mjs +1 -1
  8. package/esm2020/lib/dashboards/insight-card/insight-card.component.mjs +1 -1
  9. package/esm2020/lib/dialog/dialog.component.mjs +1 -1
  10. package/esm2020/lib/empty-state/empty-state.component.mjs +1 -1
  11. package/esm2020/lib/filters/dynamic-filter/dynamic-filter.component.mjs +1 -1
  12. package/esm2020/lib/run-history-card/run-history-card.component.mjs +44 -24
  13. package/esm2020/lib/simulator/simulator.component.mjs +3 -3
  14. package/esm2020/lib/templates/table-template.component.mjs +8 -3
  15. package/esm2020/lib/ui-kit.module.mjs +10 -5
  16. package/esm2020/public-api.mjs +2 -1
  17. package/fesm2015/cqa-lib-cqa-ui.mjs +605 -89
  18. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  19. package/fesm2020/cqa-lib-cqa-ui.mjs +608 -89
  20. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  21. package/lib/assets/images/image-assets.constants.d.ts +1 -0
  22. package/lib/button/button.component.d.ts +9 -1
  23. package/lib/compare-runs/compare-runs.component.d.ts +144 -0
  24. package/lib/configuration-card/configuration-card.component.d.ts +3 -10
  25. package/lib/run-history-card/run-history-card.component.d.ts +4 -13
  26. package/lib/templates/table-template.component.d.ts +2 -1
  27. package/lib/ui-kit.module.d.ts +17 -16
  28. package/package.json +1 -1
  29. package/public-api.d.ts +1 -0
  30. package/src/lib/assets/images/CompareRunsIcon.png +0 -0
  31. package/src/lib/assets/images/image-assets.constants.ts +3 -0
  32. package/styles.css +1 -1
@@ -0,0 +1,451 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { EMPTY_STATE_IMAGES } from '../assets/images/image-assets.constants';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/forms";
5
+ import * as i2 from "../dynamic-select/dynamic-select-field.component";
6
+ import * as i3 from "../button/button.component";
7
+ import * as i4 from "@angular/material/icon";
8
+ import * as i5 from "../templates/table-template.component";
9
+ import * as i6 from "@angular/common";
10
+ export class CompareRunsComponent {
11
+ constructor(fb, cdr) {
12
+ this.fb = fb;
13
+ this.cdr = cdr;
14
+ this.runs = [];
15
+ this.isLoadingRuns = false;
16
+ this.hasMoreRuns = false;
17
+ this.isComparingRuns = false;
18
+ this.isTableDataLoading = false;
19
+ this.searchRuns = new EventEmitter();
20
+ this.loadMoreRuns = new EventEmitter();
21
+ this.compareRuns = new EventEmitter();
22
+ this.stepComparisons = [];
23
+ this.tableColumns = [];
24
+ this.pageIndex = 0;
25
+ this.pageSize = 10;
26
+ this.emptyStateConfig = {
27
+ title: 'No Comparison Data',
28
+ description: 'Select two runs to compare and see detailed step-by-step comparison results.',
29
+ imageUrl: EMPTY_STATE_IMAGES.COMPARE_RUNS,
30
+ actions: []
31
+ };
32
+ }
33
+ ngOnInit() {
34
+ this.initializeForm();
35
+ this.setupSelectConfigs();
36
+ this.setupTableColumns();
37
+ }
38
+ ngOnChanges(changes) {
39
+ if (changes['runs'] && !changes['runs'].firstChange) {
40
+ this.setupSelectConfigs();
41
+ this.cdr.markForCheck();
42
+ }
43
+ if (changes['comparisonData'] && this.comparisonData) {
44
+ this.handleComparisonData();
45
+ }
46
+ if (changes['isLoadingRuns']) {
47
+ this.updateSelectConfigsLoading();
48
+ this.cdr.markForCheck();
49
+ }
50
+ }
51
+ initializeForm() {
52
+ this.form = this.fb.group({
53
+ runA: [null],
54
+ runB: [null]
55
+ });
56
+ this.form.valueChanges.subscribe(() => {
57
+ this.updateSelectedRuns();
58
+ });
59
+ }
60
+ setupSelectConfigs() {
61
+ const runAId = this.form?.get('runA')?.value;
62
+ const runBId = this.form?.get('runB')?.value;
63
+ const allOptions = this.runs.map(run => ({
64
+ id: run.id,
65
+ value: run.id,
66
+ label: this.formatRunLabel(run),
67
+ name: this.formatRunLabel(run)
68
+ }));
69
+ const runAOptions = allOptions.filter(opt => opt.id !== runBId);
70
+ const runBOptions = allOptions.filter(opt => opt.id !== runAId);
71
+ this.runASelectConfig = {
72
+ key: 'runA',
73
+ label: '',
74
+ placeholder: 'Search and select run',
75
+ options: runAOptions,
76
+ searchable: true,
77
+ serverSearch: true,
78
+ hasMore: this.hasMoreRuns,
79
+ isLoading: this.isLoadingRuns,
80
+ onSearch: (query) => this.handleSearchRuns(query, 'runA'),
81
+ onLoadMore: (query) => this.handleLoadMoreRuns(query || '')
82
+ };
83
+ this.runBSelectConfig = {
84
+ key: 'runB',
85
+ label: '',
86
+ placeholder: 'Search and select run',
87
+ options: runBOptions,
88
+ searchable: true,
89
+ serverSearch: true,
90
+ hasMore: this.hasMoreRuns,
91
+ isLoading: this.isLoadingRuns,
92
+ onSearch: (query) => this.handleSearchRuns(query, 'runB'),
93
+ onLoadMore: (query) => this.handleLoadMoreRuns(query || '')
94
+ };
95
+ }
96
+ formatRunLabel(run) {
97
+ const date = new Date(run.startTime);
98
+ const formattedDate = date.toLocaleString('en-US', {
99
+ month: 'short',
100
+ day: 'numeric',
101
+ hour: '2-digit',
102
+ minute: '2-digit',
103
+ second: '2-digit'
104
+ });
105
+ return `Run #${run.id} • ${formattedDate}`;
106
+ }
107
+ updateSelectConfigsLoading() {
108
+ if (this.runASelectConfig) {
109
+ this.runASelectConfig = {
110
+ ...this.runASelectConfig,
111
+ isLoading: this.isLoadingRuns,
112
+ hasMore: this.hasMoreRuns
113
+ };
114
+ }
115
+ if (this.runBSelectConfig) {
116
+ this.runBSelectConfig = {
117
+ ...this.runBSelectConfig,
118
+ isLoading: this.isLoadingRuns,
119
+ hasMore: this.hasMoreRuns
120
+ };
121
+ }
122
+ }
123
+ handleSearchRuns(query, key) {
124
+ this.searchRuns.emit({ key, query });
125
+ }
126
+ handleLoadMoreRuns(query) {
127
+ this.loadMoreRuns.emit(query);
128
+ }
129
+ onSearchChange(event) {
130
+ console.log('onSearchChange', event);
131
+ this.searchRuns.emit(event);
132
+ }
133
+ onLoadMore(event) {
134
+ this.loadMoreRuns.emit(event.query);
135
+ }
136
+ updateSelectedRuns() {
137
+ const runAId = this.form.get('runA')?.value;
138
+ const runBId = this.form.get('runB')?.value;
139
+ const runA = this.runs.find(r => r.id === runAId);
140
+ const runB = this.runs.find(r => r.id === runBId);
141
+ this.selectedRunA = runA ? this.convertToRunData(runA) : undefined;
142
+ this.selectedRunB = runB ? this.convertToRunData(runB) : undefined;
143
+ this.setupSelectConfigs();
144
+ this.cdr.markForCheck();
145
+ }
146
+ convertToRunData(data) {
147
+ const device = data.testDeviceResult?.testDeviceSettings?.deviceName ||
148
+ data.testDeviceResult?.testDeviceSettings?.platform ||
149
+ 'Unknown Device';
150
+ const browser = data.testDeviceResult?.testDeviceSettings?.browser || 'Unknown Browser';
151
+ const platform = data.testDeviceResult?.testDeviceSettings?.platform || 'Unknown Platform';
152
+ return {
153
+ id: data.id,
154
+ label: this.formatRunLabel(data),
155
+ result: data.result,
156
+ startTime: data.startTime,
157
+ duration: data.duration,
158
+ testDataSetName: data.testDataSetName,
159
+ device,
160
+ browser,
161
+ platform
162
+ };
163
+ }
164
+ setupTableColumns() {
165
+ this.tableColumns = [
166
+ {
167
+ fieldId: 'step',
168
+ fieldName: 'Step',
169
+ fieldValue: 'stepTitle',
170
+ isShow: true,
171
+ weight: 3,
172
+ render: (row) => {
173
+ return `
174
+ <div class="cqa-flex cqa-items-center cqa-gap-2">
175
+ <span class="cqa-text-xs cqa-text-[#0B0B0B]">${row.stepTitle}</span>
176
+ </div>
177
+ `;
178
+ }
179
+ },
180
+ {
181
+ fieldId: 'runA',
182
+ fieldName: 'Run A',
183
+ isShow: true,
184
+ weight: 1.5,
185
+ render: (row) => {
186
+ if (row.runAStatus !== 'PASSED' && row.runAStatus !== 'FAILED') {
187
+ return '<span class="cqa-text-xs cqa-text-[#9CA3AF]">—</span>';
188
+ }
189
+ return `
190
+ <div class="cqa-flex cqa-flex-col cqa-gap-1">
191
+ ${this.renderStatusIcon(row.runAStatus)}
192
+ <span class="cqa-text-[10px] cqa-text-[#6B7280]">${this.formatDuration(row.runADuration || 0)}</span>
193
+ </div>
194
+ `;
195
+ }
196
+ },
197
+ {
198
+ fieldId: 'runB',
199
+ fieldName: 'Run B',
200
+ isShow: true,
201
+ weight: 1.5,
202
+ render: (row) => {
203
+ if (row.runBStatus !== 'PASSED' && row.runBStatus !== 'FAILED') {
204
+ return '<span class="cqa-text-xs cqa-text-[#636363]"> — </span>';
205
+ }
206
+ return `
207
+ <div class="cqa-flex cqa-flex-col cqa-gap-0.5">
208
+ ${this.renderStatusIcon(row.runBStatus)}
209
+ <span class="cqa-text-[10px] cqa-text-[#636363]">${this.formatDuration(row.runBDuration || 0)}</span>
210
+ </div>
211
+ `;
212
+ }
213
+ },
214
+ {
215
+ fieldId: 'change',
216
+ fieldName: 'Change',
217
+ fieldValue: 'change',
218
+ isShow: true,
219
+ weight: 1.5,
220
+ render: (row) => {
221
+ const changeLabels = {
222
+ 'UNCHANGED': 'Unchanged',
223
+ 'STATUS_CHANGED': 'Status Changed',
224
+ 'TIMING_CHANGED': 'Timing Changed',
225
+ 'ADDED': 'Added',
226
+ 'REMOVED': 'Removed'
227
+ };
228
+ const changeColors = {
229
+ 'UNCHANGED': '#6B7280',
230
+ 'STATUS_CHANGED': '#F59E0B',
231
+ 'TIMING_CHANGED': '#3B82F6',
232
+ 'ADDED': '#10B981',
233
+ 'REMOVED': '#EF4444'
234
+ };
235
+ const changeBgColors = {
236
+ 'UNCHANGED': '#F3F4F6',
237
+ 'STATUS_CHANGED': '#FEF3C7',
238
+ 'TIMING_CHANGED': '#DBEAFE',
239
+ 'ADDED': '#D1FAE5',
240
+ 'REMOVED': '#FEE2E2'
241
+ };
242
+ const label = changeLabels[row.change] || row.change;
243
+ const color = changeColors[row.change] || '#6B7280';
244
+ const bgColor = changeBgColors[row.change] || '#F3F4F6';
245
+ return `
246
+ <span class="cqa-inline-flex cqa-items-center cqa-justify-center cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-text-[10px] cqa-font-semibold cqa-w-max"
247
+ style="background-color: ${bgColor}; color: ${color};">
248
+ ${label}
249
+ </span>
250
+ `;
251
+ }
252
+ }
253
+ ];
254
+ }
255
+ renderStatusIcon(status) {
256
+ const upperStatus = status.toUpperCase();
257
+ if (upperStatus === 'PASSED') {
258
+ return `
259
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
260
+ <path d="M7.99998 14.6663C11.6819 14.6663 14.6666 11.6816 14.6666 7.99967C14.6666 4.31778 11.6819 1.33301 7.99998 1.33301C4.31808 1.33301 1.33331 4.31778 1.33331 7.99967C1.33331 11.6816 4.31808 14.6663 7.99998 14.6663Z" stroke="#00C950" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
261
+ <path d="M6 8.00033L7.33333 9.33366L10 6.66699" stroke="#00C950" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
262
+ </svg>`;
263
+ }
264
+ else if (upperStatus === 'FAILED') {
265
+ return `
266
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
267
+ <path d="M8.00004 14.6673C11.6819 14.6673 14.6667 11.6825 14.6667 8.00065C14.6667 4.31875 11.6819 1.33398 8.00004 1.33398C4.31814 1.33398 1.33337 4.31875 1.33337 8.00065C1.33337 11.6825 4.31814 14.6673 8.00004 14.6673Z" stroke="#FB2C36" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
268
+ <path d="M10 6L6 10" stroke="#FB2C36" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
269
+ <path d="M6 6L10 10" stroke="#FB2C36" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
270
+ </svg>`;
271
+ }
272
+ else if (upperStatus === 'NOT_EXECUTED') {
273
+ return `
274
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
275
+ <path d="M8.00004 14.6673C11.6819 14.6673 14.6667 11.6825 14.6667 8.00065C14.6667 4.31875 11.6819 1.33398 8.00004 1.33398C4.31814 1.33398 1.33337 4.31875 1.33337 8.00065C1.33337 11.6825 4.31814 14.6673 8.00004 14.6673Z" stroke="#9CA3AF" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
276
+ <path d="M6 8H10" stroke="#9CA3AF" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
277
+ </svg>`;
278
+ }
279
+ else {
280
+ return `<span class="cqa-text-xs cqa-text-[#636363]"> — </span>`;
281
+ }
282
+ }
283
+ formatDuration(milliseconds) {
284
+ const seconds = milliseconds / 1000;
285
+ if (seconds < 60) {
286
+ return `${seconds.toFixed(1)}s`;
287
+ }
288
+ const minutes = Math.floor(seconds / 60);
289
+ const remainingSeconds = Math.floor(seconds % 60);
290
+ return `${minutes}m ${remainingSeconds}s`;
291
+ }
292
+ handleComparisonData() {
293
+ if (!this.comparisonData)
294
+ return;
295
+ this.comparisonSummary = this.comparisonData.summary;
296
+ this.stepComparisons = this.comparisonData.stepsComparison;
297
+ this.pageIndex = 0;
298
+ this.cdr.markForCheck();
299
+ }
300
+ onPageChange(event) {
301
+ this.pageIndex = event.pageIndex;
302
+ this.pageSize = event.pageSize;
303
+ this.cdr.markForCheck();
304
+ }
305
+ get isEmptyState() {
306
+ return !this.showComparison || !this.stepComparisons || this.stepComparisons.length === 0;
307
+ }
308
+ onCompareClick() {
309
+ const runAId = this.form.get('runA')?.value;
310
+ const runBId = this.form.get('runB')?.value;
311
+ if (runAId && runBId && !this.isComparingRuns) {
312
+ this.compareRuns.emit({
313
+ runAId,
314
+ runBId
315
+ });
316
+ }
317
+ }
318
+ get canCompare() {
319
+ const runAId = this.form.get('runA')?.value;
320
+ const runBId = this.form.get('runB')?.value;
321
+ return !!(runAId && runBId && !this.isComparingRuns);
322
+ }
323
+ get runAStatusColor() {
324
+ if (!this.selectedRunA)
325
+ return '#6B7280';
326
+ const colors = {
327
+ 'SUCCESS': '#0B9D68',
328
+ 'FAILURE': '#FB2C36',
329
+ 'ABORTED': '#F59E0B',
330
+ 'IN_PROGRESS': '#3B82F6'
331
+ };
332
+ return colors[this.selectedRunA.result] || '#6B7280';
333
+ }
334
+ get runBStatusColor() {
335
+ if (!this.selectedRunB)
336
+ return '#6B7280';
337
+ const colors = {
338
+ 'SUCCESS': '#0B9D68',
339
+ 'FAILURE': '#FB2C36',
340
+ 'ABORTED': '#F59E0B',
341
+ 'IN_PROGRESS': '#3B82F6'
342
+ };
343
+ return colors[this.selectedRunB.result] || '#6B7280';
344
+ }
345
+ get runAStatusBorderColor() {
346
+ if (!this.selectedRunA)
347
+ return '#F3F4F6';
348
+ const colors = {
349
+ 'SUCCESS': '#CFF2E5',
350
+ 'FAILURE': '#FCD9D9',
351
+ 'ABORTED': '#FEF3C7',
352
+ 'IN_PROGRESS': '#DBEAFE'
353
+ };
354
+ return colors[this.selectedRunA.result] || '#F3F4F6';
355
+ }
356
+ get runBStatusBorderColor() {
357
+ if (!this.selectedRunB)
358
+ return '#F3F4F6';
359
+ const colors = {
360
+ 'SUCCESS': '#CFF2E5',
361
+ 'FAILURE': '#FCD9D9',
362
+ 'ABORTED': '#FEF3C7',
363
+ 'IN_PROGRESS': '#DBEAFE'
364
+ };
365
+ return colors[this.selectedRunB.result] || '#F3F4F6';
366
+ }
367
+ get runAStatusBgColor() {
368
+ if (!this.selectedRunA)
369
+ return '#F3F4F6';
370
+ const colors = {
371
+ 'SUCCESS': '#0DBD7D1A',
372
+ 'FAILURE': '#EE3F3F1A',
373
+ 'ABORTED': '#FEF3C7',
374
+ 'IN_PROGRESS': '#DBEAFE'
375
+ };
376
+ return colors[this.selectedRunA.result] || '#F3F4F6';
377
+ }
378
+ get runBStatusBgColor() {
379
+ if (!this.selectedRunB)
380
+ return '#F3F4F6';
381
+ const colors = {
382
+ 'SUCCESS': '#0DBD7D1A',
383
+ 'FAILURE': '#EE3F3F1A',
384
+ 'ABORTED': '#FEF3C7',
385
+ 'IN_PROGRESS': '#DBEAFE'
386
+ };
387
+ return colors[this.selectedRunB.result] || '#F3F4F6';
388
+ }
389
+ formatTime(timestamp) {
390
+ const date = new Date(timestamp);
391
+ return date.toLocaleString('en-US', {
392
+ month: 'short',
393
+ day: 'numeric',
394
+ hour: '2-digit',
395
+ minute: '2-digit'
396
+ });
397
+ }
398
+ formatDurationString(milliseconds) {
399
+ return this.formatDuration(milliseconds);
400
+ }
401
+ get showComparison() {
402
+ return !!(this.comparisonData && this.comparisonSummary);
403
+ }
404
+ get runAStatusLabel() {
405
+ if (!this.selectedRunA)
406
+ return '';
407
+ const labels = {
408
+ 'SUCCESS': 'Passed',
409
+ 'FAILURE': 'Failed',
410
+ 'ABORTED': 'Aborted',
411
+ 'IN_PROGRESS': 'In Progress'
412
+ };
413
+ return labels[this.selectedRunA.result] || this.selectedRunA.result;
414
+ }
415
+ get runBStatusLabel() {
416
+ if (!this.selectedRunB)
417
+ return '';
418
+ const labels = {
419
+ 'SUCCESS': 'Passed',
420
+ 'FAILURE': 'Failed',
421
+ 'ABORTED': 'Aborted',
422
+ 'IN_PROGRESS': 'In Progress'
423
+ };
424
+ return labels[this.selectedRunB.result] || this.selectedRunB.result;
425
+ }
426
+ }
427
+ CompareRunsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CompareRunsComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
428
+ CompareRunsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: CompareRunsComponent, selector: "cqa-compare-runs", inputs: { runs: "runs", comparisonData: "comparisonData", isLoadingRuns: "isLoadingRuns", hasMoreRuns: "hasMoreRuns", isComparingRuns: "isComparingRuns", isTableDataLoading: "isTableDataLoading" }, outputs: { searchRuns: "searchRuns", loadMoreRuns: "loadMoreRuns", compareRuns: "compareRuns" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%;\">\n <div class=\"cqa-flex cqa-flex-col\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 sm:cqa-gap-4 cqa-px-3 sm:cqa-px-4 cqa-py-4 sm:cqa-py-6\" style=\"border-bottom: 1px solid #E4E4E4\">\n <div class=\"cqa-grid cqa-grid-cols-1 md:cqa-grid-cols-2 cqa-gap-4 md:cqa-gap-16\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#636363]\">Run A (Base)</span>\n <cqa-dynamic-select \n [form]=\"form\" \n [config]=\"runASelectConfig\"\n (searchChange)=\"onSearchChange($event)\"\n (loadMore)=\"onLoadMore($event)\">\n </cqa-dynamic-select>\n </div>\n \n <div class=\"cqa-hidden md:cqa-flex cqa-items-center cqa-justify-center\" style=\"position: absolute; left: 50%; transform: translateX(-50%); top: 70px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M4.16669 10H15.8334\" stroke=\"#636363\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M10 4.16699L15.8333 10.0003L10 15.8337\" stroke=\"#636363\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n \n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#636363]\">Run B (Compare)</span>\n <cqa-dynamic-select \n [form]=\"form\" \n [config]=\"runBSelectConfig\"\n (searchChange)=\"onSearchChange($event)\"\n (loadMore)=\"onLoadMore($event)\">\n </cqa-dynamic-select>\n </div>\n </div>\n \n <ng-container *ngIf=\"showComparison\">\n <div class=\"cqa-grid cqa-grid-cols-1 md:cqa-grid-cols-2 cqa-gap-4\">\n <div *ngIf=\"selectedRunA\" \n class=\"cqa-bg-white cqa-rounded-lg cqa-p-3 cqa-border cqa-border-solid\"\n [style.background-color]=\"runAStatusBgColor\"\n [style.border-color]=\"runAStatusBorderColor\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-mb-2\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#0B0B0B]\">Run #{{ selectedRunA.id }}</span>\n </div>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-text-[10px] cqa-font-medium\"\n [style.background-color]=\"runAStatusColor\"\n [style.color]=\"'#FFFFFF'\">\n {{ runAStatusLabel }}\n </span>\n </div>\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Time: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ formatTime(selectedRunA.startTime) }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Duration: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ formatDurationString(selectedRunA.duration) }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Dataset: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ selectedRunA.testDataSetName }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Device: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ selectedRunA.device }}</span>\n </div>\n </div>\n </div>\n \n <div *ngIf=\"selectedRunB\" \n class=\"cqa-bg-white cqa-rounded-lg cqa-p-3 cqa-border cqa-border-solid\"\n [style.background-color]=\"runBStatusBgColor\"\n [style.border-color]=\"runBStatusBorderColor\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-mb-2\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#0B0B0B]\">Run #{{ selectedRunB.id }}</span>\n </div>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-text-[10px] cqa-font-medium\"\n [style.background-color]=\"runBStatusColor\"\n [style.color]=\"'#FFFFFF'\">\n {{ runBStatusLabel }}\n </span>\n </div>\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Time: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ formatTime(selectedRunB.startTime) }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Duration: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ formatDurationString(selectedRunB.duration) }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Dataset: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ selectedRunB.testDataSetName }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Device: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ selectedRunB.device }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"cqa-w-full cqa-flex cqa-justify-center\">\n <cqa-button \n variant=\"filled\" \n [disabled]=\"!canCompare\"\n (click)=\"onCompareClick()\">\n {{ isComparingRuns ? 'Comparing...' : 'Compare Runs' }}\n </cqa-button>\n </div>\n </div>\n\n <div *ngIf=\"showComparison && comparisonSummary && stepComparisons && stepComparisons.length > 0\" \n class=\"cqa-bg-white cqa-pt-3 cqa-pb-0 sm:cqa-pb-1 sm:cqa-pt-4 cqa-px-3 sm:cqa-px-6 cqa-flex cqa-items-center cqa-gap-3 sm:cqa-gap-4\">\n <p class=\"cqa-text-[12px] cqa-text-[#636363]\">Summary:</p>\n <div class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2.91669 5.25H11.0834\" stroke=\"#636363\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M2.91669 8.75H11.0834\" stroke=\"#636363\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#0B0B0B]\">{{ comparisonSummary.unchanged }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Unchanged</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-flex-shrink-0 cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M12.6759 10.5003L8.00919 2.33363C7.90743 2.15408 7.75987 2.00474 7.58156 1.90083C7.40325 1.79693 7.20056 1.74219 6.99419 1.74219C6.78781 1.74219 6.58513 1.79693 6.40681 1.90083C6.2285 2.00474 6.08094 2.15408 5.97919 2.33363L1.31252 10.5003C1.20967 10.6784 1.15574 10.8806 1.15619 11.0863C1.15665 11.2919 1.21147 11.4939 1.31511 11.6715C1.41875 11.8492 1.56752 11.9963 1.74634 12.0979C1.92516 12.1996 2.12767 12.2521 2.33335 12.2503H11.6667C11.8714 12.2501 12.0724 12.196 12.2496 12.0935C12.4268 11.9911 12.5739 11.8438 12.6762 11.6664C12.7784 11.4891 12.8322 11.288 12.8322 11.0833C12.8321 10.8786 12.7782 10.6776 12.6759 10.5003Z\" stroke=\"#FD9A00\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 5.25V7.58333\" stroke=\"#FD9A00\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 9.91699H7.00583\" stroke=\"#FD9A00\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#E17100]\">{{ comparisonSummary.statusChanged }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Status Changed</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-flex-shrink-0 cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2.91669 7H11.0834\" stroke=\"#00C950\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 2.91699V11.0837\" stroke=\"#00C950\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#00A63E]\">{{ comparisonSummary.added }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Added</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-flex-shrink-0 cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2.91669 7H11.0834\" stroke=\"#FB2C36\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#FB2C36]\">{{ comparisonSummary.removed }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Removed</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-flex-shrink-0 cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M7.00002 12.8337C10.2217 12.8337 12.8334 10.222 12.8334 7.00033C12.8334 3.77866 10.2217 1.16699 7.00002 1.16699C3.77836 1.16699 1.16669 3.77866 1.16669 7.00033C1.16669 10.222 3.77836 12.8337 7.00002 12.8337Z\" stroke=\"#2B7FFF\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 3.5V7L9.33333 8.16667\" stroke=\"#2B7FFF\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#155DFC]\">{{ comparisonSummary.timing }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Timing Changed</span>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-bg-white cqa-rounded-lg cqa-overflow-hidden\">\n <cqa-table-template\n [columns]=\"tableColumns\"\n [data]=\"stepComparisons\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [isEmptyState]=\"isEmptyState\"\n [emptyStateConfig]=\"emptyStateConfig\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [showSearchBar]=\"false\"\n [showFilterButton]=\"false\"\n [showSettingsButton]=\"false\"\n [showAutoRefreshButton]=\"false\"\n [showOtherButton]=\"false\"\n [showFilterPanel]=\"false\"\n [serverSidePagination]=\"false\"\n (pageChange)=\"onPageChange($event)\">\n </cqa-table-template>\n </div>\n\n </div>\n</div>\n\n", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.TableTemplateComponent, selector: "cqa-table-template", inputs: ["searchPlaceholder", "searchValue", "showClear", "showSearchBar", "filterConfig", "showFilterPanel", "showFilterButton", "otherButtonLabel", "otherButtonVariant", "showOtherButton", "showActionButton", "showSettingsButton", "showAutoRefreshButton", "data", "isEmptyState", "emptyStateConfig", "actions", "chips", "filterApplied", "columns", "selectedAutoRefreshInterval", "pageIndex", "pageSize", "serverSidePagination", "totalElements", "isTableLoading", "isTableDataLoading"], outputs: ["onSearchChange", "onApplyFilterClick", "onResetFilterClick", "onClearAll", "removeChip", "pageChange", "onReload", "onAutoRefreshClick"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
429
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: CompareRunsComponent, decorators: [{
430
+ type: Component,
431
+ args: [{ selector: 'cqa-compare-runs', template: "<div class=\"cqa-ui-root\" style=\"display: block; width: 100%;\">\n <div class=\"cqa-flex cqa-flex-col\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 sm:cqa-gap-4 cqa-px-3 sm:cqa-px-4 cqa-py-4 sm:cqa-py-6\" style=\"border-bottom: 1px solid #E4E4E4\">\n <div class=\"cqa-grid cqa-grid-cols-1 md:cqa-grid-cols-2 cqa-gap-4 md:cqa-gap-16\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#636363]\">Run A (Base)</span>\n <cqa-dynamic-select \n [form]=\"form\" \n [config]=\"runASelectConfig\"\n (searchChange)=\"onSearchChange($event)\"\n (loadMore)=\"onLoadMore($event)\">\n </cqa-dynamic-select>\n </div>\n \n <div class=\"cqa-hidden md:cqa-flex cqa-items-center cqa-justify-center\" style=\"position: absolute; left: 50%; transform: translateX(-50%); top: 70px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M4.16669 10H15.8334\" stroke=\"#636363\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M10 4.16699L15.8333 10.0003L10 15.8337\" stroke=\"#636363\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n \n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#636363]\">Run B (Compare)</span>\n <cqa-dynamic-select \n [form]=\"form\" \n [config]=\"runBSelectConfig\"\n (searchChange)=\"onSearchChange($event)\"\n (loadMore)=\"onLoadMore($event)\">\n </cqa-dynamic-select>\n </div>\n </div>\n \n <ng-container *ngIf=\"showComparison\">\n <div class=\"cqa-grid cqa-grid-cols-1 md:cqa-grid-cols-2 cqa-gap-4\">\n <div *ngIf=\"selectedRunA\" \n class=\"cqa-bg-white cqa-rounded-lg cqa-p-3 cqa-border cqa-border-solid\"\n [style.background-color]=\"runAStatusBgColor\"\n [style.border-color]=\"runAStatusBorderColor\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-mb-2\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#0B0B0B]\">Run #{{ selectedRunA.id }}</span>\n </div>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-text-[10px] cqa-font-medium\"\n [style.background-color]=\"runAStatusColor\"\n [style.color]=\"'#FFFFFF'\">\n {{ runAStatusLabel }}\n </span>\n </div>\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Time: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ formatTime(selectedRunA.startTime) }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Duration: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ formatDurationString(selectedRunA.duration) }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Dataset: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ selectedRunA.testDataSetName }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Device: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ selectedRunA.device }}</span>\n </div>\n </div>\n </div>\n \n <div *ngIf=\"selectedRunB\" \n class=\"cqa-bg-white cqa-rounded-lg cqa-p-3 cqa-border cqa-border-solid\"\n [style.background-color]=\"runBStatusBgColor\"\n [style.border-color]=\"runBStatusBorderColor\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-mb-2\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#0B0B0B]\">Run #{{ selectedRunB.id }}</span>\n </div>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-text-[10px] cqa-font-medium\"\n [style.background-color]=\"runBStatusColor\"\n [style.color]=\"'#FFFFFF'\">\n {{ runBStatusLabel }}\n </span>\n </div>\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Time: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ formatTime(selectedRunB.startTime) }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Duration: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ formatDurationString(selectedRunB.duration) }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Dataset: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ selectedRunB.testDataSetName }}</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\">\n <span class=\"cqa-text-xs cqa-text-[#636363]\">Device: </span>\n <span class=\"cqa-text-xs cqa-text-[#0B0B0B] cqa-font-medium\">{{ selectedRunB.device }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"cqa-w-full cqa-flex cqa-justify-center\">\n <cqa-button \n variant=\"filled\" \n [disabled]=\"!canCompare\"\n (click)=\"onCompareClick()\">\n {{ isComparingRuns ? 'Comparing...' : 'Compare Runs' }}\n </cqa-button>\n </div>\n </div>\n\n <div *ngIf=\"showComparison && comparisonSummary && stepComparisons && stepComparisons.length > 0\" \n class=\"cqa-bg-white cqa-pt-3 cqa-pb-0 sm:cqa-pb-1 sm:cqa-pt-4 cqa-px-3 sm:cqa-px-6 cqa-flex cqa-items-center cqa-gap-3 sm:cqa-gap-4\">\n <p class=\"cqa-text-[12px] cqa-text-[#636363]\">Summary:</p>\n <div class=\"cqa-flex cqa-flex-wrap cqa-items-center cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2.91669 5.25H11.0834\" stroke=\"#636363\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M2.91669 8.75H11.0834\" stroke=\"#636363\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#0B0B0B]\">{{ comparisonSummary.unchanged }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Unchanged</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-flex-shrink-0 cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M12.6759 10.5003L8.00919 2.33363C7.90743 2.15408 7.75987 2.00474 7.58156 1.90083C7.40325 1.79693 7.20056 1.74219 6.99419 1.74219C6.78781 1.74219 6.58513 1.79693 6.40681 1.90083C6.2285 2.00474 6.08094 2.15408 5.97919 2.33363L1.31252 10.5003C1.20967 10.6784 1.15574 10.8806 1.15619 11.0863C1.15665 11.2919 1.21147 11.4939 1.31511 11.6715C1.41875 11.8492 1.56752 11.9963 1.74634 12.0979C1.92516 12.1996 2.12767 12.2521 2.33335 12.2503H11.6667C11.8714 12.2501 12.0724 12.196 12.2496 12.0935C12.4268 11.9911 12.5739 11.8438 12.6762 11.6664C12.7784 11.4891 12.8322 11.288 12.8322 11.0833C12.8321 10.8786 12.7782 10.6776 12.6759 10.5003Z\" stroke=\"#FD9A00\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 5.25V7.58333\" stroke=\"#FD9A00\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 9.91699H7.00583\" stroke=\"#FD9A00\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#E17100]\">{{ comparisonSummary.statusChanged }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Status Changed</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-flex-shrink-0 cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2.91669 7H11.0834\" stroke=\"#00C950\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 2.91699V11.0837\" stroke=\"#00C950\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#00A63E]\">{{ comparisonSummary.added }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Added</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-flex-shrink-0 cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2.91669 7H11.0834\" stroke=\"#FB2C36\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#FB2C36]\">{{ comparisonSummary.removed }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Removed</span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"cqa-flex-shrink-0 cqa-w-[14px] cqa-h-[14px] cqa-text-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M7.00002 12.8337C10.2217 12.8337 12.8334 10.222 12.8334 7.00033C12.8334 3.77866 10.2217 1.16699 7.00002 1.16699C3.77836 1.16699 1.16669 3.77866 1.16669 7.00033C1.16669 10.222 3.77836 12.8337 7.00002 12.8337Z\" stroke=\"#2B7FFF\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 3.5V7L9.33333 8.16667\" stroke=\"#2B7FFF\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"cqa-text-sm cqa-font-semibold leading-normal cqa-text-[#155DFC]\">{{ comparisonSummary.timing }}</span>\n <span class=\"cqa-text-[10px] cqa-font-semibold cqa-text-[#6B7280]\">Timing Changed</span>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-bg-white cqa-rounded-lg cqa-overflow-hidden\">\n <cqa-table-template\n [columns]=\"tableColumns\"\n [data]=\"stepComparisons\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [isEmptyState]=\"isEmptyState\"\n [emptyStateConfig]=\"emptyStateConfig\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [showSearchBar]=\"false\"\n [showFilterButton]=\"false\"\n [showSettingsButton]=\"false\"\n [showAutoRefreshButton]=\"false\"\n [showOtherButton]=\"false\"\n [showFilterPanel]=\"false\"\n [serverSidePagination]=\"false\"\n (pageChange)=\"onPageChange($event)\">\n </cqa-table-template>\n </div>\n\n </div>\n</div>\n\n", styles: [] }]
432
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { runs: [{
433
+ type: Input
434
+ }], comparisonData: [{
435
+ type: Input
436
+ }], isLoadingRuns: [{
437
+ type: Input
438
+ }], hasMoreRuns: [{
439
+ type: Input
440
+ }], isComparingRuns: [{
441
+ type: Input
442
+ }], isTableDataLoading: [{
443
+ type: Input
444
+ }], searchRuns: [{
445
+ type: Output
446
+ }], loadMoreRuns: [{
447
+ type: Output
448
+ }], compareRuns: [{
449
+ type: Output
450
+ }] } });
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGFyZS1ydW5zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcGFyZS1ydW5zL2NvbXBhcmUtcnVucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBhcmUtcnVucy9jb21wYXJlLXJ1bnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLE1BQU0sRUFBRSxZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSzVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7OztBQW9GN0UsTUFBTSxPQUFPLG9CQUFvQjtJQWdDL0IsWUFDVSxFQUFlLEVBQ2YsR0FBc0I7UUFEdEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBakN2QixTQUFJLEdBQXlCLEVBQUUsQ0FBQztRQUVoQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFFbkMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO1FBQ2hFLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMxQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBUzNELG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUN2QyxpQkFBWSxHQUF5QixFQUFFLENBQUM7UUFFeEMsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUN0QixhQUFRLEdBQVcsRUFBRSxDQUFDO1FBRXRCLHFCQUFnQixHQUFxQjtZQUNuQyxLQUFLLEVBQUUsb0JBQW9CO1lBQzNCLFdBQVcsRUFBRSw4RUFBOEU7WUFDM0YsUUFBUSxFQUFFLGtCQUFr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QUtuQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNUYWJsZUNvbHVtbiB9IGZyb20gJy4uL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbmZpZyB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRU1QVFlfU1RBVEVfSU1BR0VTIH0gZnJvbSAnLi4vYXNzZXRzL2ltYWdlcy9pbWFnZS1hc3NldHMuY29uc3RhbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RGV2aWNlIHtcbiAgaWQ6IG51bWJlcjtcbiAgdGVzdFBsYW5JZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICBicm93c2VyOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIGJyb3dzZXJWZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdERldmljZVNldHRpbmdzIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgb3NWZXJzaW9uOiBzdHJpbmc7XG4gIGJyb3dzZXI6IHN0cmluZztcbiAgYnJvd3NlclZlcnNpb246IHN0cmluZztcbiAgcmVzb2x1dGlvbjogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBkZXZpY2VOYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3REZXZpY2VSZXN1bHQge1xuICB0ZXN0RGV2aWNlOiBUZXN0RGV2aWNlO1xuICB0ZXN0RGV2aWNlU2V0dGluZ3M6IFRlc3REZXZpY2VTZXR0aW5ncztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZVJlc3VsdERhdGEge1xuICBpZDogbnVtYmVyO1xuICB0ZXN0Q2FzZUlkOiBudW1iZXI7XG4gIHRlc3RQbGFuUmVzdWx0SWQ6IG51bWJlcjtcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRScgfCAnQUJPUlRFRCcgfCAnSU5fUFJPR1JFU1MnO1xuICBzdGF0dXM6ICdTVEFUVVNfQ09NUExFVEVEJyB8ICdTVEFUVVNfSU5fUFJPR1JFU1MnIHwgJ1NUQVRVU19RVUVVRUQnO1xuICBzdGFydFRpbWU6IG51bWJlcjtcbiAgZW5kVGltZTogbnVtYmVyO1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICB0ZXN0RGF0YVNldE5hbWU6IHN0cmluZztcbiAgdGVzdERldmljZVJlc3VsdDogVGVzdERldmljZVJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5EYXRhIHtcbiAgaWQ6IG51bWJlcjtcbiAgbGFiZWw6IHN0cmluZztcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRScgfCAnQUJPUlRFRCcgfCAnSU5fUFJPR1JFU1MnO1xuICBzdGFydFRpbWU6IG51bWJlcjtcbiAgZHVyYXRpb246IG51bWJlcjtcbiAgdGVzdERhdGFTZXROYW1lOiBzdHJpbmc7XG4gIGRldmljZTogc3RyaW5nO1xuICBicm93c2VyOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGFyaXNvblN1bW1hcnkge1xuICB1bmNoYW5nZWQ6IG51bWJlcjtcbiAgc3RhdHVzQ2hhbmdlZDogbnVtYmVyO1xuICBhZGRlZDogbnVtYmVyO1xuICByZW1vdmVkOiBudW1iZXI7XG4gIHRpbWluZzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBDb21wYXJpc29uIHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHN0ZXBUaXRsZTogc3RyaW5nO1xuICBydW5BU3RhdHVzPzogc3RyaW5nO1xuICBydW5BRHVyYXRpb24/OiBudW1iZXI7XG4gIHJ1bkJTdGF0dXM/OiBzdHJpbmc7XG4gIHJ1bkJEdXJhdGlvbj86IG51bWJlcjtcbiAgY2hhbmdlOiAnVU5DSEFOR0VEJyB8ICdTVEFUVVNfQ0hBTkdFRCcgfCAnVElNSU5HX0NIQU5HRUQnIHwgJ0FEREVEJyB8ICdSRU1PVkVEJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wYXJpc29uUmVzcG9uc2Uge1xuICBzdW1tYXJ5OiBDb21wYXJpc29uU3VtbWFyeTtcbiAgc3RlcHNDb21wYXJpc29uOiBTdGVwQ29tcGFyaXNvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBhcmVSZXF1ZXN0IHtcbiAgcnVuQUlkOiBudW1iZXI7XG4gIHJ1bkJJZDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtY29tcGFyZS1ydW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBhcmUtcnVucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgQ29tcGFyZVJ1bnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHJ1bnM6IFRlc3RDYXNlUmVzdWx0RGF0YVtdID0gW107XG4gIEBJbnB1dCgpIGNvbXBhcmlzb25EYXRhPzogQ29tcGFyaXNvblJlc3BvbnNlO1xuICBASW5wdXQoKSBpc0xvYWRpbmdSdW5zOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhhc01vcmVSdW5zOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzQ29tcGFyaW5nUnVuczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1RhYmxlRGF0YUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIEBPdXRwdXQoKSBzZWFyY2hSdW5zID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZVJ1bnMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNvbXBhcmVSdW5zID0gbmV3IEV2ZW50RW1pdHRlcjxDb21wYXJlUmVxdWVzdD4oKTtcblxuICBmb3JtITogRm9ybUdyb3VwO1xuICBydW5BU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBydW5CU2VsZWN0Q29uZmlnITogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIHNlbGVjdGVkUnVuQT86IFJ1bkRhdGE7XG4gIHNlbGVjdGVkUnVuQj86IFJ1bkRhdGE7XG4gIGNvbXBhcmlzb25TdW1tYXJ5PzogQ29tcGFyaXNvblN1bW1hcnk7XG4gIHN0ZXBDb21wYXJpc29uczogU3RlcENvbXBhcmlzb25bXSA9IFtdO1xuICB0YWJsZUNvbHVtbnM6IER5bmFtaWNUYWJsZUNvbHVtbltdID0gW107XG4gIFxuICBwYWdlSW5kZXg6IG51bWJlciA9IDA7XG4gIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgXG4gIGVtcHR5U3RhdGVDb25maWc6IEVtcHR5U3RhdGVDb25maWcgPSB7XG4gICAgdGl0bGU6ICdObyBDb21wYXJpc29uIERhdGEnLFxuICAgIGRlc2NyaXB0aW9uOiAnU2VsZWN0IHR3byBydW5zIHRvIGNvbXBhcmUgYW5kIHNlZSBkZXRhaWxlZCBzdGVwLWJ5LXN0ZXAgY29tcGFyaXNvbiByZXN1bHRzLicsXG4gICAgaW1hZ2VVcmw6IEVNUFRZX1NUQVRFX0lNQUdFUy5DT01QQVJFX1JVTlMsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgdGhpcy5zZXR1cFNlbGVjdENvbmZpZ3MoKTtcbiAgICB0aGlzLnNldHVwVGFibGVDb2x1bW5zKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3J1bnMnXSAmJiAhY2hhbmdlc1sncnVucyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnNldHVwU2VsZWN0Q29uZmlncygpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChjaGFuZ2VzWydjb21wYXJpc29uRGF0YSddICYmIHRoaXMuY29tcGFyaXNvbkRhdGEpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ29tcGFyaXNvbkRhdGEoKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGNoYW5nZXNbJ2lzTG9hZGluZ1J1bnMnXSkge1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RDb25maWdzTG9hZGluZygpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHJ1bkE6IFtudWxsXSxcbiAgICAgIHJ1bkI6IFtudWxsXVxuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFJ1bnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTZWxlY3RDb25maWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJ1bkFJZCA9IHRoaXMuZm9ybT8uZ2V0KCdydW5BJyk/LnZhbHVlO1xuICAgIGNvbnN0IHJ1bkJJZCA9IHRoaXMuZm9ybT8uZ2V0KCdydW5CJyk/LnZhbHVlO1xuICAgIFxuICAgIGNvbnN0IGFsbE9wdGlvbnMgPSB0aGlzLnJ1bnMubWFwKHJ1biA9PiAoe1xuICAgICAgaWQ6IHJ1bi5pZCxcbiAgICAgIHZhbHVlOiBydW4uaWQsXG4gICAgICBsYWJlbDogdGhpcy5mb3JtYXRSdW5MYWJlbChydW4pLFxuICAgICAgbmFtZTogdGhpcy5mb3JtYXRSdW5MYWJlbChydW4pXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcnVuQU9wdGlvbnMgPSBhbGxPcHRpb25zLmZpbHRlcihvcHQgPT4gb3B0LmlkICE9PSBydW5CSWQpO1xuICAgIGNvbnN0IHJ1bkJPcHRpb25zID0gYWxsT3B0aW9ucy5maWx0ZXIob3B0ID0+IG9wdC5pZCAhPT0gcnVuQUlkKTtcblxuICAgIHRoaXMucnVuQVNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3J1bkEnLFxuICAgICAgbGFiZWw6ICcnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2ggYW5kIHNlbGVjdCBydW4nLFxuICAgICAgb3B0aW9uczogcnVuQU9wdGlvbnMsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlUnVucyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdSdW5zLFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB0aGlzLmhhbmRsZVNlYXJjaFJ1bnMocXVlcnksICdydW5BJyksXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHRoaXMuaGFuZGxlTG9hZE1vcmVSdW5zKHF1ZXJ5IHx8ICcnKVxuICAgIH07XG5cbiAgICB0aGlzLnJ1bkJTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdydW5CJyxcbiAgICAgIGxhYmVsOiAnJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VhcmNoIGFuZCBzZWxlY3QgcnVuJyxcbiAgICAgIG9wdGlvbnM6IHJ1bkJPcHRpb25zLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZVJ1bnMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nUnVucyxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4gdGhpcy5oYW5kbGVTZWFyY2hSdW5zKHF1ZXJ5LCAncnVuQicpLFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB0aGlzLmhhbmRsZUxvYWRNb3JlUnVucyhxdWVyeSB8fCAnJylcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRSdW5MYWJlbChydW46IFRlc3RDYXNlUmVzdWx0RGF0YSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHJ1bi5zdGFydFRpbWUpO1xuICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBkYXRlLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIHNlY29uZDogJzItZGlnaXQnXG4gICAgfSk7XG4gICAgcmV0dXJuIGBSdW4gIyR7cnVuLmlkfSDigKIgJHtmb3JtYXR0ZWREYXRlfWA7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdENvbmZpZ3NMb2FkaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJ1bkFTZWxlY3RDb25maWcpIHtcbiAgICAgIHRoaXMucnVuQVNlbGVjdENvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5ydW5BU2VsZWN0Q29uZmlnLFxuICAgICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nUnVucyxcbiAgICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlUnVuc1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMucnVuQlNlbGVjdENvbmZpZykge1xuICAgICAgdGhpcy5ydW5CU2VsZWN0Q29uZmlnID0ge1xuICAgICAgICAuLi50aGlzLnJ1bkJTZWxlY3RDb25maWcsXG4gICAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdSdW5zLFxuICAgICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVSdW5zXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVNlYXJjaFJ1bnMocXVlcnk6IHN0cmluZywga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFJ1bnMuZW1pdCh7IGtleSwgcXVlcnkgfSk7XG4gIH1cblxuICBoYW5kbGVMb2FkTW9yZVJ1bnMocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVSdW5zLmVtaXQocXVlcnkpO1xuICB9XG5cbiAgb25TZWFyY2hDaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdvblNlYXJjaENoYW5nZScsIGV2ZW50KTtcbiAgICB0aGlzLnNlYXJjaFJ1bnMuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkxvYWRNb3JlKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRNb3JlUnVucy5lbWl0KGV2ZW50LnF1ZXJ5KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0ZWRSdW5zKCk6IHZvaWQge1xuICAgIGNvbnN0IHJ1bkFJZCA9IHRoaXMuZm9ybS5nZXQoJ3J1bkEnKT8udmFsdWU7XG4gICAgY29uc3QgcnVuQklkID0gdGhpcy5mb3JtLmdldCgncnVuQicpPy52YWx1ZTtcblxuICAgIGNvbnN0IHJ1bkEgPSB0aGlzLnJ1bnMuZmluZChyID0+IHIuaWQgPT09IHJ1bkFJZCk7XG4gICAgY29uc3QgcnVuQiA9IHRoaXMucnVucy5maW5kKHIgPT4gci5pZCA9PT0gcnVuQklkKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRSdW5BID0gcnVuQSA/IHRoaXMuY29udmVydFRvUnVuRGF0YShydW5BKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGVkUnVuQiA9IHJ1bkIgPyB0aGlzLmNvbnZlcnRUb1J1bkRhdGEocnVuQikgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnNldHVwU2VsZWN0Q29uZmlncygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VG9SdW5EYXRhKGRhdGE6IFRlc3RDYXNlUmVzdWx0RGF0YSk6IFJ1bkRhdGEge1xuICAgIGNvbnN0IGRldmljZSA9IGRhdGEudGVzdERldmljZVJlc3VsdD8udGVzdERldmljZVNldHRpbmdzPy5kZXZpY2VOYW1lIHx8IFxuICAgICAgICAgICAgICAgICAgIGRhdGEudGVzdERldmljZVJlc3VsdD8udGVzdERldmljZVNldHRpbmdzPy5wbGF0Zm9ybSB8fCBcbiAgICAgICAgICAgICAgICAgICAnVW5rbm93biBEZXZpY2UnO1xuICAgIGNvbnN0IGJyb3dzZXIgPSBkYXRhLnRlc3REZXZpY2VSZXN1bHQ/LnRlc3REZXZpY2VTZXR0aW5ncz8uYnJvd3NlciB8fCAnVW5rbm93biBCcm93c2VyJztcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGRhdGEudGVzdERldmljZVJlc3VsdD8udGVzdERldmljZVNldHRpbmdzPy5wbGF0Zm9ybSB8fCAnVW5rbm93biBQbGF0Zm9ybSc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBsYWJlbDogdGhpcy5mb3JtYXRSdW5MYWJlbChkYXRhKSxcbiAgICAgIHJlc3VsdDogZGF0YS5yZXN1bHQsXG4gICAgICBzdGFydFRpbWU6IGRhdGEuc3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb246IGRhdGEuZHVyYXRpb24sXG4gICAgICB0ZXN0RGF0YVNldE5hbWU6IGRhdGEudGVzdERhdGFTZXROYW1lLFxuICAgICAgZGV2aWNlLFxuICAgICAgYnJvd3NlcixcbiAgICAgIHBsYXRmb3JtXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBUYWJsZUNvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy50YWJsZUNvbHVtbnMgPSBbXG4gICAgICB7XG4gICAgICAgIGZpZWxkSWQ6ICdzdGVwJyxcbiAgICAgICAgZmllbGROYW1lOiAnU3RlcCcsXG4gICAgICAgIGZpZWxkVmFsdWU6ICdzdGVwVGl0bGUnLFxuICAgICAgICBpc1Nob3c6IHRydWUsXG4gICAgICAgIHdlaWdodDogMyxcbiAgICAgICAgcmVuZGVyOiAocm93OiBTdGVwQ29tcGFyaXNvbikgPT4ge1xuICAgICAgICAgIHJldHVybiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzBCMEIwQl1cIj4ke3Jvdy5zdGVwVGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgYDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmllbGRJZDogJ3J1bkEnLFxuICAgICAgICBmaWVsZE5hbWU6ICdSdW4gQScsXG4gICAgICAgIGlzU2hvdzogdHJ1ZSxcbiAgICAgICAgd2VpZ2h0OiAxLjUsXG4gICAgICAgIHJlbmRlcjogKHJvdzogU3RlcENvbXBhcmlzb24pID0+IHtcbiAgICAgICAgICBpZiAocm93LnJ1bkFTdGF0dXMgIT09ICdQQVNTRUQnICYmIHJvdy5ydW5BU3RhdHVzICE9PSAnRkFJTEVEJykge1xuICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjOUNBM0FGXVwiPuKAlDwvc3Bhbj4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgICAgJHt0aGlzLnJlbmRlclN0YXR1c0ljb24ocm93LnJ1bkFTdGF0dXMpfVxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtdGV4dC1bIzZCNzI4MF1cIj4ke3RoaXMuZm9ybWF0RHVyYXRpb24ocm93LnJ1bkFEdXJhdGlvbiB8fCAwKX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmaWVsZElkOiAncnVuQicsXG4gICAgICAgIGZpZWxkTmFtZTogJ1J1biBCJyxcbiAgICAgICAgaXNTaG93OiB0cnVlLFxuICAgICAgICB3ZWlnaHQ6IDEuNSxcbiAgICAgICAgcmVuZGVyOiAocm93OiBTdGVwQ29tcGFyaXNvbikgPT4ge1xuICAgICAgICAgIGlmIChyb3cucnVuQlN0YXR1cyAhPT0gJ1BBU1NFRCcgJiYgcm93LnJ1bkJTdGF0dXMgIT09ICdGQUlMRUQnKSB7XG4gICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2MzYzNjNdXCI+IOKAlCA8L3NwYW4+JztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0wLjVcIj5cbiAgICAgICAgICAgICAgJHt0aGlzLnJlbmRlclN0YXR1c0ljb24ocm93LnJ1bkJTdGF0dXMpfVxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtdGV4dC1bIzYzNjM2M11cIj4ke3RoaXMuZm9ybWF0RHVyYXRpb24ocm93LnJ1bkJEdXJhdGlvbiB8fCAwKX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmaWVsZElkOiAnY2hhbmdlJyxcbiAgICAgICAgZmllbGROYW1lOiAnQ2hhbmdlJyxcbiAgICAgICAgZmllbGRWYWx1ZTogJ2NoYW5nZScsXG4gICAgICAgIGlzU2hvdzogdHJ1ZSxcbiAgICAgICAgd2VpZ2h0OiAxLjUsXG4gICAgICAgIHJlbmRlcjogKHJvdzogU3RlcENvbXBhcmlzb24pID0+IHtcbiAgICAgICAgICBjb25zdCBjaGFuZ2VMYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICAnVU5DSEFOR0VEJzogJ1VuY2hhbmdlZCcsXG4gICAgICAgICAgICAnU1RBVFVTX0NIQU5HRUQnOiAnU3RhdHVzIENoYW5nZWQnLFxuICAgICAgICAgICAgJ1RJTUlOR19DSEFOR0VEJzogJ1RpbWluZyBDaGFuZ2VkJyxcbiAgICAgICAgICAgICdBRERFRCc6ICdBZGRlZCcsXG4gICAgICAgICAgICAnUkVNT1ZFRCc6ICdSZW1vdmVkJ1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY2hhbmdlQ29sb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgJ1VOQ0hBTkdFRCc6ICcjNkI3MjgwJyxcbiAgICAgICAgICAgICdTVEFUVVNfQ0hBTkdFRCc6ICcjRjU5RTBCJyxcbiAgICAgICAgICAgICdUSU1JTkdfQ0hBTkdFRCc6ICcjM0I4MkY2JyxcbiAgICAgICAgICAgICdBRERFRCc6ICcjMTBCOTgxJyxcbiAgICAgICAgICAgICdSRU1PVkVEJzogJyNFRjQ0NDQnXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjaGFuZ2VCZ0NvbG9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgICdVTkNIQU5HRUQnOiAnI0YzRjRGNicsXG4gICAgICAgICAgICAnU1RBVFVTX0NIQU5HRUQnOiAnI0ZFRjNDNycsXG4gICAgICAgICAgICAnVElNSU5HX0NIQU5HRUQnOiAnI0RCRUFGRScsXG4gICAgICAgICAgICAnQURERUQnOiAnI0QxRkFFNScsXG4gICAgICAgICAgICAnUkVNT1ZFRCc6ICcjRkVFMkUyJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBsYWJlbCA9IGNoYW5nZUxhYmVsc1tyb3cuY2hhbmdlXSB8fCByb3cuY2hhbmdlO1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gY2hhbmdlQ29sb3JzW3Jvdy5jaGFuZ2VdIHx8ICcjNkI3MjgwJztcbiAgICAgICAgICBjb25zdCBiZ0NvbG9yID0gY2hhbmdlQmdDb2xvcnNbcm93LmNoYW5nZV0gfHwgJyNGM0Y0RjYnO1xuXG4gICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1weC0yIGNxYS1weS0wLjUgY3FhLXJvdW5kZWQtZnVsbCBjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXctbWF4XCIgXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICR7YmdDb2xvcn07IGNvbG9yOiAke2NvbG9yfTtcIj5cbiAgICAgICAgICAgICAgJHtsYWJlbH1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyU3RhdHVzSWNvbihzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdXBwZXJTdGF0dXMgPSBzdGF0dXMudG9VcHBlckNhc2UoKTtcbiAgICBpZiAodXBwZXJTdGF0dXMgPT09ICdQQVNTRUQnKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNNy45OTk5OCAxNC42NjYzQzExLjY4MTkgMTQuNjY2MyAxNC42NjY2IDExLjY4MTYgMTQuNjY2NiA3Ljk5OTY3QzE0LjY2NjYgNC4zMTc3OCAxMS42ODE5IDEuMzMzMDEgNy45OTk5OCAxLjMzMzAxQzQuMzE4MDggMS4zMzMwMSAxLjMzMzMxIDQuMzE3NzggMS4zMzMzMSA3Ljk5OTY3QzEuMzMzMzEgMTEuNjgxNiA0LjMxODA4IDE0LjY2NjMgNy45OTk5OCAxNC42NjYzWlwiIHN0cm9rZT1cIiMwMEM5NTBcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTYgOC4wMDAzM0w3LjMzMzMzIDkuMzMzNjZMMTAgNi42NjY5OVwiIHN0cm9rZT1cIiMwMEM5NTBcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgPC9zdmc+YDtcbiAgICB9IGVsc2UgaWYgKHVwcGVyU3RhdHVzID09PSAnRkFJTEVEJykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICA8cGF0aCBkPVwiTTguMDAwMDQgMTQuNjY3M0MxMS42ODE5IDE0LjY2NzMgMTQuNjY2NyAxMS42ODI1IDE0LjY2NjcgOC4wMDA2NUMxNC42NjY3IDQuMzE4NzUgMTEuNjgxOSAxLjMzMzk4IDguMDAwMDQgMS4zMzM5OEM0LjMxODE0IDEuMzMzOTggMS4zMzMzNyA0LjMxODc1IDEuMzMzMzcgOC4wMDA2NUMxLjMzMzM3IDExLjY4MjUgNC4zMTgxNCAxNC42NjczIDguMDAwMDQgMTQuNjY3M1pcIiBzdHJva2U9XCIjRkIyQzM2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0xMCA2TDYgMTBcIiBzdHJva2U9XCIjRkIyQzM2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk02IDZMMTAgMTBcIiBzdHJva2U9XCIjRkIyQzM2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgIDwvc3ZnPmA7XG4gICAgfSBlbHNlIGlmICh1cHBlclN0YXR1cyA9PT0gJ05PVF9FWEVDVVRFRCcpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgPHBhdGggZD1cIk04LjAwMDA0IDE0LjY2NzNDMTEuNjgxOSAxNC42NjczIDE0LjY2NjcgMTEuNjgyNSAxNC42NjY3IDguMDAwNjVDMTQuNjY2NyA0LjMxODc1IDExLjY4MTkgMS4zMzM5OCA4LjAwMDA0IDEuMzMzOThDNC4zMTgxNCAxLjMzMzk4IDEuMzMzMzcgNC4zMTg3NSAxLjMzMzM3IDguMDAwNjVDMS4zMzMzNyAxMS42ODI1IDQuMzE4MTQgMTQuNjY3MyA4LjAwMDA0IDE0LjY2NzNaXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNiA4SDEwXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2MzYzNjNdXCI+IOKAlCA8L3NwYW4+YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdER1cmF0aW9uKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBpZiAoc2Vjb25kcyA8IDYwKSB7XG4gICAgICByZXR1cm4gYCR7c2Vjb25kcy50b0ZpeGVkKDEpfXNgO1xuICAgIH1cbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGNvbnN0IHJlbWFpbmluZ1NlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMgJSA2MCk7XG4gICAgcmV0dXJuIGAke21pbnV0ZXN9bSAke3JlbWFpbmluZ1NlY29uZHN9c2A7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbXBhcmlzb25EYXRhKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb21wYXJpc29uRGF0YSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb21wYXJpc29uU3VtbWFyeSA9IHRoaXMuY29tcGFyaXNvbkRhdGEuc3VtbWFyeTtcbiAgICB0aGlzLnN0ZXBDb21wYXJpc29ucyA9IHRoaXMuY29tcGFyaXNvbkRhdGEuc3RlcHNDb21wYXJpc29uO1xuICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShldmVudDogeyBwYWdlSW5kZXg6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9KTogdm9pZCB7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICBnZXQgaXNFbXB0eVN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zaG93Q29tcGFyaXNvbiB8fCAhdGhpcy5zdGVwQ29tcGFyaXNvbnMgfHwgdGhpcy5zdGVwQ29tcGFyaXNvbnMubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgb25Db21wYXJlQ2xpY2soKTogdm9pZCB7XG4gICAgY29uc3QgcnVuQUlkID0gdGhpcy5mb3JtLmdldCgncnVuQScpPy52YWx1ZTtcbiAgICBjb25zdCBydW5CSWQgPSB0aGlzLmZvcm0uZ2V0KCdydW5CJyk/LnZhbHVlO1xuXG4gICAgaWYgKHJ1bkFJZCAmJiBydW5CSWQgJiYgIXRoaXMuaXNDb21wYXJpbmdSdW5zKSB7XG4gICAgICB0aGlzLmNvbXBhcmVSdW5zLmVtaXQoe1xuICAgICAgICBydW5BSWQsXG4gICAgICAgIHJ1bkJJZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNhbkNvbXBhcmUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcnVuQUlkID0gdGhpcy5mb3JtLmdldCgncnVuQScpPy52YWx1ZTtcbiAgICBjb25zdCBydW5CSWQgPSB0aGlzLmZvcm0uZ2V0KCdydW5CJyk/LnZhbHVlO1xuICAgIHJldHVybiAhIShydW5BSWQgJiYgcnVuQklkICYmICF0aGlzLmlzQ29tcGFyaW5nUnVucyk7XG4gIH1cblxuICBnZXQgcnVuQVN0YXR1c0NvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUnVuQSkgcmV0dXJuICcjNkI3MjgwJztcbiAgICBjb25zdCBjb2xvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnU1VDQ0VTUyc6ICcjMEI5RDY4JyxcbiAgICAgICdGQUlMVVJFJzogJyNGQjJDMzYnLFxuICAgICAgJ0FCT1JURUQnOiAnI0Y1OUUwQicsXG4gICAgICAnSU5fUFJPR1JFU1MnOiAnIzNCODJGNidcbiAgICB9O1xuICAgIHJldHVybiBjb2xvcnNbdGhpcy5zZWxlY3RlZFJ1bkEucmVzdWx0XSB8fCAnIzZCNzI4MCc7XG4gIH1cblxuICBnZXQgcnVuQlN0YXR1c0NvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUnVuQikgcmV0dXJuICcjNkI3MjgwJztcbiAgICBjb25zdCBjb2xvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnU1VDQ0VTUyc6ICcjMEI5RDY4JyxcbiAgICAgICdGQUlMVVJFJzogJyNGQjJDMzYnLFxuICAgICAgJ0FCT1JURUQnOiAnI0Y1OUUwQicsXG4gICAgICAnSU5fUFJPR1JFU1MnOiAnIzNCODJGNidcbiAgICB9O1xuICAgIHJldHVybiBjb2xvcnNbdGhpcy5zZWxlY3RlZFJ1bkIucmVzdWx0XSB8fCAnIzZCNzI4MCc7XG4gIH1cblxuICBnZXQgcnVuQVN0YXR1c0JvcmRlckNvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUnVuQSkgcmV0dXJuICcjRjNGNEY2JztcbiAgICBjb25zdCBjb2xvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnU1VDQ0VTUyc6ICcjQ0ZGMkU1JyxcbiAgICAgICdGQUlMVVJFJzogJyNGQ0Q5RDknLFxuICAgICAgJ0FCT1JURUQnOiAnI0ZFRjNDNycsXG4gICAgICAnSU5fUFJPR1JFU1MnOiAnI0RCRUFGRSdcbiAgICB9O1xuICAgIHJldHVybiBjb2xvcnNbdGhpcy5zZWxlY3RlZFJ1bkEucmVzdWx0XSB8fCAnI0YzRjRGNic7XG4gIH1cblxuICBnZXQgcnVuQlN0YXR1c0JvcmRlckNvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUnVuQikgcmV0dXJuICcjRjNGNEY2JztcbiAgICBjb25zdCBjb2xvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnU1VDQ0VTUyc6ICcjQ0ZGMkU1JyxcbiAgICAgICdGQUlMVVJFJzogJyNGQ0Q5RDknLFxuICAgICAgJ0FCT1JURUQnOiAnI0ZFRjNDNycsXG4gICAgICAnSU5fUFJPR1JFU1MnOiAnI0RCRUFGRSdcbiAgICB9O1xuICAgIHJldHVybiBjb2xvcnNbdGhpcy5zZWxlY3RlZFJ1bkIucmVzdWx0XSB8fCAnI0YzRjRGNic7XG4gIH1cblxuICBnZXQgcnVuQVN0YXR1c0JnQ29sb3IoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSdW5BKSByZXR1cm4gJyNGM0Y0RjYnO1xuICAgIGNvbnN0IGNvbG9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdTVUNDRVNTJzogJyMwREJEN0QxQScsXG4gICAgICAnRkFJTFVSRSc6ICcjRUUzRjNGMUEnLFxuICAgICAgJ0FCT1JURUQnOiAnI0ZFRjNDNycsXG4gICAgICAnSU5fUFJPR1JFU1MnOiAnI0RCRUFGRSdcbiAgICB9O1xuICAgIHJldHVybiBjb2xvcnNbdGhpcy5zZWxlY3RlZFJ1bkEucmVzdWx0XSB8fCAnI0YzRjRGNic7XG4gIH1cblxuICBnZXQgcnVuQlN0YXR1c0JnQ29sb3IoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSdW5CKSByZXR1cm4gJyNGM0Y0RjYnO1xuICAgIGNvbnN0IGNvbG9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdTVUNDRVNTJzogJyMwREJEN0QxQScsXG4gICAgICAnRkFJTFVSRSc6ICcjRUUzRjNGMUEnLFxuICAgICAgJ0FCT1JURUQnOiAnI0ZFRjNDNycsXG4gICAgICAnSU5fUFJPR1JFU1MnOiAnI0RCRUFGRSdcbiAgICB9O1xuICAgIHJldHVybiBjb2xvcnNbdGhpcy5zZWxlY3RlZFJ1bkIucmVzdWx0XSB8fCAnI0YzRjRGNic7XG4gIH1cblxuICBmb3JtYXRUaW1lKHRpbWVzdGFtcDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZXN0YW1wKTtcbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7XG4gICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgbWludXRlOiAnMi1kaWdpdCdcbiAgICB9KTtcbiAgfVxuXG4gIGZvcm1hdER1cmF0aW9uU3RyaW5nKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXREdXJhdGlvbihtaWxsaXNlY29uZHMpO1xuICB9XG5cbiAgZ2V0IHNob3dDb21wYXJpc29uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmNvbXBhcmlzb25EYXRhICYmIHRoaXMuY29tcGFyaXNvblN1bW1hcnkpO1xuICB9XG5cbiAgZ2V0IHJ1bkFTdGF0dXNMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFJ1bkEpIHJldHVybiAnJztcbiAgICBjb25zdCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnU1VDQ0VTUyc6ICdQYXNzZWQnLFxuICAgICAgJ0ZBSUxVUkUnOiAnRmFpbGVkJyxcbiAgICAgICdBQk9SVEVEJzogJ0Fib3J0ZWQnLFxuICAgICAgJ0lOX1BST0dSRVNTJzogJ0luIFByb2dyZXNzJ1xuICAgIH07XG4gICAgcmV0dXJuIGxhYmVsc1t0aGlzLnNlbGVjdGVkUnVuQS5yZXN1bHRdIHx8IHRoaXMuc2VsZWN0ZWRSdW5BLnJlc3VsdDtcbiAgfVxuXG4gIGdldCBydW5CU3RhdHVzTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSdW5CKSByZXR1cm4gJyc7XG4gICAgY29uc3QgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ1NVQ0NFU1MnOiAnUGFzc2VkJyxcbiAgICAgICdGQUlMVVJFJzogJ0ZhaWxlZCcsXG4gICAgICAnQUJPUlRFRCc6ICdBYm9ydGVkJyxcbiAgICAgICdJTl9QUk9HUkVTUyc6ICdJbiBQcm9ncmVzcydcbiAgICB9O1xuICAgIHJldHVybiBsYWJlbHNbdGhpcy5zZWxlY3RlZFJ1bkIucmVzdWx0XSB8fCB0aGlzLnNlbGVjdGVkUnVuQi5yZXN1bHQ7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7XCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBzbTpjcWEtZ2FwLTQgY3FhLXB4LTMgc206Y3FhLXB4LTQgY3FhLXB5LTQgc206Y3FhLXB5LTZcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTRFNEU0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZ3JpZCBjcWEtZ3JpZC1jb2xzLTEgbWQ6Y3FhLWdyaWQtY29scy0yIGNxYS1nYXAtNCBtZDpjcWEtZ2FwLTE2XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNjM2MzYzXVwiPlJ1biBBIChCYXNlKTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBcbiAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgXG4gICAgICAgICAgICAgICAgW2NvbmZpZ109XCJydW5BU2VsZWN0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvbkxvYWRNb3JlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1oaWRkZW4gbWQ6Y3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogNTAlOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7IHRvcDogNzBweDtcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00LjE2NjY5IDEwSDE1LjgzMzRcIiBzdHJva2U9XCIjNjM2MzYzXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCA0LjE2Njk5TDE1LjgzMzMgMTAuMDAwM0wxMCAxNS44MzM3XCIgc3Ryb2tlPVwiIzYzNjM2M1wiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM2MzYzNjNdXCI+UnVuIEIgKENvbXBhcmUpPC9zcGFuPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFxuICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBcbiAgICAgICAgICAgICAgICBbY29uZmlnXT1cInJ1bkJTZWxlY3RDb25maWdcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWFyY2hDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uTG9hZE1vcmUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dDb21wYXJpc29uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy0xIG1kOmNxYS1ncmlkLWNvbHMtMiBjcWEtZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkUnVuQVwiIFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWRcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwicnVuQVN0YXR1c0JnQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlci1jb2xvcl09XCJydW5BU3RhdHVzQm9yZGVyQ29sb3JcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMEIwQjBCXVwiPlJ1biAje3sgc2VsZWN0ZWRSdW5BLmlkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJydW5BU3RhdHVzQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIicjRkZGRkZGJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBydW5BU3RhdHVzTGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2MzYzNjNdXCI+VGltZTogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEIwQjBCXSBjcWEtZm9udC1tZWRpdW1cIj57eyBmb3JtYXRUaW1lKHNlbGVjdGVkUnVuQS5zdGFydFRpbWUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzYzNjM2M11cIj5EdXJhdGlvbjogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEIwQjBCXSBjcWEtZm9udC1tZWRpdW1cIj57eyBmb3JtYXREdXJhdGlvblN0cmluZyhzZWxlY3RlZFJ1bkEuZHVyYXRpb24pIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzYzNjM2M11cIj5EYXRhc2V0OiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMwQjBCMEJdIGNxYS1mb250LW1lZGl1bVwiPnt7IHNlbGVjdGVkUnVuQS50ZXN0RGF0YVNldE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNjM2MzYzXVwiPkRldmljZTogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEIwQjBCXSBjcWEtZm9udC1tZWRpdW1cIj57eyBzZWxlY3RlZFJ1bkEuZGV2aWNlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkUnVuQlwiIFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWRcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwicnVuQlN0YXR1c0JnQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlci1jb2xvcl09XCJydW5CU3RhdHVzQm9yZGVyQ29sb3JcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMEIwQjBCXVwiPlJ1biAje3sgc2VsZWN0ZWRSdW5CLmlkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJydW5CU3RhdHVzQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIicjRkZGRkZGJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBydW5CU3RhdHVzTGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2MzYzNjNdXCI+VGltZTogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEIwQjBCXSBjcWEtZm9udC1tZWRpdW1cIj57eyBmb3JtYXRUaW1lKHNlbGVjdGVkUnVuQi5zdGFydFRpbWUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzYzNjM2M11cIj5EdXJhdGlvbjogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEIwQjBCXSBjcWEtZm9udC1tZWRpdW1cIj57eyBmb3JtYXREdXJhdGlvblN0cmluZyhzZWxlY3RlZFJ1bkIuZHVyYXRpb24pIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzYzNjM2M11cIj5EYXRhc2V0OiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMwQjBCMEJdIGNxYS1mb250LW1lZGl1bVwiPnt7IHNlbGVjdGVkUnVuQi50ZXN0RGF0YVNldE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNjM2MzYzXVwiPkRldmljZTogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjMEIwQjBCXSBjcWEtZm9udC1tZWRpdW1cIj57eyBzZWxlY3RlZFJ1bkIuZGV2aWNlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uIFxuICAgICAgICAgICAgICB2YXJpYW50PVwiZmlsbGVkXCIgXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQ29tcGFyZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkNvbXBhcmVDbGljaygpXCI+XG4gICAgICAgICAgICAgIHt7IGlzQ29tcGFyaW5nUnVucyA/ICdDb21wYXJpbmcuLi4nIDogJ0NvbXBhcmUgUnVucycgfX1cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzaG93Q29tcGFyaXNvbiAmJiBjb21wYXJpc29uU3VtbWFyeSAmJiBzdGVwQ29tcGFyaXNvbnMgJiYgc3RlcENvbXBhcmlzb25zLmxlbmd0aCA+IDBcIiBcbiAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXdoaXRlIGNxYS1wdC0zIGNxYS1wYi0wIHNtOmNxYS1wYi0xIHNtOmNxYS1wdC00IGNxYS1weC0zIHNtOmNxYS1weC02IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIHNtOmNxYS1nYXAtNFwiPlxuICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2MzYzNjNdXCI+U3VtbWFyeTo8L3A+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS13LVsxNHB4XSBjcWEtaC1bMTRweF0gY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIuOTE2NjkgNS4yNUgxMS4wODM0XCIgc3Ryb2tlPVwiIzYzNjM2M1wiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMi45MTY2OSA4Ljc1SDExLjA4MzRcIiBzdHJva2U9XCIjNjM2MzYzXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGxlYWRpbmctbm9ybWFsIGNxYS10ZXh0LVsjMEIwQjBCXVwiPnt7IGNvbXBhcmlzb25TdW1tYXJ5LnVuY2hhbmdlZCB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzZCNzI4MF1cIj5VbmNoYW5nZWQ8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXctWzE0cHhdIGNxYS1oLVsxNHB4XSBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuNjc1OSAxMC41MDAzTDguMDA5MTkgMi4zMzM2M0M3LjkwNzQzIDIuMTU0MDggNy43NTk4NyAyLjAwNDc0IDcuNTgxNTYgMS45MDA4M0M3LjQwMzI1IDEuNzk2OTMgNy4yMDA1NiAxLjc0MjE5IDYuOTk0MTkgMS43NDIxOUM2Ljc4NzgxIDEuNzQyMTkgNi41ODUxMyAxLjc5NjkzIDYuNDA2ODEgMS45MDA4M0M2LjIyODUgMi4wMDQ3NCA2LjA4MDk0IDIuMTU0MDggNS45NzkxOSAyLjMzMzYzTDEuMzEyNTIgMTAuNTAwM0MxLjIwOTY3IDEwLjY3ODQgMS4xNTU3NCAxMC44ODA2IDEuMTU2MTkgMTEuMDg2M0MxLjE1NjY1IDExLjI5MTkgMS4yMTE0NyAxMS40OTM5IDEuMzE1MTEgMTEuNjcxNUMxLjQxODc1IDExLjg0OTIgMS41Njc1MiAxMS45OTYzIDEuNzQ2MzQgMTIuMDk3OUMxLjkyNTE2IDEyLjE5OTYgMi4xMjc2NyAxMi4yNTIxIDIuMzMzMzUgMTIuMjUwM0gxMS42NjY3QzExLjg3MTQgMTIuMjUwMSAxMi4wNzI0IDEyLjE5NiAxMi4yNDk2IDEyLjA5MzVDMTIuNDI2OCAxMS45OTExIDEyLjU3MzkgMTEuODQzOCAxMi42NzYyIDExLjY2NjRDMTIuNzc4NCAxMS40ODkxIDEyLjgzMjIgMTEuMjg4IDEyLjgzMjIgMTEuMDgzM0MxMi44MzIxIDEwLjg3ODYgMTIuNzc4MiAxMC42Nzc2IDEyLjY3NTkgMTAuNTAwM1pcIiBzdHJva2U9XCIjRkQ5QTAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDUuMjVWNy41ODMzM1wiIHN0cm9rZT1cIiNGRDlBMDBcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgOS45MTY5OUg3LjAwNTgzXCIgc3Ryb2tlPVwiI0ZEOUEwMFwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vcm1hbCBjcWEtdGV4dC1bI0UxNzEwMF1cIj57eyBjb21wYXJpc29uU3VtbWFyeS5zdGF0dXNDaGFuZ2VkIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlN0YXR1cyBDaGFuZ2VkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS13LVsxNHB4XSBjcWEtaC1bMTRweF0gY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIuOTE2NjkgN0gxMS4wODM0XCIgc3Ryb2tlPVwiIzAwQzk1MFwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyAyLjkxNjk5VjExLjA4MzdcIiBzdHJva2U9XCIjMDBDOTUwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGxlYWRpbmctbm9ybWFsIGNxYS10ZXh0LVsjMDBBNjNFXVwiPnt7IGNvbXBhcmlzb25TdW1tYXJ5LmFkZGVkIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNkI3MjgwXVwiPkFkZGVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS13LVsxNHB4XSBjcWEtaC1bMTRweF0gY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIuOTE2NjkgN0gxMS4wODM0XCIgc3Ryb2tlPVwiI0ZCMkMzNlwiIHN0cm9rZS13aWR0aD1cIjEuMTY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vcm1hbCBjcWEtdGV4dC1bI0ZCMkMzNl1cIj57eyBjb21wYXJpc29uU3VtbWFyeS5yZW1vdmVkIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlJlbW92ZWQ8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXctWzE0cHhdIGNxYS1oLVsxNHB4XSBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4wMDAwMiAxMi44MzM3QzEwLjIyMTcgMTIuODMzNyAxMi44MzM0IDEwLjIyMiAxMi44MzM0IDcuMDAwMzNDMTIuODMzNCAzLjc3ODY2IDEwLjIyMTcgMS4xNjY5OSA3LjAwMDAyIDEuMTY2OTlDMy43NzgzNiAxLjE2Njk5IDEuMTY2NjkgMy43Nzg2NiAxLjE2NjY5IDcuMDAwMzNDMS4xNjY2OSAxMC4yMjIgMy43NzgzNiAxMi44MzM3IDcuMDAwMDIgMTIuODMzN1pcIiBzdHJva2U9XCIjMkI3RkZGXCIgc3Ryb2tlLXdpZHRoPVwiMS4xNjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDMuNVY3TDkuMzMzMzMgOC4xNjY2N1wiIHN0cm9rZT1cIiMyQjdGRkZcIiBzdHJva2Utd2lkdGg9XCIxLjE2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgbGVhZGluZy1ub3JtYWwgY3FhLXRleHQtWyMxNTVERkNdXCI+e3sgY29tcGFyaXNvblN1bW1hcnkudGltaW5nIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlRpbWluZyBDaGFuZ2VkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1sZyBjcWEtb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICA8Y3FhLXRhYmxlLXRlbXBsYXRlXG4gICAgICAgIFtjb2x1bW5zXT1cInRhYmxlQ29sdW1uc1wiXG4gICAgICAgIFtkYXRhXT1cInN0ZXBDb21wYXJpc29uc1wiXG4gICAgICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcbiAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgW2lzRW1wdHlTdGF0ZV09XCJpc0VtcHR5U3RhdGVcIlxuICAgICAgICBbZW1wdHlTdGF0ZUNvbmZpZ109XCJlbXB0eVN0YXRlQ29uZmlnXCJcbiAgICAgICAgW2lzVGFibGVEYXRhTG9hZGluZ109XCJpc1RhYmxlRGF0YUxvYWRpbmdcIlxuICAgICAgICBbc2hvd1NlYXJjaEJhcl09XCJmYWxzZVwiXG4gICAgICAgIFtzaG93RmlsdGVyQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgW3Nob3dTZXR0aW5nc0J1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgIFtzaG93QXV0b1JlZnJlc2hCdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICBbc2hvd090aGVyQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgW3Nob3dGaWx0ZXJQYW5lbF09XCJmYWxzZVwiXG4gICAgICAgIFtzZXJ2ZXJTaWRlUGFnaW5hdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS10YWJsZS10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=