ng-kinintel 0.0.397 → 20.0.2
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/fesm2022/ng-kinintel.mjs +11874 -0
- package/fesm2022/ng-kinintel.mjs.map +1 -0
- package/index.d.ts +2818 -5
- package/package.json +6 -14
- package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
- package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
- package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
- package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
- package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
- package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
- package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
- package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
- package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
- package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
- package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
- package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
- package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
- package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
- package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
- package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
- package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
- package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
- package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
- package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
- package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
- package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
- package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
- package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
- package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
- package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
- package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
- package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
- package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
- package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
- package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
- package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
- package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
- package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
- package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
- package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
- package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
- package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
- package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
- package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
- package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
- package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
- package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
- package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
- package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
- package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
- package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
- package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
- package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
- package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
- package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
- package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
- package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
- package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
- package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
- package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
- package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
- package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
- package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
- package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
- package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
- package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
- package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
- package/esm2020/lib/kinintel-config.mjs +0 -3
- package/esm2020/lib/ng-kinintel.module.mjs +0 -437
- package/esm2020/lib/objects/action-event.mjs +0 -16
- package/esm2020/lib/services/alert.service.mjs +0 -52
- package/esm2020/lib/services/dashboard.service.mjs +0 -75
- package/esm2020/lib/services/data-processor.service.mjs +0 -56
- package/esm2020/lib/services/data-search.service.mjs +0 -36
- package/esm2020/lib/services/dataset.service.mjs +0 -187
- package/esm2020/lib/services/datasource.service.mjs +0 -93
- package/esm2020/lib/services/external.service.mjs +0 -33
- package/esm2020/lib/services/feed.service.mjs +0 -50
- package/esm2020/lib/services/notification.service.mjs +0 -41
- package/esm2020/lib/services/project.service.mjs +0 -130
- package/esm2020/lib/services/tag.service.mjs +0 -63
- package/esm2020/ng-kinintel.mjs +0 -5
- package/esm2020/public-api.mjs +0 -43
- package/fesm2015/ng-kinintel.mjs +0 -12182
- package/fesm2015/ng-kinintel.mjs.map +0 -1
- package/fesm2020/ng-kinintel.mjs +0 -11872
- package/fesm2020/ng-kinintel.mjs.map +0 -1
- package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
- package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
- package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
- package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
- package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
- package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
- package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
- package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
- package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
- package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
- package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
- package/lib/components/dashboards/dashboards.component.d.ts +0 -56
- package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
- package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
- package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
- package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
- package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
- package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
- package/lib/components/data-picker/data-picker.component.d.ts +0 -32
- package/lib/components/data-search/data-search.component.d.ts +0 -5
- package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
- package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
- package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
- package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
- package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
- package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
- package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
- package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
- package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
- package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
- package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
- package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
- package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
- package/lib/components/dataset/dataset.component.d.ts +0 -74
- package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
- package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
- package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
- package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
- package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
- package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
- package/lib/components/datasource/datasource.component.d.ts +0 -46
- package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
- package/lib/components/export-project/export-project.component.d.ts +0 -9
- package/lib/components/feeds/feed/feed.component.d.ts +0 -30
- package/lib/components/feeds/feeds.component.d.ts +0 -47
- package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
- package/lib/components/marketplace/marketplace.component.d.ts +0 -42
- package/lib/components/metadata/metadata.component.d.ts +0 -24
- package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
- package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
- package/lib/components/project-picker/project-picker.component.d.ts +0 -37
- package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
- package/lib/components/project-settings/project-settings.component.d.ts +0 -40
- package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
- package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
- package/lib/components/query-caching/query-caching.component.d.ts +0 -38
- package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
- package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
- package/lib/components/snapshots/snapshots.component.d.ts +0 -52
- package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
- package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
- package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
- package/lib/guards/dashboard-changes.guard.d.ts +0 -11
- package/lib/kinintel-config.d.ts +0 -10
- package/lib/ng-kinintel.module.d.ts +0 -116
- package/lib/objects/action-event.d.ts +0 -12
- package/lib/services/alert.service.d.ts +0 -17
- package/lib/services/dashboard.service.d.ts +0 -25
- package/lib/services/data-processor.service.d.ts +0 -18
- package/lib/services/data-search.service.d.ts +0 -14
- package/lib/services/dataset.service.d.ts +0 -56
- package/lib/services/datasource.service.d.ts +0 -34
- package/lib/services/external.service.d.ts +0 -12
- package/lib/services/feed.service.d.ts +0 -19
- package/lib/services/notification.service.d.ts +0 -16
- package/lib/services/project.service.d.ts +0 -27
- package/lib/services/tag.service.d.ts +0 -19
- package/public-api.d.ts +0 -38
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import { Component, Inject, Input } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, interval, merge, Subject } from 'rxjs';
|
|
3
|
-
import { debounceTime, map, switchMap } from 'rxjs/operators';
|
|
4
|
-
import { DataExplorerComponent } from '../data-explorer/data-explorer.component';
|
|
5
|
-
import { KININTEL_CONFIG } from '../../kinintel-config';
|
|
6
|
-
import * as lodash from 'lodash';
|
|
7
|
-
import { SnapshotProfileDialogComponent } from '../data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/material/legacy-dialog";
|
|
10
|
-
import * as i2 from "../../services/tag.service";
|
|
11
|
-
import * as i3 from "../../services/project.service";
|
|
12
|
-
import * as i4 from "../../services/dataset.service";
|
|
13
|
-
import * as i5 from "../../services/data-processor.service";
|
|
14
|
-
import * as i6 from "@angular/router";
|
|
15
|
-
import * as i7 from "@angular/common";
|
|
16
|
-
import * as i8 from "@angular/material/legacy-button";
|
|
17
|
-
import * as i9 from "@angular/material/icon";
|
|
18
|
-
import * as i10 from "@angular/material/legacy-menu";
|
|
19
|
-
import * as i11 from "@angular/material/chips";
|
|
20
|
-
import * as i12 from "@angular/forms";
|
|
21
|
-
import * as i13 from "@angular/material/legacy-tooltip";
|
|
22
|
-
const _ = lodash.default;
|
|
23
|
-
export class SnapshotsComponent {
|
|
24
|
-
constructor(dialog, tagService, projectService, datasetService, dataProcessorService, router, config) {
|
|
25
|
-
this.dialog = dialog;
|
|
26
|
-
this.tagService = tagService;
|
|
27
|
-
this.projectService = projectService;
|
|
28
|
-
this.datasetService = datasetService;
|
|
29
|
-
this.dataProcessorService = dataProcessorService;
|
|
30
|
-
this.router = router;
|
|
31
|
-
this.config = config;
|
|
32
|
-
this.snapshots = {
|
|
33
|
-
project: {
|
|
34
|
-
data: [],
|
|
35
|
-
limit: 10,
|
|
36
|
-
offset: 0,
|
|
37
|
-
page: 1,
|
|
38
|
-
endOfResults: false,
|
|
39
|
-
shared: false,
|
|
40
|
-
reload: new Subject(),
|
|
41
|
-
categories: []
|
|
42
|
-
},
|
|
43
|
-
tag: {
|
|
44
|
-
data: [],
|
|
45
|
-
limit: 10,
|
|
46
|
-
offset: 0,
|
|
47
|
-
page: 1,
|
|
48
|
-
endOfResults: false,
|
|
49
|
-
shared: false,
|
|
50
|
-
reload: new Subject(),
|
|
51
|
-
categories: []
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
this.searchText = new BehaviorSubject('');
|
|
55
|
-
this.activeTagSub = new Subject();
|
|
56
|
-
this._ = _;
|
|
57
|
-
this.canHaveSnapshots = false;
|
|
58
|
-
this.reload = new Subject();
|
|
59
|
-
}
|
|
60
|
-
ngOnInit() {
|
|
61
|
-
this.canHaveSnapshots = this.projectService.doesActiveProjectHavePrivilege('snapshotaccess');
|
|
62
|
-
if (this.canHaveSnapshots) {
|
|
63
|
-
if (this.tagService) {
|
|
64
|
-
this.activeTagSub = this.tagService.activeTag;
|
|
65
|
-
this.tagSub = this.tagService.activeTag.subscribe(tag => {
|
|
66
|
-
if (tag) {
|
|
67
|
-
this.activeTag = tag;
|
|
68
|
-
this.tagDataSub = merge(this.searchText, this.snapshots.tag.reload, this.projectService.activeProject, this.reload)
|
|
69
|
-
.pipe(debounceTime(300),
|
|
70
|
-
// distinctUntilChanged(),
|
|
71
|
-
switchMap(() => this.getSnapshots(this.snapshots.tag))).subscribe((snapshots) => {
|
|
72
|
-
this.snapshots.tag.data = snapshots;
|
|
73
|
-
});
|
|
74
|
-
this.tagChanges = interval(3000)
|
|
75
|
-
.pipe(switchMap(() => this.dataProcessorService.filterProcessorsByType('snapshot', this.searchText.getValue() || '', String(this.snapshots.tag.limit), String(this.snapshots.tag.offset)).pipe(map(result => {
|
|
76
|
-
return result;
|
|
77
|
-
})))).subscribe(snapshots => {
|
|
78
|
-
this.snapshots.tag.data = snapshots;
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
this.activeTag = null;
|
|
83
|
-
if (this.tagDataSub) {
|
|
84
|
-
this.tagDataSub.unsubscribe();
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
merge(this.searchText, this.snapshots.project.reload, this.projectService.activeProject, this.reload)
|
|
90
|
-
.pipe(debounceTime(300),
|
|
91
|
-
// distinctUntilChanged(),
|
|
92
|
-
switchMap(() => this.getSnapshots(this.snapshots.project, 'NONE'))).subscribe((snapshots) => {
|
|
93
|
-
this.snapshots.project.data = snapshots;
|
|
94
|
-
});
|
|
95
|
-
this.watchSnapshotChanges();
|
|
96
|
-
this.searchText.subscribe(() => {
|
|
97
|
-
_.forEach(this.snapshots, snapshot => {
|
|
98
|
-
snapshot.page = 1;
|
|
99
|
-
snapshot.offset = 0;
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
ngOnDestroy() {
|
|
105
|
-
if (this.tagSub) {
|
|
106
|
-
this.tagSub.unsubscribe();
|
|
107
|
-
}
|
|
108
|
-
if (this.tagDataSub) {
|
|
109
|
-
this.tagDataSub.unsubscribe();
|
|
110
|
-
}
|
|
111
|
-
this.stopSnapshotWatch();
|
|
112
|
-
}
|
|
113
|
-
async triggerSnapshot(snapshotKey, snapshot) {
|
|
114
|
-
await this.dataProcessorService.triggerProcessor(snapshotKey);
|
|
115
|
-
snapshot.reload.next(Date.now());
|
|
116
|
-
}
|
|
117
|
-
view(datasourceKey) {
|
|
118
|
-
const datasetInstanceSummary = {
|
|
119
|
-
datasetInstanceId: null,
|
|
120
|
-
datasourceInstanceKey: datasourceKey,
|
|
121
|
-
transformationInstances: [],
|
|
122
|
-
parameterValues: {},
|
|
123
|
-
parameters: []
|
|
124
|
-
};
|
|
125
|
-
this.openDialogEditor(datasetInstanceSummary);
|
|
126
|
-
}
|
|
127
|
-
viewParent(parentDatasetInstanceId) {
|
|
128
|
-
this.datasetService.getDataset(parentDatasetInstanceId).then(datasetInstanceSummary => {
|
|
129
|
-
this.openDialogEditor(datasetInstanceSummary);
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
removeActiveTag() {
|
|
133
|
-
this.tagService.resetActiveTag();
|
|
134
|
-
}
|
|
135
|
-
async editSnapshot(snapshotKey, project) {
|
|
136
|
-
const snapshot = await this.dataProcessorService.getProcessor(snapshotKey);
|
|
137
|
-
const datasetInstance = await this.datasetService.getDataset(snapshot.relatedObjectPrimaryKey);
|
|
138
|
-
const dialogRef = this.dialog.open(SnapshotProfileDialogComponent, {
|
|
139
|
-
width: '900px',
|
|
140
|
-
height: '900px',
|
|
141
|
-
data: {
|
|
142
|
-
snapshot,
|
|
143
|
-
datasetInstanceId: snapshot.relatedObjectPrimaryKey,
|
|
144
|
-
datasetInstance
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
dialogRef.afterClosed().subscribe(res => {
|
|
148
|
-
if (res) {
|
|
149
|
-
project.reload.next(Date.now());
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
delete(snapshotProfileId, snapshot) {
|
|
154
|
-
const message = 'Are you sure you would like to remove this Snapshot?';
|
|
155
|
-
if (window.confirm(message)) {
|
|
156
|
-
this.dataProcessorService.removeProcessor(snapshotProfileId).then(() => {
|
|
157
|
-
snapshot.reload.next(Date.now());
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
increaseOffset(snapshot) {
|
|
162
|
-
snapshot.page = snapshot.page + 1;
|
|
163
|
-
snapshot.offset = (snapshot.limit * snapshot.page) - snapshot.limit;
|
|
164
|
-
snapshot.reload.next(Date.now());
|
|
165
|
-
}
|
|
166
|
-
decreaseOffset(snapshot) {
|
|
167
|
-
snapshot.page = snapshot.page <= 1 ? 1 : snapshot.page - 1;
|
|
168
|
-
snapshot.offset = (snapshot.limit * snapshot.page) - snapshot.limit;
|
|
169
|
-
snapshot.reload.next(Date.now());
|
|
170
|
-
}
|
|
171
|
-
pageSizeChange(value, snapshot) {
|
|
172
|
-
snapshot.page = 1;
|
|
173
|
-
snapshot.offset = 0;
|
|
174
|
-
snapshot.limit = value;
|
|
175
|
-
snapshot.reload.next(Date.now());
|
|
176
|
-
}
|
|
177
|
-
openDialogEditor(datasetInstanceSummary) {
|
|
178
|
-
this.router.navigate(['/snapshots'], { fragment: _.kebabCase(datasetInstanceSummary.title || datasetInstanceSummary.datasourceInstanceKey) });
|
|
179
|
-
const dialogRef = this.dialog.open(DataExplorerComponent, {
|
|
180
|
-
width: '100vw',
|
|
181
|
-
height: '100vh',
|
|
182
|
-
maxWidth: '100vw',
|
|
183
|
-
maxHeight: '100vh',
|
|
184
|
-
hasBackdrop: false,
|
|
185
|
-
data: {
|
|
186
|
-
datasetInstanceSummary,
|
|
187
|
-
showChart: false,
|
|
188
|
-
admin: this.admin,
|
|
189
|
-
breadcrumb: 'Snapshots'
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
this.stopSnapshotWatch();
|
|
193
|
-
dialogRef.afterClosed().subscribe(res => {
|
|
194
|
-
if (res && res.breadcrumb) {
|
|
195
|
-
return this.router.navigate([res.breadcrumb], { fragment: null });
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
this.router.navigate(['/snapshots'], { fragment: null });
|
|
199
|
-
}
|
|
200
|
-
this.reload.next(Date.now());
|
|
201
|
-
this.watchSnapshotChanges();
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
getSnapshots(snapshot, tags) {
|
|
205
|
-
return this.dataProcessorService.filterProcessorsByType('snapshot', this.searchText.getValue() || '', snapshot.limit.toString(), snapshot.offset.toString(), tags).pipe(map((snapshots) => {
|
|
206
|
-
snapshot.endOfResults = snapshots.length < snapshot.limit;
|
|
207
|
-
return snapshots;
|
|
208
|
-
}));
|
|
209
|
-
}
|
|
210
|
-
watchSnapshotChanges() {
|
|
211
|
-
this.projectChanges = interval(3000)
|
|
212
|
-
.pipe(switchMap(() => this.dataProcessorService.filterProcessorsByType('snapshot', this.searchText.getValue() || '', String(this.snapshots.project.limit), String(this.snapshots.project.offset), 'NONE').pipe(map(result => {
|
|
213
|
-
return result;
|
|
214
|
-
})))).subscribe(snapshots => {
|
|
215
|
-
this.snapshots.project.data = snapshots;
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
stopSnapshotWatch() {
|
|
219
|
-
if (this.projectChanges) {
|
|
220
|
-
this.projectChanges.unsubscribe();
|
|
221
|
-
}
|
|
222
|
-
if (this.tagChanges) {
|
|
223
|
-
this.tagChanges.unsubscribe();
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
SnapshotsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SnapshotsComponent, deps: [{ token: i1.MatLegacyDialog }, { token: i2.TagService }, { token: i3.ProjectService }, { token: i4.DatasetService }, { token: i5.DataProcessorService }, { token: i6.Router }, { token: KININTEL_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
|
|
228
|
-
SnapshotsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SnapshotsComponent, selector: "ki-snapshots", inputs: { headingLabel: "headingLabel", shared: "shared", admin: "admin", environment: "environment" }, ngImport: i0, template: "<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <div class=\"flex items-center\">\n <h1 class=\"text-2xl font-bold text-gray-900\">Snapshots</h1>\n <mat-chip-list *ngIf=\"activeTag\" class=\"overflow-hidden\">\n <mat-chip class=\"mb-4 ml-2 active-tag\" [removable]=\"true\" (removed)=\"removeActiveTag()\">\n <span><b>{{config.tagLabel || 'Tag'}}: </b>{{activeTag ? activeTag.tag : ''}}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-list>\n </div>\n\n <p class=\"text-sm font-medium text-gray-500\">\n A list of all the snapshots currently available.\n </p>\n </div>\n </div>\n </div>\n</div>\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div *ngIf=\"!canHaveSnapshots\" class=\"mt-8 border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n Snapshots are reserved for our Accredited users. Please <a class=\"font-medium text-yellow-700 underline hover:text-yellow-600\"\n href=\"https://dnsrf.org/joining-options/index.html\">review our Tiers</a> to find out more.\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"canHaveSnapshots\" class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search snapshots\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <ng-template [ngIf]=\"activeTag && snapshots.tag.data.length\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n {{environment.tagLabel}} Snapshots\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n <tr *ngFor=\"let snapshot of snapshots.tag.data\">\n <td>\n <button *ngIf=\"snapshot.taskStatus !== 'RUNNING'\" color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key, snapshots.project)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <svg *ngIf=\"snapshot.taskStatus === 'RUNNING'\"\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </td>\n <td (click)=\"snapshot.taskStatus !== 'PENDING' ? view(snapshot.key + '_latest') : null\"\n class=\"cursor-pointer w-1/2 border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n <div class=\"mb-1 hover:underline\">{{snapshot.snapshotProfileTitle}}</div>\n <div>\n <span class=\"inline-flex text-xs pr-2 font-normal text-gray-500\">\n {{snapshot.relatedObjectTitle}}\n </span>\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [ngClass]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED'}\">\n <ng-template [ngIf]=\"snapshot.taskStatus === 'PENDING'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'RUNNING'\">\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'COMPLETED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'FAILED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'TIMED_OUT'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </ng-template>\n {{_.startCase(snapshot.taskStatus)}}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskLastStartTime}}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskNextStartTime}}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"flex items-center justify-end\">\n <button *ngIf=\"snapshot.config.createHistory\" mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key)\">\n View Historical\n </button>\n <button *ngIf=\"snapshot.config.createLatest\" mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key + '_latest')\">\n View Latest\n </button>\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editSnapshot(snapshot.key, snapshots.tag)\">\n Edit Snapshot\n </button>\n <button mat-menu-item (click)=\"viewParent(snapshot.relatedObjectPrimaryKey)\">\n View Parent Query\n </button>\n <button mat-menu-item\n (click)=\"delete(snapshot.key, snapshots.tag)\">\n Delete Snapshot\n </button>\n </mat-menu>\n </div>\n </td>\n </tr>\n <tr>\n <td colspan=\"6\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{snapshots.tag.offset + 1}} - {{(snapshots.tag.page * snapshots.tag.limit) - (snapshots.tag.limit - snapshots.tag.data.length)}}</div>\n <select [value]=\"snapshots.tag.limit\"\n (change)=\"pageSizeChange($event.target.value, snapshots.tag)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset(snapshots.tag)\"\n [disabled]=\"snapshots.tag.page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset(snapshots.tag)\"\n [disabled]=\"snapshots.tag.endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n\n </div>\n </td>\n </tr>\n </tbody>\n </ng-template>\n <ng-template [ngIf]=\"snapshots.project.data.length\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Project Snapshots\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n <tr *ngFor=\"let snapshot of snapshots.project.data\">\n <td>\n <button *ngIf=\"snapshot.taskStatus !== 'RUNNING'\" color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key, snapshots.project)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <svg *ngIf=\"snapshot.taskStatus === 'RUNNING'\"\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </td>\n <td (click)=\"snapshot.taskStatus !== 'PENDING' ? view(snapshot.key + '_latest') : null\"\n class=\"cursor-pointer w-1/3 border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n <div class=\"mb-1 hover:underline\">{{snapshot.title}}</div>\n <div>\n <span class=\"inline-flex text-xs pr-2 font-normal text-gray-500\">\n {{snapshot.relatedObjectTitle}}\n </span>\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [ngClass]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED', 'bg-purple-500': snapshot.taskStatus === 'TIMED_OUT'}\">\n <ng-template [ngIf]=\"snapshot.taskStatus === 'PENDING'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'RUNNING'\">\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'COMPLETED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'FAILED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'TIMED_OUT'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </ng-template>\n {{_.startCase(snapshot.taskStatus)}}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskLastStartTime}}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskNextStartTime}}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"flex items-center justify-end\">\n <button *ngIf=\"snapshot.config.createHistory\" mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key)\">\n View Historical\n </button>\n <button *ngIf=\"snapshot.config.createLatest\" mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key + '_latest')\">\n View Latest\n </button>\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editSnapshot(snapshot.key, snapshots.project)\">\n Edit Snapshot\n </button>\n <button mat-menu-item (click)=\"viewParent(snapshot.relatedObjectPrimaryKey)\">\n View Parent Query\n </button>\n <button mat-menu-item\n (click)=\"delete(snapshot.key, snapshots.project)\">\n Delete Snapshot\n </button>\n </mat-menu>\n </div>\n </td>\n </tr>\n <tr>\n <td colspan=\"6\"\n class=\"bg-gray-50 whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{snapshots.project.offset + 1}} - {{(snapshots.project.page * snapshots.project.limit) - (snapshots.project.limit - snapshots.project.data.length)}}\n </div>\n <select [value]=\"snapshots.project.limit\"\n (change)=\"pageSizeChange($event.target.value, snapshots.project)\"\n class=\"mr-8 p-2\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset(snapshots.project)\"\n [disabled]=\"snapshots.project.page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset(snapshots.project)\"\n [disabled]=\"snapshots.project.endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n </ng-template>\n\n </table>\n </div>\n </div>\n </div>\n</div>\n", styles: [".divider{width:1px;height:17px;background-color:#cecece}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatLegacyMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i11.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "role", "id", "aria-label", "aria-description", "value", "removable", "highlighted"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "directive", type: i11.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i12.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i12.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i13.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
229
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SnapshotsComponent, decorators: [{
|
|
230
|
-
type: Component,
|
|
231
|
-
args: [{ selector: 'ki-snapshots', template: "<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <div class=\"flex items-center\">\n <h1 class=\"text-2xl font-bold text-gray-900\">Snapshots</h1>\n <mat-chip-list *ngIf=\"activeTag\" class=\"overflow-hidden\">\n <mat-chip class=\"mb-4 ml-2 active-tag\" [removable]=\"true\" (removed)=\"removeActiveTag()\">\n <span><b>{{config.tagLabel || 'Tag'}}: </b>{{activeTag ? activeTag.tag : ''}}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-list>\n </div>\n\n <p class=\"text-sm font-medium text-gray-500\">\n A list of all the snapshots currently available.\n </p>\n </div>\n </div>\n </div>\n</div>\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div *ngIf=\"!canHaveSnapshots\" class=\"mt-8 border-l-4 border-yellow-400 bg-yellow-50 p-4\">\n <div class=\"flex\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <div class=\"ml-3\">\n <p class=\"text-sm text-yellow-700 mb-0\">\n Snapshots are reserved for our Accredited users. Please <a class=\"font-medium text-yellow-700 underline hover:text-yellow-600\"\n href=\"https://dnsrf.org/joining-options/index.html\">review our Tiers</a> to find out more.\n </p>\n </div>\n </div>\n </div>\n <div *ngIf=\"canHaveSnapshots\" class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search snapshots\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <ng-template [ngIf]=\"activeTag && snapshots.tag.data.length\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n {{environment.tagLabel}} Snapshots\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n <tr *ngFor=\"let snapshot of snapshots.tag.data\">\n <td>\n <button *ngIf=\"snapshot.taskStatus !== 'RUNNING'\" color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key, snapshots.project)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <svg *ngIf=\"snapshot.taskStatus === 'RUNNING'\"\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </td>\n <td (click)=\"snapshot.taskStatus !== 'PENDING' ? view(snapshot.key + '_latest') : null\"\n class=\"cursor-pointer w-1/2 border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n <div class=\"mb-1 hover:underline\">{{snapshot.snapshotProfileTitle}}</div>\n <div>\n <span class=\"inline-flex text-xs pr-2 font-normal text-gray-500\">\n {{snapshot.relatedObjectTitle}}\n </span>\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [ngClass]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED'}\">\n <ng-template [ngIf]=\"snapshot.taskStatus === 'PENDING'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'RUNNING'\">\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'COMPLETED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'FAILED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'TIMED_OUT'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </ng-template>\n {{_.startCase(snapshot.taskStatus)}}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskLastStartTime}}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskNextStartTime}}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"flex items-center justify-end\">\n <button *ngIf=\"snapshot.config.createHistory\" mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key)\">\n View Historical\n </button>\n <button *ngIf=\"snapshot.config.createLatest\" mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key + '_latest')\">\n View Latest\n </button>\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editSnapshot(snapshot.key, snapshots.tag)\">\n Edit Snapshot\n </button>\n <button mat-menu-item (click)=\"viewParent(snapshot.relatedObjectPrimaryKey)\">\n View Parent Query\n </button>\n <button mat-menu-item\n (click)=\"delete(snapshot.key, snapshots.tag)\">\n Delete Snapshot\n </button>\n </mat-menu>\n </div>\n </td>\n </tr>\n <tr>\n <td colspan=\"6\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{snapshots.tag.offset + 1}} - {{(snapshots.tag.page * snapshots.tag.limit) - (snapshots.tag.limit - snapshots.tag.data.length)}}</div>\n <select [value]=\"snapshots.tag.limit\"\n (change)=\"pageSizeChange($event.target.value, snapshots.tag)\"\n class=\"mr-8 p-1.5\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset(snapshots.tag)\"\n [disabled]=\"snapshots.tag.page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset(snapshots.tag)\"\n [disabled]=\"snapshots.tag.endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n\n </div>\n </td>\n </tr>\n </tbody>\n </ng-template>\n <ng-template [ngIf]=\"snapshots.project.data.length\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Project Snapshots\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n <tr *ngFor=\"let snapshot of snapshots.project.data\">\n <td>\n <button *ngIf=\"snapshot.taskStatus !== 'RUNNING'\" color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key, snapshots.project)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <svg *ngIf=\"snapshot.taskStatus === 'RUNNING'\"\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </td>\n <td (click)=\"snapshot.taskStatus !== 'PENDING' ? view(snapshot.key + '_latest') : null\"\n class=\"cursor-pointer w-1/3 border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n <div class=\"mb-1 hover:underline\">{{snapshot.title}}</div>\n <div>\n <span class=\"inline-flex text-xs pr-2 font-normal text-gray-500\">\n {{snapshot.relatedObjectTitle}}\n </span>\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [ngClass]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED', 'bg-purple-500': snapshot.taskStatus === 'TIMED_OUT'}\">\n <ng-template [ngIf]=\"snapshot.taskStatus === 'PENDING'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'RUNNING'\">\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'COMPLETED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'FAILED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'TIMED_OUT'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </ng-template>\n {{_.startCase(snapshot.taskStatus)}}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskLastStartTime}}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{snapshot.taskNextStartTime}}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"flex items-center justify-end\">\n <button *ngIf=\"snapshot.config.createHistory\" mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key)\">\n View Historical\n </button>\n <button *ngIf=\"snapshot.config.createLatest\" mat-button\n color=\"primary\"\n [disabled]=\"snapshot.taskStatus === 'PENDING'\"\n (click)=\"view(snapshot.key + '_latest')\">\n View Latest\n </button>\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editSnapshot(snapshot.key, snapshots.project)\">\n Edit Snapshot\n </button>\n <button mat-menu-item (click)=\"viewParent(snapshot.relatedObjectPrimaryKey)\">\n View Parent Query\n </button>\n <button mat-menu-item\n (click)=\"delete(snapshot.key, snapshots.project)\">\n Delete Snapshot\n </button>\n </mat-menu>\n </div>\n </td>\n </tr>\n <tr>\n <td colspan=\"6\"\n class=\"bg-gray-50 whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{snapshots.project.offset + 1}} - {{(snapshots.project.page * snapshots.project.limit) - (snapshots.project.limit - snapshots.project.data.length)}}\n </div>\n <select [value]=\"snapshots.project.limit\"\n (change)=\"pageSizeChange($event.target.value, snapshots.project)\"\n class=\"mr-8 p-2\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset(snapshots.project)\"\n [disabled]=\"snapshots.project.page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset(snapshots.project)\"\n [disabled]=\"snapshots.project.endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n </ng-template>\n\n </table>\n </div>\n </div>\n </div>\n</div>\n", styles: [".divider{width:1px;height:17px;background-color:#cecece}\n"] }]
|
|
232
|
-
}], ctorParameters: function () { return [{ type: i1.MatLegacyDialog }, { type: i2.TagService }, { type: i3.ProjectService }, { type: i4.DatasetService }, { type: i5.DataProcessorService }, { type: i6.Router }, { type: undefined, decorators: [{
|
|
233
|
-
type: Inject,
|
|
234
|
-
args: [KININTEL_CONFIG]
|
|
235
|
-
}] }]; }, propDecorators: { headingLabel: [{
|
|
236
|
-
type: Input
|
|
237
|
-
}], shared: [{
|
|
238
|
-
type: Input
|
|
239
|
-
}], admin: [{
|
|
240
|
-
type: Input
|
|
241
|
-
}], environment: [{
|
|
242
|
-
type: Input
|
|
243
|
-
}] } });
|
|
244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9zbmFwc2hvdHMvc25hcHNob3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9zbmFwc2hvdHMvc25hcHNob3RzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUM3RSxPQUFPLEVBQUMsWUFBWSxFQUF3QixHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFLL0UsT0FBTyxFQUFDLGVBQWUsRUFBdUIsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxPQUFPLEVBQ0gsOEJBQThCLEVBQ2pDLE1BQU0sNEVBQTRFLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQUVwRixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBT3pCLE1BQU0sT0FBTyxrQkFBa0I7SUF5QzNCLFlBQW9CLE1BQWlCLEVBQ2pCLFVBQXNCLEVBQ3RCLGNBQThCLEVBQzlCLGNBQThCLEVBQzlCLG9CQUEwQyxFQUMxQyxNQUFjLEVBQ1UsTUFBNEI7UUFOcEQsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ1UsV0FBTSxHQUFOLE1BQU0sQ0FBc0I7UUF4Q2pFLGNBQVMsR0FBUTtZQUNwQixPQUFPLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRTtnQkFDckIsVUFBVSxFQUFFLEVBQUU7YUFDakI7WUFDRCxHQUFHLEVBQUU7Z0JBQ0QsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRTtnQkFDckIsVUFBVSxFQUFFLEVBQUU7YUFDakI7U0FDSixDQUFDO1FBQ0ssZUFBVSxHQUFHLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUU3QixNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04scUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBR3hCLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBWS9CLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUU3RixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNwRCxJQUFJLEdBQUcsRUFBRTt3QkFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQzt3QkFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQzs2QkFDOUcsSUFBSSxDQUNELFlBQVksQ0FBQyxHQUFHLENBQUM7d0JBQ2pCLDBCQUEwQjt3QkFDMUIsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FDeEMsQ0FDSixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFOzRCQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO3dCQUN4QyxDQUFDLENBQUMsQ0FBQzt3QkFFUCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7NkJBQzNCLElBQUksQ0FDRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQ1gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUM1QyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDdkgsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUNULE9BQU8sTUFBTSxDQUFDO3dCQUNsQixDQUFDLENBQUMsQ0FBQyxDQUNWLENBQ0osQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7NEJBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7d0JBQ3hDLENBQUMsQ0FBQyxDQUFDO3FCQUNWO3lCQUFNO3dCQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO3dCQUN0QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7NEJBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7eUJBQ2pDO3FCQUNKO2dCQUVMLENBQUMsQ0FBQyxDQUFDO2FBQ047WUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztpQkFDaEcsSUFBSSxDQUNELFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDakIsMEJBQTBCO1lBQzFCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDWCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUNwRCxDQUNKLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUU1QixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQzNCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDakMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQ2xCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDN0I7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNqQztRQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxRQUFRO1FBQzlDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlELFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxJQUFJLENBQUMsYUFBYTtRQUNyQixNQUFNLHNCQUFzQixHQUFHO1lBQzNCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIscUJBQXFCLEVBQUUsYUFBYTtZQUNwQyx1QkFBdUIsRUFBRSxFQUFFO1lBQzNCLGVBQWUsRUFBRSxFQUFFO1lBQ25CLFVBQVUsRUFBRSxFQUFFO1NBQ2pCLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sVUFBVSxDQUFDLHVCQUF1QjtRQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ2xGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLGVBQWU7UUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFtQixFQUFFLE9BQVk7UUFDdkQsTUFBTSxRQUFRLEdBQVEsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDL0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUU7WUFDL0QsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsT0FBTztZQUNmLElBQUksRUFBRTtnQkFDRixRQUFRO2dCQUNSLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyx1QkFBdUI7Z0JBQ25ELGVBQWU7YUFDbEI7U0FDSixDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BDLElBQUksR0FBRyxFQUFFO2dCQUNMLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2FBQ25DO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sTUFBTSxDQUFDLGlCQUFpQixFQUFFLFFBQVE7UUFDckMsTUFBTSxPQUFPLEdBQUcsc0RBQXNELENBQUM7UUFDdkUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNuRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVNLGNBQWMsQ0FBQyxRQUFRO1FBQzFCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDbEMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDcEUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxRQUFRO1FBQzFCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDM0QsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDcEUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUTtRQUNqQyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNsQixRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNwQixRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN2QixRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsc0JBQXNCO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLElBQUksc0JBQXNCLENBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLENBQUM7UUFDNUksTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDdEQsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsT0FBTztZQUNmLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLElBQUksRUFBRTtnQkFDRixzQkFBc0I7Z0JBQ3RCLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLFVBQVUsRUFBRSxXQUFXO2FBQzFCO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7YUFDbkU7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFLO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUNuRCxVQUFVLEVBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQ2hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQ3pCLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQzFCLElBQUksQ0FDUCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN0QixRQUFRLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUMxRCxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVPLG9CQUFvQjtRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDL0IsSUFBSSxDQUNELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDWCxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQzVDLFVBQVUsRUFDVixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDM0gsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ1QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FDVixDQUNKLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU8saUJBQWlCO1FBQ3JCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDakM7SUFDTCxDQUFDOztnSEFyUVEsa0JBQWtCLGlNQStDUCxlQUFlO29HQS9DMUIsa0JBQWtCLDRKQ3RCL0Isb3MrQkF3WkE7NEZEbFlhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDSSxjQUFjOzswQkFtRFgsTUFBTTsyQkFBQyxlQUFlOzRDQTdDMUIsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGludGVydmFsLCBtZXJnZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RGF0YUV4cGxvcmVyQ29tcG9uZW50fSBmcm9tICcuLi9kYXRhLWV4cGxvcmVyL2RhdGEtZXhwbG9yZXIuY29tcG9uZW50JztcbmltcG9ydCB7TWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZyc7XG5pbXBvcnQge1RhZ1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RhZy5zZXJ2aWNlJztcbmltcG9ydCB7UHJvamVjdFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2plY3Quc2VydmljZSc7XG5pbXBvcnQge0RhdGFzZXRTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHtLSU5JTlRFTF9DT05GSUcsIEtpbmludGVsTW9kdWxlQ29uZmlnfSBmcm9tICcuLi8uLi9raW5pbnRlbC1jb25maWcnO1xuaW1wb3J0ICogYXMgbG9kYXNoIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gICAgU25hcHNob3RQcm9maWxlRGlhbG9nQ29tcG9uZW50XG59IGZyb20gJy4uL2RhdGEtZXhwbG9yZXIvc25hcHNob3QtcHJvZmlsZS1kaWFsb2cvc25hcHNob3QtcHJvZmlsZS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7RGF0YVByb2Nlc3NvclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEtcHJvY2Vzc29yLnNlcnZpY2UnO1xuY29uc3QgXyA9IGxvZGFzaC5kZWZhdWx0O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2tpLXNuYXBzaG90cycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NuYXBzaG90cy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc25hcHNob3RzLmNvbXBvbmVudC5zYXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgU25hcHNob3RzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgaGVhZGluZ0xhYmVsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc2hhcmVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFkbWluOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGVudmlyb25tZW50OiBhbnk7XG5cbiAgICBwdWJsaWMgc25hcHNob3RzOiBhbnkgPSB7XG4gICAgICAgIHByb2plY3Q6IHtcbiAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIGVuZE9mUmVzdWx0czogZmFsc2UsXG4gICAgICAgICAgICBzaGFyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcmVsb2FkOiBuZXcgU3ViamVjdCgpLFxuICAgICAgICAgICAgY2F0ZWdvcmllczogW11cbiAgICAgICAgfSxcbiAgICAgICAgdGFnOiB7XG4gICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgIGxpbWl0OiAxMCxcbiAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICBlbmRPZlJlc3VsdHM6IGZhbHNlLFxuICAgICAgICAgICAgc2hhcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIHJlbG9hZDogbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtdXG4gICAgICAgIH1cbiAgICB9O1xuICAgIHB1YmxpYyBzZWFyY2hUZXh0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gICAgcHVibGljIGFjdGl2ZVRhZ1N1YiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgcHVibGljIGFjdGl2ZVRhZzogYW55O1xuICAgIHB1YmxpYyBfID0gXztcbiAgICBwdWJsaWMgY2FuSGF2ZVNuYXBzaG90cyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSB0YWdTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIHJlbG9hZCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgcHJpdmF0ZSB0YWdEYXRhU3ViOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBwcm9qZWN0Q2hhbmdlczogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgdGFnQ2hhbmdlczogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHRhZ1NlcnZpY2U6IFRhZ1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkYXRhc2V0U2VydmljZTogRGF0YXNldFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkYXRhUHJvY2Vzc29yU2VydmljZTogRGF0YVByb2Nlc3NvclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgICAgICAgICBASW5qZWN0KEtJTklOVEVMX0NPTkZJRykgcHVibGljIGNvbmZpZzogS2luaW50ZWxNb2R1bGVDb25maWcpIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYW5IYXZlU25hcHNob3RzID0gdGhpcy5wcm9qZWN0U2VydmljZS5kb2VzQWN0aXZlUHJvamVjdEhhdmVQcml2aWxlZ2UoJ3NuYXBzaG90YWNjZXNzJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FuSGF2ZVNuYXBzaG90cykge1xuICAgICAgICAgICAgaWYgKHRoaXMudGFnU2VydmljZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFnU3ViID0gdGhpcy50YWdTZXJ2aWNlLmFjdGl2ZVRhZztcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1N1YiA9IHRoaXMudGFnU2VydmljZS5hY3RpdmVUYWcuc3Vic2NyaWJlKHRhZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFnID0gdGFnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdEYXRhU3ViID0gbWVyZ2UodGhpcy5zZWFyY2hUZXh0LCB0aGlzLnNuYXBzaG90cy50YWcucmVsb2FkLCB0aGlzLnByb2plY3RTZXJ2aWNlLmFjdGl2ZVByb2plY3QsIHRoaXMucmVsb2FkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNuYXBzaG90cyh0aGlzLnNuYXBzaG90cy50YWcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnN1YnNjcmliZSgoc25hcHNob3RzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdHMudGFnLmRhdGEgPSBzbmFwc2hvdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnQ2hhbmdlcyA9IGludGVydmFsKDMwMDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvY2Vzc29yU2VydmljZS5maWx0ZXJQcm9jZXNzb3JzQnlUeXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbmFwc2hvdCcsIHRoaXMuc2VhcmNoVGV4dC5nZXRWYWx1ZSgpIHx8ICcnLCBTdHJpbmcodGhpcy5zbmFwc2hvdHMudGFnLmxpbWl0KSwgU3RyaW5nKHRoaXMuc25hcHNob3RzLnRhZy5vZmZzZXQpKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoc25hcHNob3RzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdHMudGFnLmRhdGEgPSBzbmFwc2hvdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVRhZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50YWdEYXRhU3ViKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdEYXRhU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtZXJnZSh0aGlzLnNlYXJjaFRleHQsIHRoaXMuc25hcHNob3RzLnByb2plY3QucmVsb2FkLCB0aGlzLnByb2plY3RTZXJ2aWNlLmFjdGl2ZVByb2plY3QsIHRoaXMucmVsb2FkKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNuYXBzaG90cyh0aGlzLnNuYXBzaG90cy5wcm9qZWN0LCAnTk9ORScpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApLnN1YnNjcmliZSgoc25hcHNob3RzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90cy5wcm9qZWN0LmRhdGEgPSBzbmFwc2hvdHM7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy53YXRjaFNuYXBzaG90Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRleHQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5zbmFwc2hvdHMsIHNuYXBzaG90ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3QucGFnZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90Lm9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy50YWdTdWIpIHtcbiAgICAgICAgICAgIHRoaXMudGFnU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGFnRGF0YVN1Yikge1xuICAgICAgICAgICAgdGhpcy50YWdEYXRhU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9wU25hcHNob3RXYXRjaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cmlnZ2VyU25hcHNob3Qoc25hcHNob3RLZXksIHNuYXBzaG90KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVByb2Nlc3NvclNlcnZpY2UudHJpZ2dlclByb2Nlc3NvcihzbmFwc2hvdEtleSk7XG4gICAgICAgIHNuYXBzaG90LnJlbG9hZC5uZXh0KERhdGUubm93KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2aWV3KGRhdGFzb3VyY2VLZXkpIHtcbiAgICAgICAgY29uc3QgZGF0YXNldEluc3RhbmNlU3VtbWFyeSA9IHtcbiAgICAgICAgICAgIGRhdGFzZXRJbnN0YW5jZUlkOiBudWxsLFxuICAgICAgICAgICAgZGF0YXNvdXJjZUluc3RhbmNlS2V5OiBkYXRhc291cmNlS2V5LFxuICAgICAgICAgICAgdHJhbnNmb3JtYXRpb25JbnN0YW5jZXM6IFtdLFxuICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzOiB7fSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub3BlbkRpYWxvZ0VkaXRvcihkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmlld1BhcmVudChwYXJlbnREYXRhc2V0SW5zdGFuY2VJZCkge1xuICAgICAgICB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFzZXQocGFyZW50RGF0YXNldEluc3RhbmNlSWQpLnRoZW4oZGF0YXNldEluc3RhbmNlU3VtbWFyeSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9wZW5EaWFsb2dFZGl0b3IoZGF0YXNldEluc3RhbmNlU3VtbWFyeSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVBY3RpdmVUYWcoKSB7XG4gICAgICAgIHRoaXMudGFnU2VydmljZS5yZXNldEFjdGl2ZVRhZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlZGl0U25hcHNob3Qoc25hcHNob3RLZXk6IHN0cmluZywgcHJvamVjdDogYW55KSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90OiBhbnkgPSBhd2FpdCB0aGlzLmRhdGFQcm9jZXNzb3JTZXJ2aWNlLmdldFByb2Nlc3NvcihzbmFwc2hvdEtleSk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXRJbnN0YW5jZSA9IGF3YWl0IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YXNldChzbmFwc2hvdC5yZWxhdGVkT2JqZWN0UHJpbWFyeUtleSk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU25hcHNob3RQcm9maWxlRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzkwMHB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzkwMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBzbmFwc2hvdCxcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5zdGFuY2VJZDogc25hcHNob3QucmVsYXRlZE9iamVjdFByaW1hcnlLZXksXG4gICAgICAgICAgICAgICAgZGF0YXNldEluc3RhbmNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0LnJlbG9hZC5uZXh0KERhdGUubm93KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKHNuYXBzaG90UHJvZmlsZUlkLCBzbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byByZW1vdmUgdGhpcyBTbmFwc2hvdD8nO1xuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb2Nlc3NvclNlcnZpY2UucmVtb3ZlUHJvY2Vzc29yKHNuYXBzaG90UHJvZmlsZUlkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzbmFwc2hvdC5yZWxvYWQubmV4dChEYXRlLm5vdygpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGluY3JlYXNlT2Zmc2V0KHNuYXBzaG90KSB7XG4gICAgICAgIHNuYXBzaG90LnBhZ2UgPSBzbmFwc2hvdC5wYWdlICsgMTtcbiAgICAgICAgc25hcHNob3Qub2Zmc2V0ID0gKHNuYXBzaG90LmxpbWl0ICogc25hcHNob3QucGFnZSkgLSBzbmFwc2hvdC5saW1pdDtcbiAgICAgICAgc25hcHNob3QucmVsb2FkLm5leHQoRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY3JlYXNlT2Zmc2V0KHNuYXBzaG90KSB7XG4gICAgICAgIHNuYXBzaG90LnBhZ2UgPSBzbmFwc2hvdC5wYWdlIDw9IDEgPyAxIDogc25hcHNob3QucGFnZSAtIDE7XG4gICAgICAgIHNuYXBzaG90Lm9mZnNldCA9IChzbmFwc2hvdC5saW1pdCAqIHNuYXBzaG90LnBhZ2UpIC0gc25hcHNob3QubGltaXQ7XG4gICAgICAgIHNuYXBzaG90LnJlbG9hZC5uZXh0KERhdGUubm93KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYWdlU2l6ZUNoYW5nZSh2YWx1ZSwgc25hcHNob3QpIHtcbiAgICAgICAgc25hcHNob3QucGFnZSA9IDE7XG4gICAgICAgIHNuYXBzaG90Lm9mZnNldCA9IDA7XG4gICAgICAgIHNuYXBzaG90LmxpbWl0ID0gdmFsdWU7XG4gICAgICAgIHNuYXBzaG90LnJlbG9hZC5uZXh0KERhdGUubm93KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb3BlbkRpYWxvZ0VkaXRvcihkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5KSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3NuYXBzaG90cyddLCB7ZnJhZ21lbnQ6IF8ua2ViYWJDYXNlKGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUgfHwgZGF0YXNldEluc3RhbmNlU3VtbWFyeS5kYXRhc291cmNlSW5zdGFuY2VLZXkpfSk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGF0YUV4cGxvcmVyQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzEwMHZ3JyxcbiAgICAgICAgICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgICAgIG1heFdpZHRoOiAnMTAwdncnLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGRhdGFzZXRJbnN0YW5jZVN1bW1hcnksXG4gICAgICAgICAgICAgICAgc2hvd0NoYXJ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhZG1pbjogdGhpcy5hZG1pbixcbiAgICAgICAgICAgICAgICBicmVhZGNydW1iOiAnU25hcHNob3RzJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdG9wU25hcHNob3RXYXRjaCgpO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmJyZWFkY3J1bWIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3Jlcy5icmVhZGNydW1iXSwge2ZyYWdtZW50OiBudWxsfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3NuYXBzaG90cyddLCB7ZnJhZ21lbnQ6IG51bGx9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVsb2FkLm5leHQoRGF0ZS5ub3coKSk7XG4gICAgICAgICAgICB0aGlzLndhdGNoU25hcHNob3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U25hcHNob3RzKHNuYXBzaG90LCB0YWdzPykge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhUHJvY2Vzc29yU2VydmljZS5maWx0ZXJQcm9jZXNzb3JzQnlUeXBlKFxuICAgICAgICAgICAgJ3NuYXBzaG90JyxcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGV4dC5nZXRWYWx1ZSgpIHx8ICcnLFxuICAgICAgICAgICAgc25hcHNob3QubGltaXQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHNuYXBzaG90Lm9mZnNldC50b1N0cmluZygpLFxuICAgICAgICAgICAgdGFnc1xuICAgICAgICApLnBpcGUobWFwKChzbmFwc2hvdHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHNuYXBzaG90LmVuZE9mUmVzdWx0cyA9IHNuYXBzaG90cy5sZW5ndGggPCBzbmFwc2hvdC5saW1pdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gc25hcHNob3RzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdhdGNoU25hcHNob3RDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLnByb2plY3RDaGFuZ2VzID0gaW50ZXJ2YWwoMzAwMClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm9jZXNzb3JTZXJ2aWNlLmZpbHRlclByb2Nlc3NvcnNCeVR5cGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAnc25hcHNob3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXh0LmdldFZhbHVlKCkgfHwgJycsIFN0cmluZyh0aGlzLnNuYXBzaG90cy5wcm9qZWN0LmxpbWl0KSwgU3RyaW5nKHRoaXMuc25hcHNob3RzLnByb2plY3Qub2Zmc2V0KSwgJ05PTkUnKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKHNuYXBzaG90cyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdHMucHJvamVjdC5kYXRhID0gc25hcHNob3RzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9wU25hcHNob3RXYXRjaCgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvamVjdENoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdENoYW5nZXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50YWdDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnRhZ0NoYW5nZXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInAtNiBiZy13aGl0ZSBib3JkZXItYiBib3JkZXItZ3JheS0yMDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWQ6ZmxleCBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuIG1kOnNwYWNlLXgtNVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBmbGV4LTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0xLjVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtZ3JheS05MDBcIj5TbmFwc2hvdHM8L2gxPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCAqbmdJZj1cImFjdGl2ZVRhZ1wiIGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgY2xhc3M9XCJtYi00IG1sLTIgYWN0aXZlLXRhZ1wiIFtyZW1vdmFibGVdPVwidHJ1ZVwiIChyZW1vdmVkKT1cInJlbW92ZUFjdGl2ZVRhZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGI+e3tjb25maWcudGFnTGFiZWwgfHwgJ1RhZyd9fTombmJzcDs8L2I+e3thY3RpdmVUYWcgPyBhY3RpdmVUYWcudGFnIDogJyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZT5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgQSBsaXN0IG9mIGFsbCB0aGUgc25hcHNob3RzIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwicHgtNCBzbTpweC02IGxnOnB4LTggbXQtMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhY2FuSGF2ZVNuYXBzaG90c1wiIGNsYXNzPVwibXQtOCBib3JkZXItbC00IGJvcmRlci15ZWxsb3ctNDAwIGJnLXllbGxvdy01MCBwLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImgtNSB3LTUgdGV4dC15ZWxsb3ctNDAwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjQ4NSAyLjQ5NWMuNjczLTEuMTY3IDIuMzU3LTEuMTY3IDMuMDMgMGw2LjI4IDEwLjg3NWMuNjczIDEuMTY3LS4xNyAyLjYyNS0xLjUxNiAyLjYyNUgzLjcyYy0xLjM0NyAwLTIuMTg5LTEuNDU4LTEuNTE1LTIuNjI1TDguNDg1IDIuNDk1ek0xMCA1YS43NS43NSAwIDAxLjc1Ljc1djMuNWEuNzUuNzUgMCAwMS0xLjUgMHYtMy41QS43NS43NSAwIDAxMTAgNXptMCA5YTEgMSAwIDEwMC0yIDEgMSAwIDAwMCAyelwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtc20gdGV4dC15ZWxsb3ctNzAwIG1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFNuYXBzaG90cyBhcmUgcmVzZXJ2ZWQgZm9yIG91ciBBY2NyZWRpdGVkIHVzZXJzLiBQbGVhc2UgPGEgY2xhc3M9XCJmb250LW1lZGl1bSB0ZXh0LXllbGxvdy03MDAgdW5kZXJsaW5lIGhvdmVyOnRleHQteWVsbG93LTYwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL2Ruc3JmLm9yZy9qb2luaW5nLW9wdGlvbnMvaW5kZXguaHRtbFwiPnJldmlldyBvdXIgVGllcnM8L2E+IHRvIGZpbmQgb3V0IG1vcmUuXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNhbkhhdmVTbmFwc2hvdHNcIiBjbGFzcz1cIi1teS0yIC1teC00IHNtOi1teC02IGxnOi1teC04XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5saW5lLWJsb2NrIG1pbi13LWZ1bGwgcHktMiBhbGlnbi1taWRkbGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBzbTptdC0wIGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibW9iaWxlLXNlYXJjaC1jYW5kaWRhdGVcIiBjbGFzcz1cInNyLW9ubHlcIj5TZWFyY2g8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXgtZ3JvdyBmb2N1cy13aXRoaW46ei0xMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIHBsLTMgZmxleCBpdGVtcy1jZW50ZXIgcG9pbnRlci1ldmVudHMtbm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaC01IHctNSB0ZXh0LWdyYXktNDAwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04IDRhNCA0IDAgMTAwIDggNCA0IDAgMDAwLTh6TTIgOGE2IDYgMCAxMTEwLjg5IDMuNDc2bDQuODE3IDQuODE3YTEgMSAwIDAxLTEuNDE0IDEuNDE0bC00LjgxNi00LjgxNkE2IDYgMCAwMTIgOHpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC1ydWxlPVwiZXZlbm9kZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm1vYmlsZS1zZWFyY2gtY2FuZGlkYXRlXCIgaWQ9XCJtb2JpbGUtc2VhcmNoLWNhbmRpZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdy1mdWxsIHJvdW5kZWQtbm9uZSBwbC0xMCBib3JkZXItdC0wIGJvcmRlci1sLTAgYm9yZGVyLWdyYXktMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc25hcHNob3RzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cInNlYXJjaFRleHQubmV4dCgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cIm1pbi13LWZ1bGwgYm9yZGVyLXNlcGFyYXRlXCIgc3R5bGU9XCJib3JkZXItc3BhY2luZzogMFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiYWN0aXZlVGFnICYmIHNuYXBzaG90cy50YWcuZGF0YS5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZCBjbGFzcz1cImJnLWdyYXktMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGlja3kgdG9wLTAgei0xMCBib3JkZXItYiBib3JkZXItZ3JheS0zMDAgYmctZ3JheS01MCBiZy1vcGFjaXR5LTc1IHB5LTMuNSBweC00IHRleHQtbGVmdCB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCBiYWNrZHJvcC1ibHVyIGJhY2tkcm9wLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGlja3kgdG9wLTAgei0xMCBib3JkZXItYiBib3JkZXItZ3JheS0zMDAgYmctZ3JheS01MCBiZy1vcGFjaXR5LTc1IHB5LTMuNSBweC00IHRleHQtbGVmdCB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCBiYWNrZHJvcC1ibHVyIGJhY2tkcm9wLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2Vudmlyb25tZW50LnRhZ0xhYmVsfX0gU25hcHNob3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgdGV4dC1sZWZ0IHRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGJhY2tkcm9wLWJsdXIgYmFja2Ryb3AtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGlja3kgdG9wLTAgei0xMCBib3JkZXItYiBib3JkZXItZ3JheS0zMDAgYmctZ3JheS01MCBiZy1vcGFjaXR5LTc1IHB5LTMuNSBweC00IHRleHQtbGVmdCB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCBiYWNrZHJvcC1ibHVyIGJhY2tkcm9wLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IFN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dCBTdGFydCBUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+RWRpdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJiZy13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBzbmFwc2hvdCBvZiBzbmFwc2hvdHMudGFnLmRhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzbmFwc2hvdC50YXNrU3RhdHVzICE9PSAnUlVOTklORydcIiBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJUcmlnZ2VyIHNuYXBzaG90IHRvIHJ1biBub3dcIiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlclNuYXBzaG90KHNuYXBzaG90LmtleSwgc25hcHNob3RzLnByb2plY3QpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cGxheV9hcnJvdzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwic25hcHNob3QudGFza1N0YXR1cyA9PT0gJ1JVTk5JTkcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFuaW1hdGUtc3BpbiBtbC0zIG1yLTIgaC01IHctNSB0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cIm9wYWNpdHktMjVcIiBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwib3BhY2l0eS03NVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3elwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKGNsaWNrKT1cInNuYXBzaG90LnRhc2tTdGF0dXMgIT09ICdQRU5ESU5HJyA/IHZpZXcoc25hcHNob3Qua2V5ICsgJ19sYXRlc3QnKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIHctMS8yIGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBweS0yIHB4LTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0xIGhvdmVyOnVuZGVybGluZVwiPnt7c25hcHNob3Quc25hcHNob3RQcm9maWxlVGl0bGV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmxpbmUtZmxleCB0ZXh0LXhzIHByLTIgZm9udC1ub3JtYWwgdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c25hcHNob3QucmVsYXRlZE9iamVjdFRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgcHktMC41IHB4LTIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggdGV4dC1zbSBsb3dlcmNhc2UgZmxleCBpdGVtcy1jZW50ZXIgdGV4dC13aGl0ZSBweC0zIHJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3B5LTAuNSc6IHNuYXBzaG90LnRhc2tTdGF0dXMgIT09ICdSVU5OSU5HJywncHktMSc6IHNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdSVU5OSU5HJywgJ2JnLWdyYXktNDAwJzogc25hcHNob3QudGFza1N0YXR1cyA9PT0gJ1BFTkRJTkcnLCAnYmctc2Vjb25kYXJ5Jzogc25hcHNob3QudGFza1N0YXR1cyA9PT0gJ1JVTk5JTkcnLCAnYmctc3VjY2Vzcyc6IHNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdDT01QTEVURUQnLCAnYmctZGFuZ2VyJzogc25hcHNob3QudGFza1N0YXR1cyA9PT0gJ0ZBSUxFRCd9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic25hcHNob3QudGFza1N0YXR1cyA9PT0gJ1BFTkRJTkcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIGNsYXNzPVwiLW1sLTEgdy02IGgtNiBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNnY2aDQuNW00LjUgMGE5IDkgMCAxMS0xOCAwIDkgOSAwIDAxMTggMHpcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdSVU5OSU5HJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJhbmltYXRlLXNwaW4gLW1sLTEgbXItMyBoLTUgdy01IHRleHQtd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwib3BhY2l0eS0yNVwiIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwib3BhY2l0eS03NVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQgMTJhOCA4IDAgMDE4LThWMEM1LjM3MyAwIDAgNS4zNzMgMCAxMmg0em0yIDUuMjkxQTcuOTYyIDcuOTYyIDAgMDE0IDEySDBjMCAzLjA0MiAxLjEzNSA1LjgyNCAzIDcuOTM4bDMtMi42NDd6XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnQ09NUExFVEVEJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cIi1tbC0xIHctNiBoLTYgbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMTIuNzVMMTEuMjUgMTUgMTUgOS43NU0yMSAxMmE5IDkgMCAxMS0xOCAwIDkgOSAwIDAxMTggMHpcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdGQUlMRUQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIGNsYXNzPVwiLW1sLTEgdy02IGgtNiBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgOXYzLjc1bS05LjMwMyAzLjM3NmMtLjg2NiAxLjUuMjE3IDMuMzc0IDEuOTQ4IDMuMzc0aDE0LjcxYzEuNzMgMCAyLjgxMy0xLjg3NCAxLjk0OC0zLjM3NEwxMy45NDkgMy4zNzhjLS44NjYtMS41LTMuMDMyLTEuNS0zLjg5OCAwTDIuNjk3IDE2LjEyNnpNMTIgMTUuNzVoLjAwN3YuMDA4SDEydi0uMDA4elwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic25hcHNob3QudGFza1N0YXR1cyA9PT0gJ1RJTUVEX09VVCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cIi1tbC0xIHctNiBoLTYgbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBkPVwiTTE0LjI1IDl2Nm0tNC41IDBWOU0yMSAxMmE5IDkgMCAxMS0xOCAwIDkgOSAwIDAxMTggMHpcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Xy5zdGFydENhc2Uoc25hcHNob3QudGFza1N0YXR1cyl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBweS0yIHB4LTQgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c25hcHNob3QudGFza0xhc3RTdGFydFRpbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIHB5LTIgcHgtNCB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzbmFwc2hvdC50YXNrTmV4dFN0YXJ0VGltZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJyZWxhdGl2ZSB3aGl0ZXNwYWNlLW5vd3JhcCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgcHktMiBweC00IHRleHQtcmlnaHQgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzbmFwc2hvdC5jb25maWcuY3JlYXRlSGlzdG9yeVwiIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdQRU5ESU5HJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3KHNuYXBzaG90LmtleSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IEhpc3RvcmljYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNuYXBzaG90LmNvbmZpZy5jcmVhdGVMYXRlc3RcIiBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnUEVORElORydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlldyhzbmFwc2hvdC5rZXkgKyAnX2xhdGVzdCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBMYXRlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJpdGVtTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2l0ZW1NZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZWRpdFNuYXBzaG90KHNuYXBzaG90LmtleSwgc25hcHNob3RzLnRhZylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBTbmFwc2hvdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwidmlld1BhcmVudChzbmFwc2hvdC5yZWxhdGVkT2JqZWN0UHJpbWFyeUtleSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBQYXJlbnQgUXVlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoc25hcHNob3Qua2V5LCBzbmFwc2hvdHMudGFnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUgU25hcHNob3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyLXQgYmctZ3JheS01MCB3aGl0ZXNwYWNlLW5vd3JhcCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgcHktMSBweC00IHRleHQtc20gdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFnaW5nLXRvb2xiYXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1lbmRcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgdGV4dC1ncmF5LTQwMCBtci0xMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93aW5nIHt7c25hcHNob3RzLnRhZy5vZmZzZXQgKyAxfX0gLSB7eyhzbmFwc2hvdHMudGFnLnBhZ2UgKiBzbmFwc2hvdHMudGFnLmxpbWl0KSAtIChzbmFwc2hvdHMudGFnLmxpbWl0IC0gc25hcHNob3RzLnRhZy5kYXRhLmxlbmd0aCl9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgW3ZhbHVlXT1cInNuYXBzaG90cy50YWcubGltaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJwYWdlU2l6ZUNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlLCBzbmFwc2hvdHMudGFnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1yLTggcC0xLjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMVwiPjE8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiNVwiPjU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMTBcIj4xMDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIyNVwiPjI1PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjUwXCI+NTA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMTAwXCI+MTAwPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjI1MFwiPjI1MDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxMDAwXCI+MTAwMDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNsYXNzPVwibXItNFwiIChjbGljayk9XCJkZWNyZWFzZU9mZnNldChzbmFwc2hvdHMudGFnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic25hcHNob3RzLnRhZy5wYWdlIDw9IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fbGVmdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImluY3JlYXNlT2Zmc2V0KHNuYXBzaG90cy50YWcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzbmFwc2hvdHMudGFnLmVuZE9mUmVzdWx0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzbmFwc2hvdHMucHJvamVjdC5kYXRhLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkIGNsYXNzPVwiYmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgdGV4dC1sZWZ0IHRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGJhY2tkcm9wLWJsdXIgYmFja2Ryb3AtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgdGV4dC1sZWZ0IHRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGJhY2tkcm9wLWJsdXIgYmFja2Ryb3AtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgU25hcHNob3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgdGV4dC1sZWZ0IHRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGJhY2tkcm9wLWJsdXIgYmFja2Ryb3AtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGlja3kgdG9wLTAgei0xMCBib3JkZXItYiBib3JkZXItZ3JheS0zMDAgYmctZ3JheS01MCBiZy1vcGFjaXR5LTc1IHB5LTMuNSBweC00IHRleHQtbGVmdCB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCBiYWNrZHJvcC1ibHVyIGJhY2tkcm9wLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IFN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dCBTdGFydCBUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+RWRpdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJiZy13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBzbmFwc2hvdCBvZiBzbmFwc2hvdHMucHJvamVjdC5kYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic25hcHNob3QudGFza1N0YXR1cyAhPT0gJ1JVTk5JTkcnXCIgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiVHJpZ2dlciBzbmFwc2hvdCB0byBydW4gbm93XCIgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJTbmFwc2hvdChzbmFwc2hvdC5rZXksIHNuYXBzaG90cy5wcm9qZWN0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnBsYXlfYXJyb3c8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdSVU5OSU5HJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbmltYXRlLXNwaW4gbWwtMyBtci0yIGgtNSB3LTUgdGV4dC1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJvcGFjaXR5LTI1XCIgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cIm9wYWNpdHktNzVcIiBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNCAxMmE4IDggMCAwMTgtOFYwQzUuMzczIDAgMCA1LjM3MyAwIDEyaDR6bTIgNS4yOTFBNy45NjIgNy45NjIgMCAwMTQgMTJIMGMwIDMuMDQyIDEuMTM1IDUuODI0IDMgNy45MzhsMy0yLjY0N3pcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIChjbGljayk9XCJzbmFwc2hvdC50YXNrU3RhdHVzICE9PSAnUEVORElORycgPyB2aWV3KHNuYXBzaG90LmtleSArICdfbGF0ZXN0JykgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB3LTEvMyBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgcHktMiBweC00IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMSBob3Zlcjp1bmRlcmxpbmVcIj57e3NuYXBzaG90LnRpdGxlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggdGV4dC14cyBwci0yIGZvbnQtbm9ybWFsIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NuYXBzaG90LnJlbGF0ZWRPYmplY3RUaXRsZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIHB5LTAuNSBweC0yIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlubGluZS1mbGV4IHRleHQtc20gbG93ZXJjYXNlIGZsZXggaXRlbXMtY2VudGVyIHRleHQtd2hpdGUgcHgtMyByb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydweS0wLjUnOiBzbmFwc2hvdC50YXNrU3RhdHVzICE9PSAnUlVOTklORycsJ3B5LTEnOiBzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnUlVOTklORycsICdiZy1ncmF5LTQwMCc6IHNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdQRU5ESU5HJywgJ2JnLXNlY29uZGFyeSc6IHNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdSVU5OSU5HJywgJ2JnLXN1Y2Nlc3MnOiBzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnQ09NUExFVEVEJywgJ2JnLWRhbmdlcic6IHNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdGQUlMRUQnLCAnYmctcHVycGxlLTUwMCc6IHNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdUSU1FRF9PVVQnfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdQRU5ESU5HJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cIi1tbC0xIHctNiBoLTYgbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDZ2Nmg0LjVtNC41IDBhOSA5IDAgMTEtMTggMCA5IDkgMCAwMTE4IDB6XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnUlVOTklORydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYW5pbWF0ZS1zcGluIC1tbC0xIG1yLTMgaC01IHctNSB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cIm9wYWNpdHktMjVcIiBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cIm9wYWNpdHktNzVcIiBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3elwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic25hcHNob3QudGFza1N0YXR1cyA9PT0gJ0NPTVBMRVRFRCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgY2xhc3M9XCItbWwtMSB3LTYgaC02IG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05IDEyLjc1TDExLjI1IDE1IDE1IDkuNzVNMjEgMTJhOSA5IDAgMTEtMTggMCA5IDkgMCAwMTE4IDB6XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnRkFJTEVEJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cIi1tbC0xIHctNiBoLTYgbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDl2My43NW0tOS4zMDMgMy4zNzZjLS44NjYgMS41LjIxNyAzLjM3NCAxLjk0OCAzLjM3NGgxNC43MWMxLjczIDAgMi44MTMtMS44NzQgMS45NDgtMy4zNzRMMTMuOTQ5IDMuMzc4Yy0uODY2LTEuNS0zLjAzMi0xLjUtMy44OTggMEwyLjY5NyAxNi4xMjZ6TTEyIDE1Ljc1aC4wMDd2LjAwOEgxMnYtLjAwOHpcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdUSU1FRF9PVVQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgY2xhc3M9XCItbWwtMSB3LTYgaC02IG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgZD1cIk0xNC4yNSA5djZtLTQuNSAwVjlNMjEgMTJhOSA5IDAgMTEtMTggMCA5IDkgMCAwMTE4IDB6XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e18uc3RhcnRDYXNlKHNuYXBzaG90LnRhc2tTdGF0dXMpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgcHktMiBweC00IHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NuYXBzaG90LnRhc2tMYXN0U3RhcnRUaW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBweS0yIHB4LTQgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c25hcHNob3QudGFza05leHRTdGFydFRpbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicmVsYXRpdmUgd2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIHB5LTIgcHgtNCB0ZXh0LXJpZ2h0IHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic25hcHNob3QuY29uZmlnLmNyZWF0ZUhpc3RvcnlcIiBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnUEVORElORydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlldyhzbmFwc2hvdC5rZXkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBIaXN0b3JpY2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzbmFwc2hvdC5jb25maWcuY3JlYXRlTGF0ZXN0XCIgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic25hcHNob3QudGFza1N0YXR1cyA9PT0gJ1BFTkRJTkcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInZpZXcoc25hcHNob3Qua2V5ICsgJ19sYXRlc3QnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgTGF0ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiaXRlbU1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNpdGVtTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImVkaXRTbmFwc2hvdChzbmFwc2hvdC5rZXksIHNuYXBzaG90cy5wcm9qZWN0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0IFNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJ2aWV3UGFyZW50KHNuYXBzaG90LnJlbGF0ZWRPYmplY3RQcmltYXJ5S2V5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IFBhcmVudCBRdWVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZShzbmFwc2hvdC5rZXksIHNuYXBzaG90cy5wcm9qZWN0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUgU25hcHNob3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmctZ3JheS01MCB3aGl0ZXNwYWNlLW5vd3JhcCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgcHktMiBweC00IHRleHQtc20gdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFnaW5nLXRvb2xiYXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1lbmRcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgdGV4dC1ncmF5LTQwMCBtci0xMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93aW5nIHt7c25hcHNob3RzLnByb2plY3Qub2Zmc2V0ICsgMX19IC0ge3soc25hcHNob3RzLnByb2plY3QucGFnZSAqIHNuYXBzaG90cy5wcm9qZWN0LmxpbWl0KSAtIChzbmFwc2hvdHMucHJvamVjdC5saW1pdCAtIHNuYXBzaG90cy5wcm9qZWN0LmRhdGEubGVuZ3RoKX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBbdmFsdWVdPVwic25hcHNob3RzLnByb2plY3QubGltaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJwYWdlU2l6ZUNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlLCBzbmFwc2hvdHMucHJvamVjdClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtci04IHAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxXCI+MTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCI1XCI+NTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxMFwiPjEwPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjI1XCI+MjU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiNTBcIj41MDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxMDBcIj4xMDA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMjUwXCI+MjUwPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjEwMDBcIj4xMDAwPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJtci00XCIgKGNsaWNrKT1cImRlY3JlYXNlT2Zmc2V0KHNuYXBzaG90cy5wcm9qZWN0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic25hcHNob3RzLnByb2plY3QucGFnZSA8PSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX2xlZnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJpbmNyZWFzZU9mZnNldChzbmFwc2hvdHMucHJvamVjdClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNuYXBzaG90cy5wcm9qZWN0LmVuZE9mUmVzdWx0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
|