@c8y/ngx-components 1021.49.12 → 1021.51.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/aggregation/aggregation.model.d.ts.map +1 -0
- package/core/aggregation/aggregation.service.d.ts +44 -0
- package/core/aggregation/aggregation.service.d.ts.map +1 -0
- package/core/aggregation/index.d.ts +3 -0
- package/core/aggregation/index.d.ts.map +1 -0
- package/core/common/index.d.ts +0 -2
- package/core/common/index.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
- package/core/i18n/pattern-messages.data.d.ts +18 -0
- package/core/i18n/pattern-messages.data.d.ts.map +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +54 -42
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +28 -8
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +3 -52
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts +5 -14
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -1
- package/device-grid/device-grid.component.d.ts.map +1 -1
- package/device-grid/device-grid.service.d.ts +2 -0
- package/device-grid/device-grid.service.d.ts.map +1 -1
- package/esm2022/alarms/alarms-type-filter.component.mjs +3 -3
- package/esm2022/core/aggregation/aggregation.model.mjs +46 -0
- package/esm2022/core/aggregation/aggregation.service.mjs +76 -0
- package/esm2022/core/aggregation/index.mjs +3 -0
- package/esm2022/core/common/index.mjs +1 -3
- package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +2 -2
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +2 -2
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +4 -4
- package/esm2022/core/i18n/pattern-messages.data.mjs +19 -1
- package/esm2022/core/index.mjs +2 -1
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +166 -164
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +82 -48
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +5 -95
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.mjs +3 -3
- package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +3 -3
- package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +1 -9
- package/esm2022/device-grid/device-grid.component.mjs +3 -3
- package/esm2022/device-grid/device-grid.service.mjs +16 -1
- package/esm2022/device-list/add-smart-group.component.mjs +3 -3
- package/esm2022/interval-picker/interval-picker.model.mjs +5 -1
- package/esm2022/operations/bulk-operation-list-item/bulk-operation-list-item.service.mjs +5 -4
- package/esm2022/operations/operation-details/operation-details.module.mjs +7 -7
- package/esm2022/operations/operations-list/device-control.feature.mjs +20 -0
- package/esm2022/operations/operations-list/index.mjs +4 -3
- package/esm2022/operations/operations-list/operations-list-item.component.mjs +11 -9
- package/esm2022/operations/operations-list/operations-list.component.mjs +15 -10
- package/esm2022/operations/operations-list/operations-list.module.mjs +16 -41
- package/esm2022/operations/operations-list/operations-list.service.mjs +4 -3
- package/esm2022/operations/operations.module.mjs +21 -14
- package/esm2022/operations/shared/operations.service.mjs +4 -3
- package/esm2022/services/index.mjs +14 -3
- package/esm2022/services/service-command-tab/c8y-ngx-components-services-service-command-tab.mjs +5 -0
- package/esm2022/services/service-command-tab/index.mjs +3 -0
- package/esm2022/services/service-command-tab/service-command-tab.component.mjs +33 -0
- package/esm2022/services/service-command-tab/service-command.feature.mjs +14 -0
- package/esm2022/services/services-device-tab/index.mjs +9 -3
- package/esm2022/services/services-device-tab/services-device-tab.component.mjs +3 -4
- package/esm2022/services/services-device-tab/services-device-tab.guard.mjs +2 -2
- package/esm2022/services/services-device-tab/services.breadcrumb-factory.mjs +13 -1
- package/esm2022/services/services.module.mjs +4 -2
- package/esm2022/services/shared/c8y-ngx-components-services-shared.mjs +5 -0
- package/esm2022/services/shared/index.mjs +3 -0
- package/esm2022/services/shared/service-command.service.mjs +118 -0
- package/esm2022/services/shared/services.model.mjs +23 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +25 -41
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +3 -3
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +55 -49
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +25 -73
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +20 -20
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +19 -19
- package/fesm2022/c8y-ngx-components-alarms.mjs +2 -2
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +248 -308
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +17 -2
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-list.mjs +2 -2
- package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-interval-picker.mjs +5 -1
- package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +3 -2
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs +5 -5
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +57 -52
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-shared.mjs +3 -2
- package/fesm2022/c8y-ngx-components-operations-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations.mjs +42 -35
- package/fesm2022/c8y-ngx-components-operations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs +49 -0
- package/fesm2022/c8y-ngx-components-services-service-command-tab.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-services-shared.mjs +145 -0
- package/fesm2022/c8y-ngx-components-services-shared.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-services.mjs +20 -113
- package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1075 -1253
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +136 -76
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/interval-picker/interval-picker.model.d.ts +6 -0
- package/interval-picker/interval-picker.model.d.ts.map +1 -1
- package/locales/de.po +52 -41
- package/locales/es.po +52 -41
- package/locales/fr.po +51 -40
- package/locales/ja_JP.po +53 -43
- package/locales/ko.po +51 -34
- package/locales/locales.pot +42 -31
- package/locales/nl.po +52 -41
- package/locales/pl.po +52 -40
- package/locales/pt_BR.po +51 -40
- package/locales/zh_CN.po +50 -33
- package/locales/zh_TW.po +50 -33
- package/operations/bulk-operation-list-item/bulk-operation-list-item.service.d.ts +2 -2
- package/operations/bulk-operation-list-item/bulk-operation-list-item.service.d.ts.map +1 -1
- package/operations/operation-details/operation-details.module.d.ts +1 -1
- package/operations/operations-list/device-control.feature.d.ts +4 -0
- package/operations/operations-list/device-control.feature.d.ts.map +1 -0
- package/operations/operations-list/index.d.ts +3 -2
- package/operations/operations-list/index.d.ts.map +1 -1
- package/operations/operations-list/operations-list-item.component.d.ts +1 -1
- package/operations/operations-list/operations-list-item.component.d.ts.map +1 -1
- package/operations/operations-list/operations-list.component.d.ts +3 -1
- package/operations/operations-list/operations-list.component.d.ts.map +1 -1
- package/operations/operations-list/operations-list.module.d.ts +3 -9
- package/operations/operations-list/operations-list.module.d.ts.map +1 -1
- package/operations/operations.module.d.ts +1 -2
- package/operations/operations.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/services/index.d.ts +13 -2
- package/services/index.d.ts.map +1 -1
- package/services/service-command-tab/c8y-ngx-components-services-service-command-tab.d.ts.map +1 -0
- package/services/service-command-tab/index.d.ts +3 -0
- package/services/service-command-tab/index.d.ts.map +1 -0
- package/services/service-command-tab/service-command-tab.component.d.ts +12 -0
- package/services/service-command-tab/service-command-tab.component.d.ts.map +1 -0
- package/services/service-command-tab/service-command.feature.d.ts +3 -0
- package/services/service-command-tab/service-command.feature.d.ts.map +1 -0
- package/services/services-device-tab/index.d.ts +8 -2
- package/services/services-device-tab/index.d.ts.map +1 -1
- package/services/services-device-tab/services-device-tab.component.d.ts +2 -2
- package/services/services-device-tab/services-device-tab.component.d.ts.map +1 -1
- package/services/services-device-tab/services.breadcrumb-factory.d.ts.map +1 -1
- package/services/services.module.d.ts.map +1 -1
- package/services/shared/c8y-ngx-components-services-shared.d.ts.map +1 -0
- package/services/shared/index.d.ts +3 -0
- package/services/shared/index.d.ts.map +1 -0
- package/services/{services-device-tab → shared}/service-command.service.d.ts +10 -7
- package/services/shared/service-command.service.d.ts.map +1 -0
- package/services/shared/services.model.d.ts +31 -0
- package/services/shared/services.model.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +3 -5
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +7 -2
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +7 -27
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +4 -3
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +5 -5
- package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -1
- package/core/common/aggregation/aggregation.model.d.ts.map +0 -1
- package/core/common/aggregation/aggregation.service.d.ts +0 -17
- package/core/common/aggregation/aggregation.service.d.ts.map +0 -1
- package/esm2022/core/common/aggregation/aggregation.model.mjs +0 -46
- package/esm2022/core/common/aggregation/aggregation.service.mjs +0 -34
- package/esm2022/services/services-device-tab/service-command.service.mjs +0 -113
- package/esm2022/services/services-device-tab/service-device-tab.model.mjs +0 -2
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +0 -124
- package/services/services-device-tab/service-command.service.d.ts.map +0 -1
- package/services/services-device-tab/service-device-tab.model.d.ts +0 -11
- package/services/services-device-tab/service-device-tab.model.d.ts.map +0 -1
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +0 -56
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +0 -1
- /package/core/{common/aggregation → aggregation}/aggregation.model.d.ts +0 -0
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { KeyValuePipe } from '@angular/common';
|
|
2
1
|
import { Component, EventEmitter, Inject, InjectionToken, Input, Output } from '@angular/core';
|
|
3
2
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
3
|
import { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
-
import { AGGREGATION_VALUES, CoreModule, GainsightService } from '@c8y/ngx-components';
|
|
4
|
+
import { AGGREGATION_VALUES, AggregationService, CoreModule, GainsightService } from '@c8y/ngx-components';
|
|
6
5
|
import saveAs from 'file-saver';
|
|
7
6
|
import { debounceTime, merge, Subject, takeUntil } from 'rxjs';
|
|
8
7
|
import { EXPORT_MODE_VALUES, PRODUCT_EXPERIENCE_DATAPOINTS_EXPORT_SELECTOR, SERIES_DATA_MERGED_FILE_NAME } from '../../datapoints-export-selector.model';
|
|
@@ -16,11 +15,11 @@ import { DataPointsExportSelectorTimeRangeComponent } from './datapoints-exports
|
|
|
16
15
|
import { CSVGeneratorAdapter } from './generators/csv-generator';
|
|
17
16
|
import { ExcelGeneratorAdapter } from './generators/excel-generator';
|
|
18
17
|
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "
|
|
20
|
-
import * as i2 from "./data-
|
|
18
|
+
import * as i1 from "@c8y/ngx-components";
|
|
19
|
+
import * as i2 from "./data-processing.service";
|
|
21
20
|
import * as i3 from "./datapoints-export-selector-file-exporter.service";
|
|
22
|
-
import * as i4 from "
|
|
23
|
-
import * as i5 from "@
|
|
21
|
+
import * as i4 from "./data-fetching.service";
|
|
22
|
+
import * as i5 from "@angular/forms";
|
|
24
23
|
import * as i6 from "@angular/common";
|
|
25
24
|
export const FILE_GENERATORS = new InjectionToken('FILE_GENERATORS', {
|
|
26
25
|
providedIn: 'root',
|
|
@@ -47,10 +46,11 @@ export const dateRangeValidator = (control) => {
|
|
|
47
46
|
return null;
|
|
48
47
|
};
|
|
49
48
|
export class DatapointsExportSelectorFileExporterComponent {
|
|
50
|
-
constructor(
|
|
49
|
+
constructor(aggregationService, datapointsExportModalService, datapointsExportSelectorFileExporterService, dataFetchingService, formBuilder, generators, gainsightService) {
|
|
50
|
+
this.aggregationService = aggregationService;
|
|
51
51
|
this.datapointsExportModalService = datapointsExportModalService;
|
|
52
|
-
this.datapointsExportSelectorService = datapointsExportSelectorService;
|
|
53
52
|
this.datapointsExportSelectorFileExporterService = datapointsExportSelectorFileExporterService;
|
|
53
|
+
this.dataFetchingService = dataFetchingService;
|
|
54
54
|
this.formBuilder = formBuilder;
|
|
55
55
|
this.generators = generators;
|
|
56
56
|
this.gainsightService = gainsightService;
|
|
@@ -95,13 +95,13 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
95
95
|
this.setFilesType(this.generators);
|
|
96
96
|
this.dateFromSubject
|
|
97
97
|
.pipe(debounceTime(300), takeUntilDestroyed())
|
|
98
|
-
.subscribe(async (
|
|
99
|
-
await this.updateDateAndFetchData('dateFrom',
|
|
98
|
+
.subscribe(async (dateInfo) => {
|
|
99
|
+
await this.updateDateAndFetchData('dateFrom', dateInfo);
|
|
100
100
|
});
|
|
101
101
|
this.dateToSubject
|
|
102
102
|
.pipe(debounceTime(300), takeUntilDestroyed())
|
|
103
|
-
.subscribe(async (
|
|
104
|
-
await this.updateDateAndFetchData('dateTo',
|
|
103
|
+
.subscribe(async (dateInfo) => {
|
|
104
|
+
await this.updateDateAndFetchData('dateTo', dateInfo);
|
|
105
105
|
});
|
|
106
106
|
}
|
|
107
107
|
setFilesType(generators) {
|
|
@@ -117,7 +117,7 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
119
|
async ngOnInit() {
|
|
120
|
-
const sourcesPermittedToRead = await this.
|
|
120
|
+
const sourcesPermittedToRead = await this.dataFetchingService.getSourcesWithPermissionsToRead(this.exportConfig.datapointDetails);
|
|
121
121
|
if (sourcesPermittedToRead.length === 0) {
|
|
122
122
|
return;
|
|
123
123
|
}
|
|
@@ -128,14 +128,14 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
128
128
|
this.storeInitialChangeableConfig();
|
|
129
129
|
this.fileTypeSelectionState = this.getInitialSelection(this.dynamicFilesTypeMetadata, [0]);
|
|
130
130
|
this.formGroup = this.createForm();
|
|
131
|
-
this.dataToExport = await this.
|
|
131
|
+
this.dataToExport = await this.dataFetchingService.fetchAndPrepareDataToExport(this.exportConfig, this.isFullTypeOfExport);
|
|
132
132
|
this.handleDateSelectorChanges();
|
|
133
133
|
this.determineShowingPreviewOrEmptyState();
|
|
134
134
|
this.handleExportModeChanges();
|
|
135
135
|
this.handleFileTypeSelectionChanges();
|
|
136
136
|
this.handleFormValidationChanges();
|
|
137
137
|
this.updateFileTypeControl();
|
|
138
|
-
this.
|
|
138
|
+
this.updateDisabledAggregationOptions();
|
|
139
139
|
}
|
|
140
140
|
ngOnDestroy() {
|
|
141
141
|
this.destroy$.next();
|
|
@@ -169,13 +169,13 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
169
169
|
const shouldShowAlert = this.datapointsExceedingBrowserDownloadLimit.length > 0;
|
|
170
170
|
// Handles a case where all files are sent by email.
|
|
171
171
|
if (!blob && shouldShowAlert) {
|
|
172
|
-
this.
|
|
172
|
+
this.dataFetchingService.showSendViaEmailInfoAlert(fileType, this.datapointsExceedingBrowserDownloadLimit);
|
|
173
173
|
return;
|
|
174
174
|
}
|
|
175
175
|
if (blob) {
|
|
176
176
|
// Handles the case where some of the files are sent by email.
|
|
177
177
|
if (shouldShowAlert) {
|
|
178
|
-
this.
|
|
178
|
+
this.dataFetchingService.showSendViaEmailInfoAlert(fileType, this.datapointsExceedingBrowserDownloadLimit);
|
|
179
179
|
}
|
|
180
180
|
this.isFullTypeOfExport
|
|
181
181
|
? saveAs(blob, measurementsZipFileName)
|
|
@@ -197,7 +197,7 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
197
197
|
async exportMeasurementFile(fileType) {
|
|
198
198
|
const { acceptType, extension } = this.datapointsExportModalService.fileTypesConfigs[fileType];
|
|
199
199
|
const updatedExportConfig = this.excludeDatapointsThatExceedsApiLimit(this.exportConfig);
|
|
200
|
-
const dataToExport = await this.
|
|
200
|
+
const dataToExport = await this.dataFetchingService.fetchMeasurementDataFilesAndPairWithSourceDetails(acceptType, updatedExportConfig);
|
|
201
201
|
const isAllUndefined = dataToExport.every(data => data === undefined);
|
|
202
202
|
if (isAllUndefined) {
|
|
203
203
|
return null;
|
|
@@ -229,22 +229,30 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
229
229
|
};
|
|
230
230
|
return this.datapointsExportSelectorFileExporterService.getSeriesExportedDataBlob(fileType, this.dataToExport, mergedExportDetails);
|
|
231
231
|
}
|
|
232
|
-
async onAggregationChange(
|
|
233
|
-
this.exportConfig.aggregation
|
|
234
|
-
if (
|
|
235
|
-
|
|
236
|
-
|
|
232
|
+
async onAggregationChange(newAggregation) {
|
|
233
|
+
const currentAggregation = this.exportConfig.aggregation ?? AGGREGATION_VALUES.none;
|
|
234
|
+
if (currentAggregation === newAggregation) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
this.exportConfig.aggregation = newAggregation;
|
|
238
|
+
if (this.isAggregationChangedProgrammatically) {
|
|
239
|
+
return;
|
|
237
240
|
}
|
|
241
|
+
await this.loadExportData();
|
|
242
|
+
this.updateDownloadButtonState();
|
|
238
243
|
}
|
|
239
244
|
onDateFromChange(updatedDate) {
|
|
240
|
-
this.
|
|
245
|
+
this.update(updatedDate, this.exportConfig.dateTo);
|
|
241
246
|
}
|
|
242
247
|
onDateToChange(updatedDate) {
|
|
243
|
-
this.
|
|
248
|
+
this.update(this.exportConfig.dateFrom, updatedDate);
|
|
244
249
|
}
|
|
245
|
-
async updateDateAndFetchData(dateType,
|
|
246
|
-
this.exportConfig[dateType] =
|
|
247
|
-
|
|
250
|
+
async updateDateAndFetchData(dateType, dateInfo) {
|
|
251
|
+
this.exportConfig[dateType] = dateInfo.date;
|
|
252
|
+
if (!dateInfo.shouldFetchData) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
await this.loadExportData();
|
|
248
256
|
if (this.isFullTypeOfExport) {
|
|
249
257
|
await this.determineIfMeasurementResponseWillBeProcessedByBackend();
|
|
250
258
|
}
|
|
@@ -258,19 +266,18 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
258
266
|
this.formGroup.controls.aggregation.setValue(AGGREGATION_VALUES.none);
|
|
259
267
|
this.isAggregationChangedProgrammatically = false;
|
|
260
268
|
this.isFullTypeOfExport = true;
|
|
261
|
-
await this.
|
|
269
|
+
await this.loadExportData();
|
|
262
270
|
await this.determineIfMeasurementResponseWillBeProcessedByBackend();
|
|
263
271
|
return;
|
|
264
272
|
}
|
|
265
273
|
this.resetFullExportRelatedProperties();
|
|
266
274
|
this.isFullTypeOfExport = false;
|
|
267
|
-
await this.
|
|
268
|
-
this.
|
|
275
|
+
await this.loadExportData();
|
|
276
|
+
this.updateDisabledAggregationOptions();
|
|
269
277
|
this.updateDownloadButtonState();
|
|
270
278
|
}
|
|
271
|
-
|
|
272
|
-
this.disabledAggregationOptions =
|
|
273
|
-
this.datapointsExportSelectorFileExporterService.updateDisabledStateOfAggregationOptionEntries(this.formGroup.controls.dateFrom.value, this.formGroup.controls.dateTo.value, this.disabledAggregationOptions);
|
|
279
|
+
updateDisabledAggregationOptions() {
|
|
280
|
+
this.disabledAggregationOptions = this.aggregationService.getDisabledAggregationOptions(this.formGroup.controls.dateFrom.value, this.formGroup.controls.dateTo.value);
|
|
274
281
|
}
|
|
275
282
|
createForm() {
|
|
276
283
|
return this.formBuilder.group({
|
|
@@ -298,8 +305,8 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
298
305
|
const dateToSelector = this.formGroup.controls.dateTo;
|
|
299
306
|
const updateAggregationOptions = () => {
|
|
300
307
|
if (!this.isFullTypeOfExport) {
|
|
301
|
-
this.
|
|
302
|
-
const firstAvailableAggregationValue = this.
|
|
308
|
+
this.updateDisabledAggregationOptions();
|
|
309
|
+
const firstAvailableAggregationValue = this.aggregationService.determineFirstNewAvailableAggregationValue(aggregationControl.value, this.disabledAggregationOptions);
|
|
303
310
|
if (firstAvailableAggregationValue) {
|
|
304
311
|
aggregationControl.setValue(firstAvailableAggregationValue);
|
|
305
312
|
}
|
|
@@ -367,15 +374,15 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
367
374
|
async determineIfMeasurementResponseWillBeProcessedByBackend() {
|
|
368
375
|
this.isPreviewLoading = true;
|
|
369
376
|
this.datapointsExceedingBrowserDownloadLimit =
|
|
370
|
-
await this.
|
|
377
|
+
await this.dataFetchingService.getDatapointsExceedingLimit(this.exportConfig);
|
|
371
378
|
const { browserDownloadableCount, emailDeliverableCount, nonRetrievableCount } = this.calculateDatapointCounts();
|
|
372
379
|
this.hasNoExportableData =
|
|
373
380
|
browserDownloadableCount === 0 && emailDeliverableCount === 0 && nonRetrievableCount > 0;
|
|
374
381
|
if (this.datapointsExceedingBrowserDownloadLimit.length > 0 && !this.hasNoExportableData) {
|
|
375
|
-
this.limitExceededMessage = this.
|
|
382
|
+
this.limitExceededMessage = this.dataFetchingService.getLimitExceededMessage(this.hasNoExportableData, emailDeliverableCount, browserDownloadableCount, nonRetrievableCount, this.exportConfig.datapointDetails.length);
|
|
376
383
|
}
|
|
377
384
|
if (this.datapointsExceedingBrowserDownloadLimit.length > 0 && this.hasNoExportableData) {
|
|
378
|
-
this.limitExceededMessage = this.
|
|
385
|
+
this.limitExceededMessage = this.dataFetchingService.getLimitExceededMessage(this.hasNoExportableData);
|
|
379
386
|
}
|
|
380
387
|
this.updateDownloadButtonState();
|
|
381
388
|
this.isPreviewLoading = false;
|
|
@@ -408,13 +415,13 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
408
415
|
this.exportConfig.aggregation = this.initialAggregation;
|
|
409
416
|
}
|
|
410
417
|
}
|
|
411
|
-
async
|
|
418
|
+
async loadExportData() {
|
|
412
419
|
if (this.formGroup.invalid) {
|
|
413
420
|
return;
|
|
414
421
|
}
|
|
415
422
|
this.isPreviewLoading = true;
|
|
416
423
|
this.onDownloadButtonStateChange.emit(false);
|
|
417
|
-
this.dataToExport = await this.
|
|
424
|
+
this.dataToExport = await this.dataFetchingService.fetchAndPrepareDataToExport(this.exportConfig, this.isFullTypeOfExport);
|
|
418
425
|
this.determineShowingPreviewOrEmptyState();
|
|
419
426
|
}
|
|
420
427
|
updateDownloadButtonState() {
|
|
@@ -444,6 +451,34 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
444
451
|
});
|
|
445
452
|
return initialSelection;
|
|
446
453
|
}
|
|
454
|
+
/**
|
|
455
|
+
* Adjusts both "from" and "to" dates when either is updated:
|
|
456
|
+
* - Resets seconds to 00 even when only one date changes
|
|
457
|
+
* - Prevents persisting hidden seconds ≠ 00 from initial load
|
|
458
|
+
* - Triggers data fetch
|
|
459
|
+
*
|
|
460
|
+
* Example:
|
|
461
|
+
* When user changes "from" date:
|
|
462
|
+
* Input: startDate = "2024-03-26 13:30:45", endDate = "2024-03-27 15:20:45"
|
|
463
|
+
* Result: startDate -> "2024-03-26 14:30:00", endDate -> "2024-03-27 15:20:00"
|
|
464
|
+
*
|
|
465
|
+
* When user changes "to" date:
|
|
466
|
+
* Input: startDate = "2024-03-26 14:30:45", endDate = "2024-03-27 15:20:45"
|
|
467
|
+
* Result: startDate -> "2024-03-26 14:30:00", endDate -> "2024-03-27 16:20:00"
|
|
468
|
+
*
|
|
469
|
+
* @param startDate - The "start" date to be adjusted.
|
|
470
|
+
* @param endDate - The "end" date to be adjusted.
|
|
471
|
+
*/
|
|
472
|
+
update(startDate, endDate) {
|
|
473
|
+
this.dateFromSubject.next({
|
|
474
|
+
date: this.dataFetchingService.adjustDate(startDate, 0),
|
|
475
|
+
shouldFetchData: false
|
|
476
|
+
});
|
|
477
|
+
this.dateToSubject.next({
|
|
478
|
+
date: this.dataFetchingService.adjustDate(endDate, 0),
|
|
479
|
+
shouldFetchData: true
|
|
480
|
+
});
|
|
481
|
+
}
|
|
447
482
|
triggerGainsightDownloadEvent(selectedFileExports) {
|
|
448
483
|
const commonEventData = {
|
|
449
484
|
action: PRODUCT_EXPERIENCE_DATAPOINTS_EXPORT_SELECTOR.ACTIONS.DOWNLOAD_STARTED,
|
|
@@ -465,8 +500,8 @@ export class DatapointsExportSelectorFileExporterComponent {
|
|
|
465
500
|
});
|
|
466
501
|
}
|
|
467
502
|
}
|
|
468
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsExportSelectorFileExporterComponent, deps: [{ token: i1.
|
|
469
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsExportSelectorFileExporterComponent, isStandalone: true, selector: "c8y-datapoints-export-selector-file-exporter", inputs: { exportConfig: "exportConfig" }, outputs: { onDownloadButtonStateChange: "onDownloadButtonStateChange" }, ngImport: i0, template: "<div class=\"p-b-16\">\n <ng-container *ngIf=\"hasPermissionToReadAnyMeasurements; else hasNoRoleToReadAnyMeasurements\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Configure export' | translate }}\n </p>\n </div>\n <div\n class=\"p-t-24 p-r-16 p-l-16 gap-8 p-b-16 flex-wrap\"\n [ngClass]=\"{ 'separator-bottom': isFullTypeOfExport }\"\n >\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-time-range\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [formGroup]=\"formGroup\"\n (onDateFromChange)=\"onDateFromChange($event)\"\n (onDateToChange)=\"onDateToChange($event)\"\n ></c8y-datapoints-export-selector-time-range>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-data-scope\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [disabledAggregationOptions]=\"disabledAggregationOptions\"\n [formGroup]=\"formGroup\"\n (onAggregationChange)=\"onAggregationChange($event)\"\n (onExportTypeChange)=\"onExportTypeChange($event)\"\n ></c8y-datapoints-export-selector-data-scope>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-file-types\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [dynamicFilesTypeMetadata]=\"dynamicFilesTypeMetadata\"\n [formGroup]=\"formGroup\"\n ></c8y-datapoints-export-selector-file-types>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"!isFullTypeOfExport && !hasFetchedDataAnyValuesToExport && !isPreviewLoading\"\n >\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16
|
|
503
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsExportSelectorFileExporterComponent, deps: [{ token: i1.AggregationService }, { token: i2.DataProcessingService }, { token: i3.DatapointsExportSelectorFileExporterService }, { token: i4.DataFetchingService }, { token: i5.FormBuilder }, { token: FILE_GENERATORS }, { token: i1.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
504
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsExportSelectorFileExporterComponent, isStandalone: true, selector: "c8y-datapoints-export-selector-file-exporter", inputs: { exportConfig: "exportConfig" }, outputs: { onDownloadButtonStateChange: "onDownloadButtonStateChange" }, ngImport: i0, template: "<div class=\"p-b-16\">\n <ng-container *ngIf=\"hasPermissionToReadAnyMeasurements; else hasNoRoleToReadAnyMeasurements\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Configure export' | translate }}\n </p>\n </div>\n <div\n class=\"p-t-24 p-r-16 p-l-16 gap-8 p-b-16 flex-wrap\"\n [ngClass]=\"{ 'separator-bottom': isFullTypeOfExport }\"\n >\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-time-range\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [formGroup]=\"formGroup\"\n (onDateFromChange)=\"onDateFromChange($event)\"\n (onDateToChange)=\"onDateToChange($event)\"\n ></c8y-datapoints-export-selector-time-range>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-data-scope\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [disabledAggregationOptions]=\"disabledAggregationOptions\"\n [formGroup]=\"formGroup\"\n (onAggregationChange)=\"onAggregationChange($event)\"\n (onExportTypeChange)=\"onExportTypeChange($event)\"\n ></c8y-datapoints-export-selector-data-scope>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-file-types\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [dynamicFilesTypeMetadata]=\"dynamicFilesTypeMetadata\"\n [formGroup]=\"formGroup\"\n ></c8y-datapoints-export-selector-file-types>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"!isFullTypeOfExport && !hasFetchedDataAnyValuesToExport && !isPreviewLoading\"\n >\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div\n class=\"alert alert-warning center-block\"\n role=\"alert\"\n data-cy=\"file-exporter--no-data-available\"\n translate\n >\n No data available.\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"datapointsExceedingBrowserDownloadLimit.length > 0\">\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n [class]=\"\n hasNoExportableData\n ? 'alert alert-warning center-block'\n : 'alert alert-info center-block'\n \"\n role=\"alert\"\n [innerHTML]=\"limitExceededMessage\"\n ></div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isFullTypeOfExport\">\n <c8y-datapoints-export-selector-preview\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [hasFetchedDataAnyValuesToExport]=\"hasFetchedDataAnyValuesToExport\"\n [isPreviewLoading]=\"isPreviewLoading\"\n [previewTableData]=\"previewTableData\"\n ></c8y-datapoints-export-selector-preview>\n </ng-container>\n </ng-container>\n <ng-template #hasNoRoleToReadAnyMeasurements>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div\n class=\"alert alert-info center-block\"\n role=\"alert\"\n translate\n >\n <p>To export data, you must meet at least one of these criteria:</p>\n <ul>\n <li>\n Have\n <b>READ permission for \"Measurements\" permission type</b>\n (either as a global role or for the specific source)\n </li>\n <li>\n Be the\n <b>owner of the source</b>\n you want to export data from\n </li>\n </ul>\n <p>Don't meet these requirements? Contact your system administrator for assistance.</p>\n </div>\n </div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DataPointsExportSelectorDataScopeComponent, selector: "c8y-datapoints-export-selector-data-scope", inputs: ["disabledAggregationOptions", "formGroup"], outputs: ["onAggregationChange", "onExportTypeChange"] }, { kind: "component", type: DataPointsExportSelectorFileTypesComponent, selector: "c8y-datapoints-export-selector-file-types", inputs: ["dynamicFilesTypeMetadata", "formGroup"] }, { kind: "component", type: DataPointsExportSelectorPreviewComponent, selector: "c8y-datapoints-export-selector-preview", inputs: ["hasFetchedDataAnyValuesToExport", "isPreviewLoading", "previewTableData"] }, { kind: "component", type: DataPointsExportSelectorTimeRangeComponent, selector: "c8y-datapoints-export-selector-time-range", inputs: ["formGroup"], outputs: ["onDateFromChange", "onDateToChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
|
|
470
505
|
}
|
|
471
506
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsExportSelectorFileExporterComponent, decorators: [{
|
|
472
507
|
type: Component,
|
|
@@ -476,15 +511,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
476
511
|
DataPointsExportSelectorFileTypesComponent,
|
|
477
512
|
DataPointsExportSelectorPreviewComponent,
|
|
478
513
|
DataPointsExportSelectorTimeRangeComponent,
|
|
479
|
-
KeyValuePipe,
|
|
480
514
|
ReactiveFormsModule
|
|
481
|
-
], template: "<div class=\"p-b-16\">\n <ng-container *ngIf=\"hasPermissionToReadAnyMeasurements; else hasNoRoleToReadAnyMeasurements\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Configure export' | translate }}\n </p>\n </div>\n <div\n class=\"p-t-24 p-r-16 p-l-16 gap-8 p-b-16 flex-wrap\"\n [ngClass]=\"{ 'separator-bottom': isFullTypeOfExport }\"\n >\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-time-range\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [formGroup]=\"formGroup\"\n (onDateFromChange)=\"onDateFromChange($event)\"\n (onDateToChange)=\"onDateToChange($event)\"\n ></c8y-datapoints-export-selector-time-range>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-data-scope\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [disabledAggregationOptions]=\"disabledAggregationOptions\"\n [formGroup]=\"formGroup\"\n (onAggregationChange)=\"onAggregationChange($event)\"\n (onExportTypeChange)=\"onExportTypeChange($event)\"\n ></c8y-datapoints-export-selector-data-scope>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-file-types\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [dynamicFilesTypeMetadata]=\"dynamicFilesTypeMetadata\"\n [formGroup]=\"formGroup\"\n ></c8y-datapoints-export-selector-file-types>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"!isFullTypeOfExport && !hasFetchedDataAnyValuesToExport && !isPreviewLoading\"\n >\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16
|
|
482
|
-
}], ctorParameters: () => [{ type: i1.
|
|
515
|
+
], template: "<div class=\"p-b-16\">\n <ng-container *ngIf=\"hasPermissionToReadAnyMeasurements; else hasNoRoleToReadAnyMeasurements\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Configure export' | translate }}\n </p>\n </div>\n <div\n class=\"p-t-24 p-r-16 p-l-16 gap-8 p-b-16 flex-wrap\"\n [ngClass]=\"{ 'separator-bottom': isFullTypeOfExport }\"\n >\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-time-range\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [formGroup]=\"formGroup\"\n (onDateFromChange)=\"onDateFromChange($event)\"\n (onDateToChange)=\"onDateToChange($event)\"\n ></c8y-datapoints-export-selector-time-range>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-data-scope\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [disabledAggregationOptions]=\"disabledAggregationOptions\"\n [formGroup]=\"formGroup\"\n (onAggregationChange)=\"onAggregationChange($event)\"\n (onExportTypeChange)=\"onExportTypeChange($event)\"\n ></c8y-datapoints-export-selector-data-scope>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-file-types\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [dynamicFilesTypeMetadata]=\"dynamicFilesTypeMetadata\"\n [formGroup]=\"formGroup\"\n ></c8y-datapoints-export-selector-file-types>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"!isFullTypeOfExport && !hasFetchedDataAnyValuesToExport && !isPreviewLoading\"\n >\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div\n class=\"alert alert-warning center-block\"\n role=\"alert\"\n data-cy=\"file-exporter--no-data-available\"\n translate\n >\n No data available.\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"datapointsExceedingBrowserDownloadLimit.length > 0\">\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n [class]=\"\n hasNoExportableData\n ? 'alert alert-warning center-block'\n : 'alert alert-info center-block'\n \"\n role=\"alert\"\n [innerHTML]=\"limitExceededMessage\"\n ></div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isFullTypeOfExport\">\n <c8y-datapoints-export-selector-preview\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [hasFetchedDataAnyValuesToExport]=\"hasFetchedDataAnyValuesToExport\"\n [isPreviewLoading]=\"isPreviewLoading\"\n [previewTableData]=\"previewTableData\"\n ></c8y-datapoints-export-selector-preview>\n </ng-container>\n </ng-container>\n <ng-template #hasNoRoleToReadAnyMeasurements>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div\n class=\"alert alert-info center-block\"\n role=\"alert\"\n translate\n >\n <p>To export data, you must meet at least one of these criteria:</p>\n <ul>\n <li>\n Have\n <b>READ permission for \"Measurements\" permission type</b>\n (either as a global role or for the specific source)\n </li>\n <li>\n Be the\n <b>owner of the source</b>\n you want to export data from\n </li>\n </ul>\n <p>Don't meet these requirements? Contact your system administrator for assistance.</p>\n </div>\n </div>\n </ng-template>\n</div>\n" }]
|
|
516
|
+
}], ctorParameters: () => [{ type: i1.AggregationService }, { type: i2.DataProcessingService }, { type: i3.DatapointsExportSelectorFileExporterService }, { type: i4.DataFetchingService }, { type: i5.FormBuilder }, { type: undefined, decorators: [{
|
|
483
517
|
type: Inject,
|
|
484
518
|
args: [FILE_GENERATORS]
|
|
485
|
-
}] }, { type:
|
|
519
|
+
}] }, { type: i1.GainsightService }], propDecorators: { exportConfig: [{
|
|
486
520
|
type: Input
|
|
487
521
|
}], onDownloadButtonStateChange: [{
|
|
488
522
|
type: Output
|
|
489
523
|
}] } });
|
|
490
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1tb2RhbC9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtZXhwb3J0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItbW9kYWwvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFHTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUVMLFdBQVcsRUFDWCxXQUFXLEVBQ1gsbUJBQW1CLEVBR3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUdsQixVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxF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RSxDQUFDO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQ2hDLDZDQUE2QyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQ3BFO2dCQUNFLEdBQUcsZUFBZTtnQkFDbEIsa0JBQWtCLEVBQ2hCLDZDQUE2QyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0I7YUFDL0UsQ0FDRixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUNoQyw2Q0FBNkMsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUNwRTtnQkFDRSxHQUFHLGVBQWU7Z0JBQ2xCLGtCQUFrQixFQUNoQiw2Q0FBNkMsQ0FBQyxhQUFhLENBQUMsbUJBQW1CO2dCQUNqRixtQkFBbUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJO2FBQzlFLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOzhHQWxwQlUsNkNBQTZDLGdMQW9HOUMsZUFBZTtrR0FwR2QsNkNBQTZDLDJOQ2xHMUQsNnZIQW1HQSwyQ0RWSSxVQUFVLDhxQkFDViwwQ0FBMEMsbU1BQzFDLDBDQUEwQyx5SUFDMUMsd0NBQXdDLHdLQUN4QywwQ0FBMEMsNkpBRTFDLG1CQUFtQjs7MkZBR1YsNkNBQTZDO2tCQWR6RCxTQUFTOytCQUNFLDhDQUE4QyxjQUU1QyxJQUFJLFdBQ1A7d0JBQ1AsVUFBVTt3QkFDViwwQ0FBMEM7d0JBQzFDLDBDQUEwQzt3QkFDMUMsd0NBQXdDO3dCQUN4QywwQ0FBMEM7d0JBQzFDLFlBQVk7d0JBQ1osbUJBQW1CO3FCQUNwQjs7MEJBc0dFLE1BQU07MkJBQUMsZUFBZTt3RUFuR2hCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0ksMkJBQTJCO3NCQUFwQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5VmFsdWVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JGblxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBBR0dSRUdBVElPTl9WQUxVRVMsXG4gIEFnZ3JlZ2F0aW9uT3B0aW9uLFxuICBBZ2dyZWdhdGlvbk9wdGlvblN0YXR1cyxcbiAgQ29yZU1vZHVsZSxcbiAgR2FpbnNpZ2h0U2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCBzYXZlQXMgZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1lcmdlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERhdGFwb2ludENvdW50cyxcbiAgRGF0YXBvaW50RGV0YWlscyxcbiAgRGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0LFxuICBEYXRhVG9FeHBvcnQsXG4gIERhdGFUb0V4cG9ydFdpdGhCYWNrZW5kQ3JlYXRlZEZpbGUsXG4gIEVYUE9SVF9NT0RFX1ZBTFVFUyxcbiAgRXhwb3J0Q29uZmlnLFxuICBFeHBvcnREYXRhLFxuICBGaWxlRXhwb3J0Q29uZmlnLFxuICBGaWxlR2VuZXJhdG9yLFxuICBGaWxlVHlwZU1ldGFkYXRhLFxuICBNZXJnZWRFeHBvcnREZXRhaWxzLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0VfREFUQVBPSU5UU19FWFBPUlRfU0VMRUNUT1IsXG4gIFNFUklFU19EQVRBX01FUkdFRF9GSUxFX05BTUVcbn0gZnJvbSAnLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IubW9kZWwnO1xuaW1wb3J0IHsgRGF0YUZldGNoaW5nU2VydmljZSB9IGZyb20gJy4vZGF0YS1mZXRjaGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGFQcm9jZXNzaW5nU2VydmljZSB9IGZyb20gJy4vZGF0YS1wcm9jZXNzaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZUV4cG9ydGVyU2VydmljZSB9IGZyb20gJy4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGFQb2ludHNFeHBvcnRTZWxlY3RvclByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLXByZXZpZXcvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItcHJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRGF0YVNjb3BlQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZGF0YS1zY29wZS9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZGF0YS1zY29wZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZVR5cGVzQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZmlsZS10eXBlcy9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZmlsZS10eXBlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yVGltZVJhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItdGltZS1yYW5nZS9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItdGltZS1yYW5nZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ1NWR2VuZXJhdG9yQWRhcHRlciB9IGZyb20gJy4vZ2VuZXJhdG9ycy9jc3YtZ2VuZXJhdG9yJztcbmltcG9ydCB7IEV4Y2VsR2VuZXJhdG9yQWRhcHRlciB9IGZyb20gJy4vZ2VuZXJhdG9ycy9leGNlbC1nZW5lcmF0b3InO1xuXG5leHBvcnQgY29uc3QgRklMRV9HRU5FUkFUT1JTID0gbmV3IEluamVjdGlvblRva2VuPEZpbGVHZW5lcmF0b3JbXT4oJ0ZJTEVfR0VORVJBVE9SUycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBbRXhjZWxHZW5lcmF0b3JBZGFwdGVyLCBDU1ZHZW5lcmF0b3JBZGFwdGVyXVxufSk7XG5cbmV4cG9ydCBjb25zdCBkYXRlUmFuZ2VWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbik6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgY29uc3QgZGF0ZUZyb20gPSBjb250cm9sLmdldCgnZGF0ZUZyb20nKTtcbiAgY29uc3QgZGF0ZVRvID0gY29udHJvbC5nZXQoJ2RhdGVUbycpO1xuXG4gIGlmICghZGF0ZUZyb20gfHwgIWRhdGVUbykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZUZyb21WYWx1ZSA9IGRhdGVGcm9tLnZhbHVlO1xuICBjb25zdCBkYXRlVG9WYWx1ZSA9IGRhdGVUby52YWx1ZTtcbiAgaWYgKGRhdGVGcm9tVmFsdWUgJiYgZGF0ZVRvVmFsdWUpIHtcbiAgICBpZiAobmV3IERhdGUoZGF0ZUZyb21WYWx1ZSkgPiBuZXcgRGF0ZShkYXRlVG9WYWx1ZSkpIHtcbiAgICAgIGRhdGVGcm9tLnNldEVycm9ycyh7IGRhdGVBZnRlclJhbmdlTWF4OiB0cnVlIH0pO1xuICAgICAgZGF0ZVRvLnNldEVycm9ycyh7IGRhdGVCZWZvcmVSYW5nZU1pbjogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZUZyb20uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgZGF0ZVRvLnNldEVycm9ycyhudWxsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvcmVNb2R1bGUsXG4gICAgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRGF0YVNjb3BlQ29tcG9uZW50LFxuICAgIERhdGFQb2ludHNFeHBvcnRTZWxlY3RvckZpbGVUeXBlc0NvbXBvbmVudCxcbiAgICBEYXRhUG9pbnRzRXhwb3J0U2VsZWN0b3JQcmV2aWV3Q29tcG9uZW50LFxuICAgIERhdGFQb2ludHNFeHBvcnRTZWxlY3RvclRpbWVSYW5nZUNvbXBvbmVudCxcbiAgICBLZXlWYWx1ZVBpcGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWc7XG4gIEBPdXRwdXQoKSBvbkRvd25sb2FkQnV0dG9uU3RhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhZ2dyZWdhdGlvbiBzZWxlY3RvciBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkLlxuICAgKiBUaGlzIHN0YXRlIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgZGF0ZSByYW5nZS5cbiAgICovXG4gIGRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zOiBBZ2dyZWdhdGlvbk9wdGlvblN0YXR1cyA9IHt9O1xuXG4gIGZvcm1Hcm91cDogUmV0dXJuVHlwZTxEYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJDb21wb25lbnRbJ2NyZWF0ZUZvcm0nXT47XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGFsbCBkYXRhcG9pbnRzIHRoYXQgbnVtYmVyIG9mIHJlY29yZHMgZXhjZWVkcyBhIHRocmVzaG9sZCwgd2hlcmUgZGF0YSBmb3IgdGhlc2UgZGF0YXBvaW50cyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgYmFja2VuZC5cbiAgICogQXBwbGllcyBvbmx5IHRvIG1lYXN1cmVtZW50IEFQSSB3aGljaCBjYW4gcmV0dXJuIHByb2Nlc3NlZCBDU1YsIEV4Y2VsIG9yIFhNTCBkYXRhLlxuICAgKi9cbiAgZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0OiBEYXRhcG9pbnRzRXhjZWVkaW5nTGltaXRbXSA9IFtdO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW55IG9mIERhdGFUb0V4cG9ydCBvYmplY3RzIHRpbWVWYWx1ZU1hcCBwcm9wZXJ0eSBpcyBub3QgdW5kZWZpbmVkIChzZXJpZXMgZGF0YSlcbiAgICogb3IgZGF0YVBvaW50VG9FeHBvcnQgaXMgbm90IHVuZGVmaW5lZCBhdCBhbGwgKG1lYXN1cmVtZW50IGRhdGEpLlxuICAgKi9cblxuICBoYXNGZXRjaGVkRGF0YUFueVZhbHVlc1RvRXhwb3J0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGVyZSBpcyBubyBleHBvcnRhYmxlIGRhdGEgYmVjYXVzZSB0aGUgZGF0ZSByYW5nZSBvZiBhbGwgc2VsZWN0ZWQgZGF0YXBvaW50cyBleGNlZWRzIDEsMDAwLDAwMCByZWNvcmRzLlxuICAgKi9cbiAgaGFzTm9FeHBvcnRhYmxlRGF0YTogYm9vbGVhbjtcblxuICBoYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzID0gZmFsc2U7XG5cbiAgaXNQcmV2aWV3TG9hZGluZyA9IHRydWU7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVsbCBvciBjb21wYWN0IHR5cGUgb2YgZXhwb3J0IGlzIHNlbGVjdGVkLlxuICAgKiBGdWxsIHR5cGUgb2YgZXhwb3J0IGlzIGJhc2VkIG9uIG1lYXN1cmVtZW50IEFQSSBkYXRhLlxuICAgKiBDb21wYWN0IHR5cGUgb2YgZXhwb3J0IGlzIGJhc2VkIG9uIHNlcmllcyBBUEkgZGF0YS5cbiAgICovXG4gIGlzRnVsbFR5cGVPZkV4cG9ydCA9IGZhbHNlO1xuXG4gIHByZXZpZXdUYWJsZURhdGE6IEV4cG9ydERhdGFbXTtcblxuICBsaW1pdEV4Y2VlZGVkTWVzc2FnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250YWlucyBwcm9jZXNzZWQgZGF0YSB0aGF0IGlzIHByZXBhcmVkIHRvIGJlIGV4cG9ydGVkIGlmIHNlcmllcyBkYXRhIHdhcyBmZXRjaGVkXG4gICAqIG9yIHNob3duIGluIHRoZSBwcmV2aWV3IHRhYmxlIGluIGNhc2Ugb2YgbWVhc3VyZW1lbnRzIGRhdGEuXG4gICAqL1xuICBwcml2YXRlIGRhdGFUb0V4cG9ydDogRGF0YVRvRXhwb3J0W107XG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZGF0YXBvaW50cyB0aGF0IHNlbGVjdGVkIGRhdGUgcmFuZ2UgZXhjZWVkcyBBUEkgbGltaXQgb2YgMV8wMDBfMDAwIHJlY29yZHMuXG4gICAqL1xuICBwcml2YXRlIGRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQ6IERhdGFwb2ludHNFeGNlZWRpbmdMaW1pdFtdO1xuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgZmlsZSB0eXBlIHNlbGVjdGlvbiBjaGVja2JveGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWxlVHlwZVNlbGVjdGlvblN0YXRlOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgLyoqXG4gICAqIEhvbGQgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGFnZ3JlZ2F0aW9uIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFZhbHVlIHdpbGwgYmUgbG9hZGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsQWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uT3B0aW9uO1xuICAvKipcbiAgICogSG9sZCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZGF0ZUZyb20gZnJvbSB0aGUgZXhwb3J0IGNvbmZpZy5cbiAgICogVmFsdWUgd2lsbCBiZSBsb2FkZWQgb24gY29tcG9uZW50IGRlc3Ryb3kuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxEYXRlRnJvbTogc3RyaW5nO1xuICAvKipcbiAgICogSG9sZCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZGF0ZVRvIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFZhbHVlIHdpbGwgYmUgbG9hZGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsRGF0ZVRvOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb2xkIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBkYXRhcG9pbnREZXRhaWxzIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFNvbWUgbG9naWMgbWF5IGZpbHRlciBvdXQgZGF0YXBvaW50cyBpbiBkYXRhcG9pbnREZXRhaWxzIGFycmF5LCB0aGF0IGV4Y2VlZHMgMV8wMDBfMDAwIGxpbWl0IGZvciBtZWFzdXJlbWVudHMgQVBJLFxuICAgKiBidXQgZnVsbCBsaXN0IGlzIHN0aWxsIG5lZWRlZCB3aGVuIGNvbXBvbmVudCBpcyByZW9wZW5lZC5cbiAgICogVmFsdWUgd2lsbCBiZSBsb2FkZWQgb24gY29tcG9uZW50IGRlc3Ryb3kuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxEYXRhcG9pbnREZXRhaWxzOiBEYXRhcG9pbnREZXRhaWxzW107XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWdncmVnYXRpb24gdmFsdWUgd2FzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseS5cbiAgICogSXQgcHJldmVudHMgYSBjYXNlIHdoZXJlIGZldGNoaW5nIG1heSBiZSB0cmlnZ2VyZWQgdHdpY2Ugd2hlbiBleHBvcnQgdHlwZSBpcyBjaGFuZ2VkLlxuICAgKiBCb3RoIG9wdGlvbnMgYWxvbmUgY2FuIHRyaWdnZXIgZmV0Y2hpbmcgZGF0YS5cbiAgICovXG4gIHByaXZhdGUgaXNBZ2dyZWdhdGlvbkNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbnkgb2YgdGhlIGV4cG9ydCBmaWxlIHR5cGVzIChDU1YsIEV4Y2VsKSBhcmUgY2hlY2tlZC5cbiAgICovXG4gIHByaXZhdGUgaXNBbnlPZkV4cG9ydEZpbGVUeXBlQ2hlY2tlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGF0ZUZyb21TdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIGRhdGVUb1N1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGR5bmFtaWNGaWxlc1R5cGVNZXRhZGF0YTogeyBba2V5OiBzdHJpbmddOiBGaWxlVHlwZU1ldGFkYXRhIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRhdGFwb2ludHNFeHBvcnRNb2RhbFNlcnZpY2U6IERhdGFQcm9jZXNzaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2U6IERhdGFGZXRjaGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlOiBEYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIEBJbmplY3QoRklMRV9HRU5FUkFUT1JTKSBwcml2YXRlIGdlbmVyYXRvcnM6IEZpbGVHZW5lcmF0b3JbXSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zZXRGaWxlc1R5cGUodGhpcy5nZW5lcmF0b3JzKTtcblxuICAgIHRoaXMuZGF0ZUZyb21TdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jICh1cGRhdGVkRGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRGF0ZUFuZEZldGNoRGF0YSgnZGF0ZUZyb20nLCB1cGRhdGVkRGF0ZSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZGF0ZVRvU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAodXBkYXRlZERhdGU6IHN0cmluZykgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZURhdGVBbmRGZXRjaERhdGEoJ2RhdGVUbycsIHVwZGF0ZWREYXRlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0RmlsZXNUeXBlKGdlbmVyYXRvcnM6IEZpbGVHZW5lcmF0b3JbXSkge1xuICAgIGdlbmVyYXRvcnMuZm9yRWFjaChnID0+IHtcbiAgICAgIHRoaXMuZHluYW1pY0ZpbGVzVHlwZU1ldGFkYXRhW2cuZ2V0VHlwZSgpXSA9IHtcbiAgICAgICAgbGFiZWw6IGcuZ2V0TGFiZWwoKSxcbiAgICAgICAgaWNvbjogZy5nZXRJY29uKCksXG4gICAgICAgIHRpdGxlOiBnLmdldFRpdGxlKCksXG4gICAgICAgIGV4dGVuc2lvbjogZy5nZXRGaWxlRXh0ZW5zaW9uKCksXG4gICAgICAgIHppcE5hbWU6IGcuZ2V0WmlwTmFtZSgpLFxuICAgICAgICB0eXBlOiBnLmdldFR5cGUoKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNvdXJjZXNQZXJtaXR0ZWRUb1JlYWQ6IHN0cmluZ1tdID1cbiAgICAgIGF3YWl0IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5nZXRTb3VyY2VzV2l0aFBlcm1pc3Npb25zVG9SZWFkKFxuICAgICAgICB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzXG4gICAgICApO1xuXG4gICAgaWYgKHNvdXJjZXNQZXJtaXR0ZWRUb1JlYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZXNQZXJtaXR0ZWRUb1JlYWQubGVuZ3RoICE9PSB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscyA9IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMuZmlsdGVyKGRhdGFQb2ludCA9PlxuICAgICAgICBzb3VyY2VzUGVybWl0dGVkVG9SZWFkLmluY2x1ZGVzKFN0cmluZyhkYXRhUG9pbnQuc291cmNlKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5oYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzID0gdHJ1ZTtcblxuICAgIHRoaXMuc3RvcmVJbml0aWFsQ2hhbmdlYWJsZUNvbmZpZygpO1xuXG4gICAgdGhpcy5maWxlVHlwZVNlbGVjdGlvblN0YXRlID0gdGhpcy5nZXRJbml0aWFsU2VsZWN0aW9uKHRoaXMuZHluYW1pY0ZpbGVzVHlwZU1ldGFkYXRhLCBbMF0pO1xuXG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICB0aGlzLmRhdGFUb0V4cG9ydCA9IGF3YWl0IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5mZXRjaEFuZFByZXBhcmVEYXRhVG9FeHBvcnQoXG4gICAgICB0aGlzLmV4cG9ydENvbmZpZyxcbiAgICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0XG4gICAgKTtcblxuICAgIHRoaXMuaGFuZGxlRGF0ZVNlbGVjdG9yQ2hhbmdlcygpO1xuICAgIHRoaXMuZGV0ZXJtaW5lU2hvd2luZ1ByZXZpZXdPckVtcHR5U3RhdGUoKTtcbiAgICB0aGlzLmhhbmRsZUV4cG9ydE1vZGVDaGFuZ2VzKCk7XG4gICAgdGhpcy5oYW5kbGVGaWxlVHlwZVNlbGVjdGlvbkNoYW5nZXMoKTtcbiAgICB0aGlzLmhhbmRsZUZvcm1WYWxpZGF0aW9uQ2hhbmdlcygpO1xuXG4gICAgdGhpcy51cGRhdGVGaWxlVHlwZUNvbnRyb2woKTtcblxuICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnNTdGF0ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMubG9hZEluaXRpYWxDaGFuZ2VhYmxlQ29uZmlnKCk7XG4gIH1cblxuICBhc3luYyBleHBvcnRBbmREb3dubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaWxlRXhwb3J0czogRmlsZUV4cG9ydENvbmZpZ1tdID0gT2JqZWN0LmVudHJpZXModGhpcy5keW5hbWljRmlsZXNUeXBlTWV0YWRhdGEpLm1hcChcbiAgICAgIChbXywgdmFsdWVdKSA9PiAoe1xuICAgICAgICBmaWxlVHlwZTogdmFsdWUudHlwZSBhcyBzdHJpbmcsXG4gICAgICAgIHppcE5hbWU6IHZhbHVlLnppcE5hbWVcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkRmlsZUV4cG9ydHM6IEZpbGVFeHBvcnRDb25maWdbXSA9IHRoaXMuZ2V0T25seVNlbGVjdGVkRmlsZUV4cG9ydHMoZmlsZUV4cG9ydHMpO1xuXG4gICAgdGhpcy50cmlnZ2VyR2FpbnNpZ2h0RG93bmxvYWRFdmVudChzZWxlY3RlZEZpbGVFeHBvcnRzKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc2VsZWN0ZWRGaWxlRXhwb3J0cy5tYXAoYXN5bmMgKHsgZmlsZVR5cGUsIHppcE5hbWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgdGhpcy5leHBvcnRGaWxlKGZpbGVUeXBlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kb3dubG9hZEZpbGUoYmxvYiwgZmlsZVR5cGUsIHppcE5hbWUpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlLmNsZWFudXBDYWNoZWREYXRhKCk7XG4gIH1cblxuICBnZXRPbmx5U2VsZWN0ZWRGaWxlRXhwb3J0cyhmaWxlRXhwb3J0czogRmlsZUV4cG9ydENvbmZpZ1tdKTogRmlsZUV4cG9ydENvbmZpZ1tdIHtcbiAgICByZXR1cm4gZmlsZUV4cG9ydHMuZmlsdGVyKGYgPT4gdGhpcy5maWxlVHlwZVNlbGVjdGlvblN0YXRlW2YuZmlsZVR5cGVdID09PSB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGV4cG9ydEZpbGUoZmlsZVR5cGU6IHN0cmluZyk6IFByb21pc2U8QmxvYiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnRcbiAgICAgID8gYXdhaXQgdGhpcy5leHBvcnRNZWFzdXJlbWVudEZpbGUoZmlsZVR5cGUpXG4gICAgICA6IGF3YWl0IHRoaXMuZXhwb3J0U2VyaWVzRmlsZShmaWxlVHlwZSk7XG4gIH1cblxuICBhc3luYyBkb3dubG9hZEZpbGUoXG4gICAgYmxvYjogQmxvYiB8IG51bGwsXG4gICAgZmlsZVR5cGU6IHN0cmluZyxcbiAgICBtZWFzdXJlbWVudHNaaXBGaWxlTmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0ID1cbiAgICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0LmZpbHRlcihcbiAgICAgICAgZGF0YXBvaW50ID0+ICF0aGlzLmRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQuaW5jbHVkZXMoZGF0YXBvaW50KVxuICAgICAgKTtcblxuICAgIGNvbnN0IHNob3VsZFNob3dBbGVydCA9IHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0Lmxlbmd0aCA+IDA7XG5cbiAgICAvLyBIYW5kbGVzIGEgY2FzZSB3aGVyZSBhbGwgZmlsZXMgYXJlIHNlbnQgYnkgZW1haWwuXG4gICAgaWYgKCFibG9iICYmIHNob3VsZFNob3dBbGVydCkge1xuICAgICAgdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JTZXJ2aWNlLnNob3dTZW5kVmlhRW1haWxJbmZvQWxlcnQoXG4gICAgICAgIGZpbGVUeXBlLFxuICAgICAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYmxvYikge1xuICAgICAgLy8gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBzb21lIG9mIHRoZSBmaWxlcyBhcmUgc2VudCBieSBlbWFpbC5cbiAgICAgIGlmIChzaG91bGRTaG93QWxlcnQpIHtcbiAgICAgICAgdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JTZXJ2aWNlLnNob3dTZW5kVmlhRW1haWxJbmZvQWxlcnQoXG4gICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgICAgdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnRcbiAgICAgICAgPyBzYXZlQXMoYmxvYiwgbWVhc3VyZW1lbnRzWmlwRmlsZU5hbWUpXG4gICAgICAgIDogc2F2ZUFzKGJsb2IsIGJsb2JbU0VSSUVTX0RBVEFfTUVSR0VEX0ZJTEVfTkFNRV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnRzIGEgbWVhc3VyZW1lbnQgZmlsZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAqXG4gICAqIE1lYXN1cmVtZW50cyBBUEkgZG9lcyBwcm92aWRlIGEgd2F5IHRvIGZldGNoIGEgcHJlcHJvY2Vzc2VkIENTVi9FeGNlbCBmaWxlLlxuICAgKlxuICAgKiBBdCB0aGlzIHBvaW50IGEgYmFja2VkIGZpbGUgbmVlZHMgdG8gYmUgZmV0Y2hlZC5cbiAgICogTWVhc3VyZW1lbnQgZGF0YSB1c2VkIGZvciBhIHByZXZpZXcgY29udGFpbnMganVzdCA1IGZpcnN0IHJlY29yZHNcbiAgICogYW5kIGl0J3Mgbm90IGZldGNoZWQgd2l0aCBDU1YvRXhjZWwgaGVhZGVycy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVUeXBlIC0gVGhlIHR5cGUgb2YgZmlsZSB0byBleHBvcnQuXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgQmxvYiByZXByZXNlbnRpbmcgdGhlIGV4cG9ydGVkIGZpbGUgb3IgbnVsbCB3aGVuIG5vIGRhdGEgdG8gZXhwb3J0IG9yIGl0J3Mgc2VudCB2aWEgZW1haWwuXG4gICAqL1xuICBhc3luYyBleHBvcnRNZWFzdXJlbWVudEZpbGUoZmlsZVR5cGU6IHN0cmluZyk6IFByb21pc2U8QmxvYj4gfCBudWxsIHtcbiAgICBjb25zdCB7IGFjY2VwdFR5cGUsIGV4dGVuc2lvbiB9ID0gdGhpcy5kYXRhcG9pbnRzRXhwb3J0TW9kYWxTZXJ2aWNlLmZpbGVUeXBlc0NvbmZpZ3NbZmlsZVR5cGVdO1xuXG4gICAgY29uc3QgdXBkYXRlZEV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnID0gdGhpcy5leGNsdWRlRGF0YXBvaW50c1RoYXRFeGNlZWRzQXBpTGltaXQoXG4gICAgICB0aGlzLmV4cG9ydENvbmZpZ1xuICAgICk7XG5cbiAgICBjb25zdCBkYXRhVG9FeHBvcnQ6IERhdGFUb0V4cG9ydFdpdGhCYWNrZW5kQ3JlYXRlZEZpbGVbXSA9XG4gICAgICBhd2FpdCB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2UuZmV0Y2hNZWFzdXJlbWVudERhdGFGaWxlc0FuZFBhaXJXaXRoU291cmNlRGV0YWlscyhcbiAgICAgICAgYWNjZXB0VHlwZSxcbiAgICAgICAgdXBkYXRlZEV4cG9ydENvbmZpZ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGlzQWxsVW5kZWZpbmVkID0gZGF0YVRvRXhwb3J0LmV2ZXJ5KGRhdGEgPT4gZGF0YSA9PT0gdW5kZWZpbmVkKTtcbiAgICBpZiAoaXNBbGxVbmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2UuZ2V0TWVhc3VyZW1lbnRFeHBvcnRlZERhdGFCbG9iKFxuICAgICAgZXh0ZW5zaW9uLFxuICAgICAgZGF0YVRvRXhwb3J0XG4gICAgKTtcbiAgfVxuXG4gIGV4Y2x1ZGVEYXRhcG9pbnRzVGhhdEV4Y2VlZHNBcGlMaW1pdChleHBvcnRDb25maWc6IEV4cG9ydENvbmZpZyk6IEV4cG9ydENvbmZpZyB7XG4gICAgY29uc3Qgc2tpcHBlZERhdGFwb2ludHNTb3VyY2U6IHN0cmluZ1tdID0gdGhpcy5kYXRhUG9pbnRzRXhjZWVkaW5nT25lTWlsbGlvbkxpbWl0Lm1hcChcbiAgICAgIGRhdGFwb2ludCA9PiBkYXRhcG9pbnQuZGF0YXBvaW50RGV0YWlsLnNvdXJjZS50b1N0cmluZygpXG4gICAgKTtcblxuICAgIGNvbnN0IGZpbHRlcmVkRGF0YXBvaW50czogRGF0YXBvaW50RGV0YWlsc1tdID0gZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMuZmlsdGVyKFxuICAgICAgZGF0YXBvaW50ID0+ICFza2lwcGVkRGF0YXBvaW50c1NvdXJjZS5pbmNsdWRlcyhTdHJpbmcoZGF0YXBvaW50LnNvdXJjZSkpXG4gICAgKTtcblxuICAgIGV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzID0gZmlsdGVyZWREYXRhcG9pbnRzO1xuICAgIHJldHVybiBleHBvcnRDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgc2VyaWVzIGRhdGEgdG8gYSBmaWxlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICpcbiAgICogU2VyaWVzIEFQSSBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIGZldGNoIGEgcHJlcHJvY2Vzc2VkIENTVi9FeGNlbCBmaWxlLlxuICAgKlxuICAgKiBTZXJpZXMgZGF0YSB1c2VkIGZvciBleHBvcnRpbmcgYSBmaWxlIGlzIGFscmVhZHkgZmV0Y2hlZCBmb3IgYSBwcmV2aWV3XG4gICAqIGFuZCBjYW4gYmUgcmV1c2VkIGZvciBleHBvcnRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlVHlwZSAtIFRoZSB0eXBlIG9mIGZpbGUgdG8gZXhwb3J0IChlLmcuLCBDU1YsIEV4Y2VsKS5cbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBCbG9iIHJlcHJlc2VudGluZyB0aGUgZXhwb3J0ZWQgZmlsZS5cbiAgICovXG4gIGFzeW5jIGV4cG9ydFNlcmllc0ZpbGUoZmlsZVR5cGU6IHN0cmluZyk6IFByb21pc2U8QmxvYj4ge1xuICAgIGNvbnN0IG1lcmdlZEV4cG9ydERldGFpbHM6IE1lcmdlZEV4cG9ydERldGFpbHMgPSB7XG4gICAgICBhZ2dyZWdhdGlvbjogdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb24sXG4gICAgICBkYXRlRnJvbTogdGhpcy5leHBvcnRDb25maWcuZGF0ZUZyb20sXG4gICAgICBkYXRlVG86IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVUb1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlLmdldFNlcmllc0V4cG9ydGVkRGF0YUJsb2IoXG4gICAgICBmaWxlVHlwZSxcbiAgICAgIHRoaXMuZGF0YVRvRXhwb3J0LFxuICAgICAgbWVyZ2VkRXhwb3J0RGV0YWlsc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBvbkFnZ3JlZ2F0aW9uQ2hhbmdlKGFnZ3JlZ2F0aW9uOiBBZ2dyZWdhdGlvbk9wdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZXhwb3J0Q29uZmlnLmFnZ3JlZ2F0aW9uID0gYWdncmVnYXRpb247XG4gICAgaWYgKCF0aGlzLmlzQWdncmVnYXRpb25DaGFuZ2VkUHJvZ3JhbW1hdGljYWxseSkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVFeHBvcnRDb25maWdBbmRGZXRjaERhdGEoKTtcbiAgICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uRGF0ZUZyb21DaGFuZ2UodXBkYXRlZERhdGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGF0ZUZyb21TdWJqZWN0Lm5leHQodXBkYXRlZERhdGUpO1xuICB9XG5cbiAgb25EYXRlVG9DaGFuZ2UodXBkYXRlZERhdGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGF0ZVRvU3ViamVjdC5uZXh0KHVwZGF0ZWREYXRlKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZURhdGVBbmRGZXRjaERhdGEoXG4gICAgZGF0ZVR5cGU6ICdkYXRlRnJvbScgfCAnZGF0ZVRvJyxcbiAgICB1cGRhdGVkRGF0ZTogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZXhwb3J0Q29uZmlnW2RhdGVUeXBlXSA9IHVwZGF0ZWREYXRlO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlRXhwb3J0Q29uZmlnQW5kRmV0Y2hEYXRhKCk7XG5cbiAgICBpZiAodGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV0ZXJtaW5lSWZNZWFzdXJlbWVudFJlc3BvbnNlV2lsbEJlUHJvY2Vzc2VkQnlCYWNrZW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uRXhwb3J0VHlwZUNoYW5nZShleHBvcnRUeXBlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXhwb3J0VHlwZSA9PT0gRVhQT1JUX01PREVfVkFMVUVTLmZ1bGwpIHtcbiAgICAgIHRoaXMuaXNBZ2dyZWdhdGlvbkNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uLnNldFZhbHVlKEFHR1JFR0FUSU9OX1ZBTFVFUy5ub25lKTtcbiAgICAgIHRoaXMuaXNBZ2dyZWdhdGlvbkNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5ID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0ID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlRXhwb3J0Q29uZmlnQW5kRmV0Y2hEYXRhKCk7XG4gICAgICBhd2FpdCB0aGlzLmRldGVybWluZUlmTWVhc3VyZW1lbnRSZXNwb25zZVdpbGxCZVByb2Nlc3NlZEJ5QmFja2VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRGdWxsRXhwb3J0UmVsYXRlZFByb3BlcnRpZXMoKTtcbiAgICB0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydCA9IGZhbHNlO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlRXhwb3J0Q29uZmlnQW5kRmV0Y2hEYXRhKCk7XG5cbiAgICB0aGlzLnVwZGF0ZURpc2FibGVkQWdncmVnYXRpb25PcHRpb25zU3RhdGUoKTtcblxuICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMgPVxuICAgICAgdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlLnVwZGF0ZURpc2FibGVkU3RhdGVPZkFnZ3JlZ2F0aW9uT3B0aW9uRW50cmllcyhcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZUZyb20udmFsdWUsXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVUby52YWx1ZSxcbiAgICAgICAgdGhpcy5kaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc1xuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cChcbiAgICAgIHtcbiAgICAgICAgZGF0ZUZyb206IG5ldyBGb3JtQ29udHJvbCh0aGlzLmV4cG9ydENvbmZpZy5kYXRlRnJvbSksXG4gICAgICAgIGRhdGVUbzogbmV3IEZvcm1Db250cm9sKHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVUbyksXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiBuZXcgRm9ybUNvbnRyb2woXG4gICAgICAgICAgdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb24gPyB0aGlzLmV4cG9ydENvbmZpZy5hZ2dyZWdhdGlvbiA6IEFHR1JFR0FUSU9OX1ZBTFVFUy5ub25lXG4gICAgICAgICksXG4gICAgICAgIGV4cG9ydE1vZGU6IG5ldyBGb3JtQ29udHJvbChFWFBPUlRfTU9ERV9WQUxVRVMuY29tcGFjdCksXG4gICAgICAgIGZpbGVUeXBlczogdGhpcy5mb3JtQnVpbGRlci5ncm91cChcbiAgICAgICAgICB0aGlzLmdlbmVyYXRvcnMucmVkdWNlKChhLCBjKSA9PiB7XG4gICAgICAgICAgICBhW2MuZ2V0VHlwZSgpXSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgfSwge30pXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRvcnM6IFtkYXRlUmFuZ2VWYWxpZGF0b3JdXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVByZXZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ByZXZpZXdMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnByZXZpZXdUYWJsZURhdGEgPVxuICAgICAgdGhpcy5kYXRhcG9pbnRzRXhwb3J0TW9kYWxTZXJ2aWNlLnRyYW5zZm9ybVRvRXhwb3J0RmlsZVN0cnVjdHVyZUZvclByZXZpZXcodGhpcy5kYXRhVG9FeHBvcnQpO1xuICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEYXRlU2VsZWN0b3JDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uO1xuICAgIGNvbnN0IGRhdGVGcm9tU2VsZWN0b3IgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbTtcbiAgICBjb25zdCBkYXRlVG9TZWxlY3RvciA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVUbztcblxuICAgIGNvbnN0IHVwZGF0ZUFnZ3JlZ2F0aW9uT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc1N0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgZmlyc3RBdmFpbGFibGVBZ2dyZWdhdGlvblZhbHVlOiBBZ2dyZWdhdGlvbk9wdGlvbiA9XG4gICAgICAgICAgdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlLnNldFRvRmlyc3RBdmFpbGFibGVBZ2dyZWdhdGlvbk9wdGlvbklmQ3VycmVudElzRGlzYWJsZWQoXG4gICAgICAgICAgICBhZ2dyZWdhdGlvbkNvbnRyb2wudmFsdWUsXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zXG4gICAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmlyc3RBdmFpbGFibGVBZ2dyZWdhdGlvblZhbHVlKSB7XG4gICAgICAgICAgYWdncmVnYXRpb25Db250cm9sLnNldFZhbHVlKGZpcnN0QXZhaWxhYmxlQWdncmVnYXRpb25WYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVyZ2UoZGF0ZUZyb21TZWxlY3Rvci52YWx1ZUNoYW5nZXMsIGRhdGVUb1NlbGVjdG9yLnZhbHVlQ2hhbmdlcylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUodXBkYXRlQWdncmVnYXRpb25PcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXhwb3J0TW9kZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYWdncmVnYXRpb25Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWdncmVnYXRpb247XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5leHBvcnRNb2RlLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShleHBvcnRNb2RlVmFsdWUgPT4ge1xuICAgICAgICBpZiAoZXhwb3J0TW9kZVZhbHVlLnRvU3RyaW5nKCkgPT09IEVYUE9SVF9NT0RFX1ZBTFVFUy5mdWxsKSB7XG4gICAgICAgICAgYWdncmVnYXRpb25Db250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZ2dyZWdhdGlvbkNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlVHlwZVNlbGVjdGlvbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZmlsZVR5cGVzLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShmaWxlVHlwZXNTZWxlY3Rpb25TdGF0ZSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZVR5cGVTZWxlY3Rpb25TdGF0ZShmaWxlVHlwZXNTZWxlY3Rpb25TdGF0ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsZVR5cGVTZWxlY3Rpb25TdGF0ZShjaGVja2JveGVzU3RhdGU6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgdGhpcy5pc0FueU9mRXhwb3J0RmlsZVR5cGVDaGVja2VkID0gT2JqZWN0LnZhbHVlcyhjaGVja2JveGVzU3RhdGUpLnNvbWUoXG4gICAgICB2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZVxuICAgICk7XG4gICAgdGhpcy5maWxlVHlwZVNlbGVjdGlvblN0YXRlID0gY2hlY2tib3hlc1N0YXRlO1xuICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGb3JtVmFsaWRhdGlvbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWxlVHlwZUNvbnRyb2woKTogdm9pZCB7XG4gICAgY29uc3QgZmlsZVR5cGVzQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmZpbGVUeXBlcztcbiAgICBpZiAoZmlsZVR5cGVzQ29udHJvbCkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZmlsZVR5cGVzQ29udHJvbC52YWx1ZSB8fCB7fTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRWYWx1ZSA9IHsgLi4uY3VycmVudFZhbHVlIH07XG5cbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZmlsZVR5cGVTZWxlY3Rpb25TdGF0ZSkuZm9yRWFjaCgoW2ZpbGVUeXBlLCBpc1NlbGVjdGVkXSkgPT4ge1xuICAgICAgICBpZiAoZmlsZVR5cGUgaW4gY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgdXBkYXRlZFZhbHVlW2ZpbGVUeXBlXSA9IGlzU2VsZWN0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBmaWxlVHlwZXNDb250cm9sLnBhdGNoVmFsdWUodXBkYXRlZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRldGVybWluZVNob3dpbmdQcmV2aWV3T3JFbXB0eVN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0RhdGFUb1Nob3cgPSB0aGlzLmRhdGFUb0V4cG9ydC5zb21lKGRhdGFUb0V4cG9ydEl0ZW0gPT5cbiAgICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0XG4gICAgICAgID8gISFkYXRhVG9FeHBvcnRJdGVtXG4gICAgICAgIDogZGF0YVRvRXhwb3J0SXRlbS50aW1lVmFsdWVNYXAgJiYgT2JqZWN0LmtleXMoZGF0YVRvRXhwb3J0SXRlbS50aW1lVmFsdWVNYXApLmxlbmd0aCA+IDBcbiAgICApO1xuXG4gICAgdGhpcy5oYXNGZXRjaGVkRGF0YUFueVZhbHVlc1RvRXhwb3J0ID0gaGFzRGF0YVRvU2hvdztcblxuICAgIGlmIChoYXNEYXRhVG9TaG93KSB7XG4gICAgICB0aGlzLnByZXBhcmVQcmV2aWV3KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGV0ZXJtaW5lSWZNZWFzdXJlbWVudFJlc3BvbnNlV2lsbEJlUHJvY2Vzc2VkQnlCYWNrZW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdCA9XG4gICAgICBhd2FpdCB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2UuZ2V0RGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0KHRoaXMuZXhwb3J0Q29uZmlnKTtcblxuICAgIGNvbnN0IHsgYnJvd3NlckRvd25sb2FkYWJsZUNvdW50LCBlbWFpbERlbGl2ZXJhYmxlQ291bnQsIG5vblJldHJpZXZhYmxlQ291bnQgfSA9XG4gICAgICB0aGlzLmNhbGN1bGF0ZURhdGFwb2ludENvdW50cygpO1xuXG4gICAgdGhpcy5oYXNOb0V4cG9ydGFibGVEYXRhID1cbiAgICAgIGJyb3dzZXJEb3dubG9hZGFibGVDb3VudCA9PT0gMCAmJiBlbWFpbERlbGl2ZXJhYmxlQ291bnQgPT09IDAgJiYgbm9uUmV0cmlldmFibGVDb3VudCA+IDA7XG5cbiAgICBpZiAodGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQubGVuZ3RoID4gMCAmJiAhdGhpcy5oYXNOb0V4cG9ydGFibGVEYXRhKSB7XG4gICAgICB0aGlzLmxpbWl0RXhjZWVkZWRNZXNzYWdlID0gdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JTZXJ2aWNlLmdldExpbWl0RXhjZWVkZWRNZXNzYWdlKFxuICAgICAgICB0aGlzLmhhc05vRXhwb3J0YWJsZURhdGEsXG4gICAgICAgIGVtYWlsRGVsaXZlcmFibGVDb3VudCxcbiAgICAgICAgYnJvd3NlckRvd25sb2FkYWJsZUNvdW50LFxuICAgICAgICBub25SZXRyaWV2YWJsZUNvdW50LFxuICAgICAgICB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQubGVuZ3RoID4gMCAmJiB0aGlzLmhhc05vRXhwb3J0YWJsZURhdGEpIHtcbiAgICAgIHRoaXMubGltaXRFeGNlZWRlZE1lc3NhZ2UgPSB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2UuZ2V0TGltaXRFeGNlZWRlZE1lc3NhZ2UoXG4gICAgICAgIHRoaXMuaGFzTm9FeHBvcnRhYmxlRGF0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZURvd25sb2FkQnV0dG9uU3RhdGUoKTtcblxuICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEYXRhcG9pbnRDb3VudHMoKTogRGF0YXBvaW50Q291bnRzIHtcbiAgICBjb25zdCBSRUNPUkRfQVBJX0xJTUlUID0gMV8wMDBfMDAwO1xuXG4gICAgdGhpcy5kYXRhUG9pbnRzRXhjZWVkaW5nT25lTWlsbGlvbkxpbWl0ID0gdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQuZmlsdGVyKFxuICAgICAgZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0ID0+XG4gICAgICAgIGRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC50b3RhbEVsZW1lbnRzID4gUkVDT1JEX0FQSV9MSU1JVFxuICAgICk7XG5cbiAgICBjb25zdCBub25SZXRyaWV2YWJsZUNvdW50ID0gdGhpcy5kYXRhUG9pbnRzRXhjZWVkaW5nT25lTWlsbGlvbkxpbWl0Lmxlbmd0aDtcblxuICAgIGNvbnN0IGVtYWlsRGVsaXZlcmFibGVDb3VudCA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5sZW5ndGggLSBub25SZXRyaWV2YWJsZUNvdW50O1xuXG4gICAgY29uc3QgYnJvd3NlckRvd25sb2FkYWJsZUNvdW50ID1cbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMubGVuZ3RoIC0gZW1haWxEZWxpdmVyYWJsZUNvdW50IC0gbm9uUmV0cmlldmFibGVDb3VudDtcblxuICAgIHJldHVybiB7XG4gICAgICBicm93c2VyRG93bmxvYWRhYmxlQ291bnQsXG4gICAgICBlbWFpbERlbGl2ZXJhYmxlQ291bnQsXG4gICAgICBub25SZXRyaWV2YWJsZUNvdW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcmVJbml0aWFsQ2hhbmdlYWJsZUNvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxEYXRlRnJvbSA9IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVGcm9tO1xuICAgIHRoaXMuaW5pdGlhbERhdGVUbyA9IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVUbztcbiAgICB0aGlzLmluaXRpYWxEYXRhcG9pbnREZXRhaWxzID0gdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscztcbiAgICBpZiAoIXRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0KSB7XG4gICAgICB0aGlzLmluaXRpYWxBZ2dyZWdhdGlvbiA9IHRoaXMuZXhwb3J0Q29uZmlnLmFnZ3JlZ2F0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEluaXRpYWxDaGFuZ2VhYmxlQ29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVGcm9tID0gdGhpcy5pbml0aWFsRGF0ZUZyb207XG4gICAgdGhpcy5leHBvcnRDb25maWcuZGF0ZVRvID0gdGhpcy5pbml0aWFsRGF0ZVRvO1xuICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMgPSB0aGlzLmluaXRpYWxEYXRhcG9pbnREZXRhaWxzO1xuICAgIGlmICghdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQpIHtcbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLmFnZ3JlZ2F0aW9uID0gdGhpcy5pbml0aWFsQWdncmVnYXRpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVFeHBvcnRDb25maWdBbmRGZXRjaERhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLmludmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJldmlld0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5vbkRvd25sb2FkQnV0dG9uU3RhdGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgdGhpcy5kYXRhVG9FeHBvcnQgPSBhd2FpdCB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2UuZmV0Y2hBbmRQcmVwYXJlRGF0YVRvRXhwb3J0KFxuICAgICAgdGhpcy5leHBvcnRDb25maWcsXG4gICAgICB0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydFxuICAgICk7XG5cbiAgICB0aGlzLmRldGVybWluZVNob3dpbmdQcmV2aWV3T3JFbXB0eVN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURvd25sb2FkQnV0dG9uU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgY2FuRW5hYmxlRG93bmxvYWRCdXR0b24gPVxuICAgICAgdGhpcy5oYXNGZXRjaGVkRGF0YUFueVZhbHVlc1RvRXhwb3J0ICYmXG4gICAgICAhdGhpcy5mb3JtR3JvdXAuaW52YWxpZCAmJlxuICAgICAgdGhpcy5pc0FueU9mRXhwb3J0RmlsZVR5cGVDaGVja2VkICYmXG4gICAgICAhdGhpcy5oYXNOb0V4cG9ydGFibGVEYXRhO1xuXG4gICAgdGhpcy5vbkRvd25sb2FkQnV0dG9uU3RhdGVDaGFuZ2UuZW1pdChjYW5FbmFibGVEb3dubG9hZEJ1dHRvbik7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RnVsbEV4cG9ydFJlbGF0ZWRQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIHRoaXMuaGFzTm9FeHBvcnRhYmxlRGF0YSA9IGZhbHNlO1xuICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0ID0gW107XG4gIH1cblxuICBwcml2YXRlIGdldEluaXRpYWxTZWxlY3Rpb24oXG4gICAgZmlsZVR5cGU6IHsgW2tleTogc3RyaW5nXTogRmlsZVR5cGVNZXRhZGF0YSB9LFxuICAgIHNlbGVjdEJ5RGVmYXVsdDogbnVtYmVyW11cbiAgKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZpbGVUeXBlKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsU2VsZWN0aW9uID0ga2V5cy5yZWR1Y2U8eyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0+KChhY2MsIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSBmYWxzZTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgc2VsZWN0QnlEZWZhdWx0LmZvckVhY2goaW5kZXggPT4ge1xuICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBrZXlzLmxlbmd0aCkge1xuICAgICAgICBpbml0aWFsU2VsZWN0aW9uW2tleXNbaW5kZXhdXSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5pdGlhbFNlbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlckdhaW5zaWdodERvd25sb2FkRXZlbnQoc2VsZWN0ZWRGaWxlRXhwb3J0czogRmlsZUV4cG9ydENvbmZpZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgY29tbW9uRXZlbnREYXRhID0ge1xuICAgICAgYWN0aW9uOiBQUk9EVUNUX0VYUEVSSUVOQ0VfREFUQVBPSU5UU19FWFBPUlRfU0VMRUNUT1IuQUNUSU9OUy5ET1dOTE9BRF9TVEFSVEVELFxuICAgICAgY29tcG9uZW50OlxuICAgICAgICBQUk9EVUNUX0VYUEVSSUVOQ0VfREFUQVBPSU5UU19FWFBPUlRfU0VMRUNUT1IuQ09NUE9ORU5UU1xuICAgICAgICAgIC5EQVRBUE9JTlRTX0VYUE9SVF9TRUxFQ1RPUl9GSUxFX0VYUE9SVEVSLFxuICAgICAgc2VsZWN0ZWRGaWxlVHlwZTogc2VsZWN0ZWRGaWxlRXhwb3J0cy5tYXAoaXRlbSA9PiBpdGVtLmZpbGVUeXBlKVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQpIHtcbiAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS50cmlnZ2VyRXZlbnQoXG4gICAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9EQVRBUE9JTlRTX0VYUE9SVF9TRUxFQ1RPUi5FVkVOVFMuRVhQT1JUX1NFTEVDVE9SLFxuICAgICAgICB7XG4gICAgICAgICAgLi4uY29tbW9uRXZlbnREYXRhLFxuICAgICAgICAgIHNlbGVjdGVkRXhwb3J0VHlwZTpcbiAgICAgICAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9EQVRBUE9JTlRTX0VYUE9SVF9TRUxFQ1RPUi5FWFBPUlRfQ09ORklHLkZVTExfRVhQT1JUX1RZUEVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChcbiAgICAgICAgUFJPRFVDVF9FWFBFUklFTkNFX0RBVEFQT0lOVFNfRVhQT1JUX1NFTEVDVE9SLkVWRU5UUy5FWFBPUlRfU0VMRUNUT1IsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5jb21tb25FdmVudERhdGEsXG4gICAgICAgICAgc2VsZWN0ZWRFeHBvcnRUeXBlOlxuICAgICAgICAgICAgUFJPRFVDVF9FWFBFUklFTkNFX0RBVEFQT0lOVFNfRVhQT1JUX1NFTEVDVE9SLkVYUE9SVF9DT05GSUcuQ09NUEFDVF9FWFBPUlRfVFlQRSxcbiAgICAgICAgICBzZWxlY3RlZEFnZ3JlZ2F0aW9uOiB0aGlzLmV4cG9ydENvbmZpZy5hZ2dyZWdhdGlvbiA/PyBBR0dSRUdBVElPTl9WQUxVRVMubm9uZVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInAtYi0xNlwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzUGVybWlzc2lvblRvUmVhZEFueU1lYXN1cmVtZW50czsgZWxzZSBoYXNOb1JvbGVUb1JlYWRBbnlNZWFzdXJlbWVudHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwicC0xNiB0ZXh0LWNlbnRlciBzZXBhcmF0b3ItYm90dG9tIHN0aWNreS10b3AgYmctY29tcG9uZW50XCI+XG4gICAgICA8cCBjbGFzcz1cInRleHQtbWVkaXVtIHRleHQtMTZcIj5cbiAgICAgICAge3sgJ0NvbmZpZ3VyZSBleHBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJwLXQtMjQgcC1yLTE2IHAtbC0xNiBnYXAtOCBwLWItMTYgZmxleC13cmFwXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlcGFyYXRvci1ib3R0b20nOiBpc0Z1bGxUeXBlT2ZFeHBvcnQgfVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICA8Yzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLXRpbWUtcmFuZ2VcbiAgICAgICAgICAgICpuZ0lmPVwidGhpcy5oYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzXCJcbiAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgICAgICAgICAgIChvbkRhdGVGcm9tQ2hhbmdlKT1cIm9uRGF0ZUZyb21DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25EYXRlVG9DaGFuZ2UpPVwib25EYXRlVG9DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvYzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLXRpbWUtcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICA8Yzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWRhdGEtc2NvcGVcbiAgICAgICAgICAgICpuZ0lmPVwidGhpcy5oYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc109XCJkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc1wiXG4gICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICAgICAgICAob25BZ2dyZWdhdGlvbkNoYW5nZSk9XCJvbkFnZ3JlZ2F0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgKG9uRXhwb3J0VHlwZUNoYW5nZSk9XCJvbkV4cG9ydFR5cGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvYzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWRhdGEtc2NvcGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICA8Yzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtdHlwZXNcbiAgICAgICAgICAgICpuZ0lmPVwidGhpcy5oYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzXCJcbiAgICAgICAgICAgIFtkeW5hbWljRmlsZXNUeXBlTWV0YWRhdGFdPVwiZHluYW1pY0ZpbGVzVHlwZU1ldGFkYXRhXCJcbiAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgICAgICAgICA+PC9jOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS10eXBlcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cIiFpc0Z1bGxUeXBlT2ZFeHBvcnQgJiYgIWhhc0ZldGNoZWREYXRhQW55VmFsdWVzVG9FeHBvcnQgJiYgIWlzUHJldmlld0xvYWRpbmdcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtMjQgcC1yLTE2IHAtbC0xNiBwLWItMTYgc2VwYXJhdG9yLWJvdHRvbSBkLWZsZXhcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBjZW50ZXItYmxvY2tcIlxuICAgICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgICAgZGF0YS1jeT1cImZpbGUtZXhwb3J0ZXItLW5vLWRhdGEtYXZhaWxhYmxlXCJcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgPlxuICAgICAgICAgIE5vIGRhdGEgYXZhaWxhYmxlLlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQubGVuZ3RoID4gMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtdC0yNCBwLXItMTYgcC1sLTE2IHAtYi0xNiBzZXBhcmF0b3ItYm90dG9tIGQtZmxleFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgaGFzTm9FeHBvcnRhYmxlRGF0YVxuICAgICAgICAgICAgICA/ICdhbGVydCBhbGVydC13YXJuaW5nIGNlbnRlci1ibG9jaydcbiAgICAgICAgICAgICAgOiAnYWxlcnQgYWxlcnQtaW5mbyBjZW50ZXItYmxvY2snXG4gICAgICAgICAgXCJcbiAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwibGltaXRFeGNlZWRlZE1lc3NhZ2VcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNGdWxsVHlwZU9mRXhwb3J0XCI+XG4gICAgICA8Yzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLXByZXZpZXdcbiAgICAgICAgKm5nSWY9XCJ0aGlzLmhhc1Blcm1pc3Npb25Ub1JlYWRBbnlNZWFzdXJlbWVudHNcIlxuICAgICAgICBbaGFzRmV0Y2hlZERhdGFBbnlWYWx1ZXNUb0V4cG9ydF09XCJoYXNGZXRjaGVkRGF0YUFueVZhbHVlc1RvRXhwb3J0XCJcbiAgICAgICAgW2lzUHJldmlld0xvYWRpbmddPVwiaXNQcmV2aWV3TG9hZGluZ1wiXG4gICAgICAgIFtwcmV2aWV3VGFibGVEYXRhXT1cInByZXZpZXdUYWJsZURhdGFcIlxuICAgICAgPjwvYzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLXByZXZpZXc+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctdGVtcGxhdGUgI2hhc05vUm9sZVRvUmVhZEFueU1lYXN1cmVtZW50cz5cbiAgICA8ZGl2IGNsYXNzPVwicC10LTI0IHAtci0xNiBwLWwtMTYgcC1iLTE2IGQtZmxleFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gY2VudGVyLWJsb2NrXCJcbiAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgdHJhbnNsYXRlXG4gICAgICA+XG4gICAgICAgIDxwPlRvIGV4cG9ydCBkYXRhLCB5b3UgbXVzdCBtZWV0IGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBjcml0ZXJpYTo8L3A+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bGk+XG4gICAgICAgICAgICBIYXZlXG4gICAgICAgICAgICA8Yj5SRUFEIHBlcm1pc3Npb24gZm9yIFwiTWVhc3VyZW1lbnRzXCIgcGVybWlzc2lvbiB0eXBlPC9iPlxuICAgICAgICAgICAgKGVpdGhlciBhcyBhIGdsb2JhbCByb2xlIG9yIGZvciB0aGUgc3BlY2lmaWMgc291cmNlKVxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPGxpPlxuICAgICAgICAgICAgQmUgdGhlXG4gICAgICAgICAgICA8Yj5vd25lciBvZiB0aGUgc291cmNlPC9iPlxuICAgICAgICAgICAgeW91IHdhbnQgdG8gZXhwb3J0IGRhdGEgZnJvbVxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICAgIDxwPkRvbid0IG1lZXQgdGhlc2UgcmVxdWlyZW1lbnRzPyBDb250YWN0IHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgZm9yIGFzc2lzdGFuY2UuPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==
|
|
524
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1tb2RhbC9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtZXhwb3J0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItbW9kYWwvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUdMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBRUwsV0FBVyxFQUNYLFdBQVcsRUFDWCxtQkFBbUIsRUFHcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsa0JBQWtCLEVBR2xCLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxNQUFNLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQU9MLGtCQUFrQixFQU9sQiw2Q0FBNkMsRUFDN0Ms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akYsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLElBQUksa0JBQWtCLENBQUMsSUFBSTthQUM5RSxDQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzs4R0E3ckJVLDZDQUE2QyxrTkFxRzlDLGVBQWU7a0dBckdkLDZDQUE2QywyTkNsRzFELDR1SEFtR0EsMkNEVEksVUFBVSw4cUJBQ1YsMENBQTBDLG1NQUMxQywwQ0FBMEMseUlBQzFDLHdDQUF3Qyx3S0FDeEMsMENBQTBDLDZKQUMxQyxtQkFBbUI7OzJGQUdWLDZDQUE2QztrQkFiekQsU0FBUzsrQkFDRSw4Q0FBOEMsY0FFNUMsSUFBSSxXQUNQO3dCQUNQLFVBQVU7d0JBQ1YsMENBQTBDO3dCQUMxQywwQ0FBMEM7d0JBQzFDLHdDQUF3Qzt3QkFDeEMsMENBQTBDO3dCQUMxQyxtQkFBbUI7cUJBQ3BCOzswQkF1R0UsTUFBTTsyQkFBQyxlQUFlO3dFQXBHaEIsWUFBWTtzQkFBcEIsS0FBSztnQkFDSSwyQkFBMkI7c0JBQXBDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtQ29udHJvbCxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yRm5cbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQUdHUkVHQVRJT05fVkFMVUVTLFxuICBBZ2dyZWdhdGlvbk9wdGlvbixcbiAgQWdncmVnYXRpb25PcHRpb25TdGF0dXMsXG4gIEFnZ3JlZ2F0aW9uU2VydmljZSxcbiAgQ29yZU1vZHVsZSxcbiAgR2FpbnNpZ2h0U2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCBzYXZlQXMgZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1lcmdlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERhdGFwb2ludENvdW50cyxcbiAgRGF0YXBvaW50RGV0YWlscyxcbiAgRGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0LFxuICBEYXRhVG9FeHBvcnQsXG4gIERhdGFUb0V4cG9ydFdpdGhCYWNrZW5kQ3JlYXRlZEZpbGUsXG4gIERhdGVGZXRjaENvbmZpZyxcbiAgRVhQT1JUX01PREVfVkFMVUVTLFxuICBFeHBvcnRDb25maWcsXG4gIEV4cG9ydERhdGEsXG4gIEZpbGVFeHBvcnRDb25maWcsXG4gIEZpbGVHZW5lcmF0b3IsXG4gIEZpbGVUeXBlTWV0YWRhdGEsXG4gIE1lcmdlZEV4cG9ydERldGFpbHMsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRV9EQVRBUE9JTlRTX0VYUE9SVF9TRUxFQ1RPUixcbiAgU0VSSUVTX0RBVEFfTUVSR0VEX0ZJTEVfTkFNRVxufSBmcm9tICcuLi8uLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhRmV0Y2hpbmdTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhLWZldGNoaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YVByb2Nlc3NpbmdTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhLXByb2Nlc3Npbmcuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItcHJldmlldy9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhUG9pbnRzRXhwb3J0U2VsZWN0b3JEYXRhU2NvcGVDb21wb25lbnQgfSBmcm9tICcuL2RhdGFwb2ludHMtZXhwb3J0cy1zZWxlY3Rvci1kYXRhLXNjb3BlL2RhdGFwb2ludHMtZXhwb3J0cy1zZWxlY3Rvci1kYXRhLXNjb3BlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhUG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlVHlwZXNDb21wb25lbnQgfSBmcm9tICcuL2RhdGFwb2ludHMtZXhwb3J0cy1zZWxlY3Rvci1maWxlLXR5cGVzL2RhdGFwb2ludHMtZXhwb3J0cy1zZWxlY3Rvci1maWxlLXR5cGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhUG9pbnRzRXhwb3J0U2VsZWN0b3JUaW1lUmFuZ2VDb21wb25lbnQgfSBmcm9tICcuL2RhdGFwb2ludHMtZXhwb3J0cy1zZWxlY3Rvci10aW1lLXJhbmdlL2RhdGFwb2ludHMtZXhwb3J0cy1zZWxlY3Rvci10aW1lLXJhbmdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDU1ZHZW5lcmF0b3JBZGFwdGVyIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Nzdi1nZW5lcmF0b3InO1xuaW1wb3J0IHsgRXhjZWxHZW5lcmF0b3JBZGFwdGVyIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2V4Y2VsLWdlbmVyYXRvcic7XG5cbmV4cG9ydCBjb25zdCBGSUxFX0dFTkVSQVRPUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48RmlsZUdlbmVyYXRvcltdPignRklMRV9HRU5FUkFUT1JTJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IFtFeGNlbEdlbmVyYXRvckFkYXB0ZXIsIENTVkdlbmVyYXRvckFkYXB0ZXJdXG59KTtcblxuZXhwb3J0IGNvbnN0IGRhdGVSYW5nZVZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoXG4gIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxuKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICBjb25zdCBkYXRlRnJvbSA9IGNvbnRyb2wuZ2V0KCdkYXRlRnJvbScpO1xuICBjb25zdCBkYXRlVG8gPSBjb250cm9sLmdldCgnZGF0ZVRvJyk7XG5cbiAgaWYgKCFkYXRlRnJvbSB8fCAhZGF0ZVRvKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlRnJvbVZhbHVlID0gZGF0ZUZyb20udmFsdWU7XG4gIGNvbnN0IGRhdGVUb1ZhbHVlID0gZGF0ZVRvLnZhbHVlO1xuICBpZiAoZGF0ZUZyb21WYWx1ZSAmJiBkYXRlVG9WYWx1ZSkge1xuICAgIGlmIChuZXcgRGF0ZShkYXRlRnJvbVZhbHVlKSA+IG5ldyBEYXRlKGRhdGVUb1ZhbHVlKSkge1xuICAgICAgZGF0ZUZyb20uc2V0RXJyb3JzKHsgZGF0ZUFmdGVyUmFuZ2VNYXg6IHRydWUgfSk7XG4gICAgICBkYXRlVG8uc2V0RXJyb3JzKHsgZGF0ZUJlZm9yZVJhbmdlTWluOiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlRnJvbS5zZXRFcnJvcnMobnVsbCk7XG4gICAgICBkYXRlVG8uc2V0RXJyb3JzKG51bGwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtZXhwb3J0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29yZU1vZHVsZSxcbiAgICBEYXRhUG9pbnRzRXhwb3J0U2VsZWN0b3JEYXRhU2NvcGVDb21wb25lbnQsXG4gICAgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZVR5cGVzQ29tcG9uZW50LFxuICAgIERhdGFQb2ludHNFeHBvcnRTZWxlY3RvclByZXZpZXdDb21wb25lbnQsXG4gICAgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yVGltZVJhbmdlQ29tcG9uZW50LFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnO1xuICBAT3V0cHV0KCkgb25Eb3dubG9hZEJ1dHRvblN0YXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYWdncmVnYXRpb24gc2VsZWN0b3Igb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZC5cbiAgICogVGhpcyBzdGF0ZSBpcyBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRhdGUgcmFuZ2UuXG4gICAqL1xuICBkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uczogQWdncmVnYXRpb25PcHRpb25TdGF0dXMgPSB7fTtcblxuICBmb3JtR3JvdXA6IFJldHVyblR5cGU8RGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZUV4cG9ydGVyQ29tcG9uZW50WydjcmVhdGVGb3JtJ10+O1xuXG4gIC8qKlxuICAgKiBDb250YWlucyBhbGwgZGF0YXBvaW50cyB0aGF0IG51bWJlciBvZiByZWNvcmRzIGV4Y2VlZHMgYSB0aHJlc2hvbGQsIHdoZXJlIGRhdGEgZm9yIHRoZXNlIGRhdGFwb2ludHMgd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhlIGJhY2tlbmQuXG4gICAqIEFwcGxpZXMgb25seSB0byBtZWFzdXJlbWVudCBBUEkgd2hpY2ggY2FuIHJldHVybiBwcm9jZXNzZWQgQ1NWLCBFeGNlbCBvciBYTUwgZGF0YS5cbiAgICovXG4gIGRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdDogRGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0W10gPSBbXTtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGFueSBvZiBEYXRhVG9FeHBvcnQgb2JqZWN0cyB0aW1lVmFsdWVNYXAgcHJvcGVydHkgaXMgbm90IHVuZGVmaW5lZCAoc2VyaWVzIGRhdGEpXG4gICAqIG9yIGRhdGFQb2ludFRvRXhwb3J0IGlzIG5vdCB1bmRlZmluZWQgYXQgYWxsIChtZWFzdXJlbWVudCBkYXRhKS5cbiAgICovXG5cbiAgaGFzRmV0Y2hlZERhdGFBbnlWYWx1ZXNUb0V4cG9ydCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlcmUgaXMgbm8gZXhwb3J0YWJsZSBkYXRhIGJlY2F1c2UgdGhlIGRhdGUgcmFuZ2Ugb2YgYWxsIHNlbGVjdGVkIGRhdGFwb2ludHMgZXhjZWVkcyAxLDAwMCwwMDAgcmVjb3Jkcy5cbiAgICovXG4gIGhhc05vRXhwb3J0YWJsZURhdGE6IGJvb2xlYW47XG5cbiAgaGFzUGVybWlzc2lvblRvUmVhZEFueU1lYXN1cmVtZW50cyA9IGZhbHNlO1xuXG4gIGlzUHJldmlld0xvYWRpbmcgPSB0cnVlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZ1bGwgb3IgY29tcGFjdCB0eXBlIG9mIGV4cG9ydCBpcyBzZWxlY3RlZC5cbiAgICogRnVsbCB0eXBlIG9mIGV4cG9ydCBpcyBiYXNlZCBvbiBtZWFzdXJlbWVudCBBUEkgZGF0YS5cbiAgICogQ29tcGFjdCB0eXBlIG9mIGV4cG9ydCBpcyBiYXNlZCBvbiBzZXJpZXMgQVBJIGRhdGEuXG4gICAqL1xuICBpc0Z1bGxUeXBlT2ZFeHBvcnQgPSBmYWxzZTtcblxuICBwcmV2aWV3VGFibGVEYXRhOiBFeHBvcnREYXRhW107XG5cbiAgbGltaXRFeGNlZWRlZE1lc3NhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbnMgcHJvY2Vzc2VkIGRhdGEgdGhhdCBpcyBwcmVwYXJlZCB0byBiZSBleHBvcnRlZCBpZiBzZXJpZXMgZGF0YSB3YXMgZmV0Y2hlZFxuICAgKiBvciBzaG93biBpbiB0aGUgcHJldmlldyB0YWJsZSBpbiBjYXNlIG9mIG1lYXN1cmVtZW50cyBkYXRhLlxuICAgKi9cbiAgcHJpdmF0ZSBkYXRhVG9FeHBvcnQ6IERhdGFUb0V4cG9ydFtdO1xuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGRhdGFwb2ludHMgdGhhdCBzZWxlY3RlZCBkYXRlIHJhbmdlIGV4Y2VlZHMgQVBJIGxpbWl0IG9mIDFfMDAwXzAwMCByZWNvcmRzLlxuICAgKi9cbiAgcHJpdmF0ZSBkYXRhUG9pbnRzRXhjZWVkaW5nT25lTWlsbGlvbkxpbWl0OiBEYXRhcG9pbnRzRXhjZWVkaW5nTGltaXRbXTtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGZpbGUgdHlwZSBzZWxlY3Rpb24gY2hlY2tib3hlcy5cbiAgICovXG4gIHByaXZhdGUgZmlsZVR5cGVTZWxlY3Rpb25TdGF0ZTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH07XG4gIC8qKlxuICAgKiBIb2xkIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBhZ2dyZWdhdGlvbiBmcm9tIHRoZSBleHBvcnQgY29uZmlnLlxuICAgKiBWYWx1ZSB3aWxsIGJlIGxvYWRlZCBvbiBjb21wb25lbnQgZGVzdHJveS5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbEFnZ3JlZ2F0aW9uOiBBZ2dyZWdhdGlvbk9wdGlvbjtcbiAgLyoqXG4gICAqIEhvbGQgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGRhdGVGcm9tIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFZhbHVlIHdpbGwgYmUgbG9hZGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsRGF0ZUZyb206IHN0cmluZztcbiAgLyoqXG4gICAqIEhvbGQgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGRhdGVUbyBmcm9tIHRoZSBleHBvcnQgY29uZmlnLlxuICAgKiBWYWx1ZSB3aWxsIGJlIGxvYWRlZCBvbiBjb21wb25lbnQgZGVzdHJveS5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbERhdGVUbzogc3RyaW5nO1xuICAvKipcbiAgICogSG9sZCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZGF0YXBvaW50RGV0YWlscyBmcm9tIHRoZSBleHBvcnQgY29uZmlnLlxuICAgKiBTb21lIGxvZ2ljIG1heSBmaWx0ZXIgb3V0IGRhdGFwb2ludHMgaW4gZGF0YXBvaW50RGV0YWlscyBhcnJheSwgdGhhdCBleGNlZWRzIDFfMDAwXzAwMCBsaW1pdCBmb3IgbWVhc3VyZW1lbnRzIEFQSSxcbiAgICogYnV0IGZ1bGwgbGlzdCBpcyBzdGlsbCBuZWVkZWQgd2hlbiBjb21wb25lbnQgaXMgcmVvcGVuZWQuXG4gICAqIFZhbHVlIHdpbGwgYmUgbG9hZGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsRGF0YXBvaW50RGV0YWlsczogRGF0YXBvaW50RGV0YWlsc1tdO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFnZ3JlZ2F0aW9uIHZhbHVlIHdhcyBjaGFuZ2VkIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqIEl0IHByZXZlbnRzIGEgY2FzZSB3aGVyZSBmZXRjaGluZyBtYXkgYmUgdHJpZ2dlcmVkIHR3aWNlIHdoZW4gZXhwb3J0IHR5cGUgaXMgY2hhbmdlZC5cbiAgICogQm90aCBvcHRpb25zIGFsb25lIGNhbiB0cmlnZ2VyIGZldGNoaW5nIGRhdGEuXG4gICAqL1xuICBwcml2YXRlIGlzQWdncmVnYXRpb25DaGFuZ2VkUHJvZ3JhbW1hdGljYWxseSA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW55IG9mIHRoZSBleHBvcnQgZmlsZSB0eXBlcyAoQ1NWLCBFeGNlbCkgYXJlIGNoZWNrZWQuXG4gICAqL1xuICBwcml2YXRlIGlzQW55T2ZFeHBvcnRGaWxlVHlwZUNoZWNrZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGRhdGVGcm9tU3ViamVjdCA9IG5ldyBTdWJqZWN0PERhdGVGZXRjaENvbmZpZz4oKTtcbiAgcHJpdmF0ZSBkYXRlVG9TdWJqZWN0ID0gbmV3IFN1YmplY3Q8RGF0ZUZldGNoQ29uZmlnPigpO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBkeW5hbWljRmlsZXNUeXBlTWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogRmlsZVR5cGVNZXRhZGF0YSB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhZ2dyZWdhdGlvblNlcnZpY2U6IEFnZ3JlZ2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGFwb2ludHNFeHBvcnRNb2RhbFNlcnZpY2U6IERhdGFQcm9jZXNzaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2U6IERhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhRmV0Y2hpbmdTZXJ2aWNlOiBEYXRhRmV0Y2hpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIEBJbmplY3QoRklMRV9HRU5FUkFUT1JTKSBwcml2YXRlIGdlbmVyYXRvcnM6IEZpbGVHZW5lcmF0b3JbXSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zZXRGaWxlc1R5cGUodGhpcy5nZW5lcmF0b3JzKTtcblxuICAgIHRoaXMuZGF0ZUZyb21TdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChkYXRlSW5mbzogRGF0ZUZldGNoQ29uZmlnKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRGF0ZUFuZEZldGNoRGF0YSgnZGF0ZUZyb20nLCBkYXRlSW5mbyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZGF0ZVRvU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAoZGF0ZUluZm86IERhdGVGZXRjaENvbmZpZykgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZURhdGVBbmRGZXRjaERhdGEoJ2RhdGVUbycsIGRhdGVJbmZvKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0RmlsZXNUeXBlKGdlbmVyYXRvcnM6IEZpbGVHZW5lcmF0b3JbXSkge1xuICAgIGdlbmVyYXRvcnMuZm9yRWFjaChnID0+IHtcbiAgICAgIHRoaXMuZHluYW1pY0ZpbGVzVHlwZU1ldGFkYXRhW2cuZ2V0VHlwZSgpXSA9IHtcbiAgICAgICAgbGFiZWw6IGcuZ2V0TGFiZWwoKSxcbiAgICAgICAgaWNvbjogZy5nZXRJY29uKCksXG4gICAgICAgIHRpdGxlOiBnLmdldFRpdGxlKCksXG4gICAgICAgIGV4dGVuc2lvbjogZy5nZXRGaWxlRXh0ZW5zaW9uKCksXG4gICAgICAgIHppcE5hbWU6IGcuZ2V0WmlwTmFtZSgpLFxuICAgICAgICB0eXBlOiBnLmdldFR5cGUoKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNvdXJjZXNQZXJtaXR0ZWRUb1JlYWQ6IHN0cmluZ1tdID1cbiAgICAgIGF3YWl0IHRoaXMuZGF0YUZldGNoaW5nU2VydmljZS5nZXRTb3VyY2VzV2l0aFBlcm1pc3Npb25zVG9SZWFkKFxuICAgICAgICB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzXG4gICAgICApO1xuXG4gICAgaWYgKHNvdXJjZXNQZXJtaXR0ZWRUb1JlYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZXNQZXJtaXR0ZWRUb1JlYWQubGVuZ3RoICE9PSB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscyA9IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMuZmlsdGVyKGRhdGFQb2ludCA9PlxuICAgICAgICBzb3VyY2VzUGVybWl0dGVkVG9SZWFkLmluY2x1ZGVzKFN0cmluZyhkYXRhUG9pbnQuc291cmNlKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5oYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzID0gdHJ1ZTtcblxuICAgIHRoaXMuc3RvcmVJbml0aWFsQ2hhbmdlYWJsZUNvbmZpZygpO1xuXG4gICAgdGhpcy5maWxlVHlwZVNlbGVjdGlvblN0YXRlID0gdGhpcy5nZXRJbml0aWFsU2VsZWN0aW9uKHRoaXMuZHluYW1pY0ZpbGVzVHlwZU1ldGFkYXRhLCBbMF0pO1xuXG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICB0aGlzLmRhdGFUb0V4cG9ydCA9IGF3YWl0IHRoaXMuZGF0YUZldGNoaW5nU2VydmljZS5mZXRjaEFuZFByZXBhcmVEYXRhVG9FeHBvcnQoXG4gICAgICB0aGlzLmV4cG9ydENvbmZpZyxcbiAgICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0XG4gICAgKTtcblxuICAgIHRoaXMuaGFuZGxlRGF0ZVNlbGVjdG9yQ2hhbmdlcygpO1xuICAgIHRoaXMuZGV0ZXJtaW5lU2hvd2luZ1ByZXZpZXdPckVtcHR5U3RhdGUoKTtcbiAgICB0aGlzLmhhbmRsZUV4cG9ydE1vZGVDaGFuZ2VzKCk7XG4gICAgdGhpcy5oYW5kbGVGaWxlVHlwZVNlbGVjdGlvbkNoYW5nZXMoKTtcbiAgICB0aGlzLmhhbmRsZUZvcm1WYWxpZGF0aW9uQ2hhbmdlcygpO1xuXG4gICAgdGhpcy51cGRhdGVGaWxlVHlwZUNvbnRyb2woKTtcblxuICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmxvYWRJbml0aWFsQ2hhbmdlYWJsZUNvbmZpZygpO1xuICB9XG5cbiAgYXN5bmMgZXhwb3J0QW5kRG93bmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmlsZUV4cG9ydHM6IEZpbGVFeHBvcnRDb25maWdbXSA9IE9iamVjdC5lbnRyaWVzKHRoaXMuZHluYW1pY0ZpbGVzVHlwZU1ldGFkYXRhKS5tYXAoXG4gICAgICAoW18sIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgZmlsZVR5cGU6IHZhbHVlLnR5cGUgYXMgc3RyaW5nLFxuICAgICAgICB6aXBOYW1lOiB2YWx1ZS56aXBOYW1lXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEZpbGVFeHBvcnRzOiBGaWxlRXhwb3J0Q29uZmlnW10gPSB0aGlzLmdldE9ubHlTZWxlY3RlZEZpbGVFeHBvcnRzKGZpbGVFeHBvcnRzKTtcblxuICAgIHRoaXMudHJpZ2dlckdhaW5zaWdodERvd25sb2FkRXZlbnQoc2VsZWN0ZWRGaWxlRXhwb3J0cyk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHNlbGVjdGVkRmlsZUV4cG9ydHMubWFwKGFzeW5jICh7IGZpbGVUeXBlLCB6aXBOYW1lIH0pID0+IHtcbiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHRoaXMuZXhwb3J0RmlsZShmaWxlVHlwZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZG93bmxvYWRGaWxlKGJsb2IsIGZpbGVUeXBlLCB6aXBOYW1lKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZUV4cG9ydGVyU2VydmljZS5jbGVhbnVwQ2FjaGVkRGF0YSgpO1xuICB9XG5cbiAgZ2V0T25seVNlbGVjdGVkRmlsZUV4cG9ydHMoZmlsZUV4cG9ydHM6IEZpbGVFeHBvcnRDb25maWdbXSk6IEZpbGVFeHBvcnRDb25maWdbXSB7XG4gICAgcmV0dXJuIGZpbGVFeHBvcnRzLmZpbHRlcihmID0+IHRoaXMuZmlsZVR5cGVTZWxlY3Rpb25TdGF0ZVtmLmZpbGVUeXBlXSA9PT0gdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBleHBvcnRGaWxlKGZpbGVUeXBlOiBzdHJpbmcpOiBQcm9taXNlPEJsb2IgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0XG4gICAgICA/IGF3YWl0IHRoaXMuZXhwb3J0TWVhc3VyZW1lbnRGaWxlKGZpbGVUeXBlKVxuICAgICAgOiBhd2FpdCB0aGlzLmV4cG9ydFNlcmllc0ZpbGUoZmlsZVR5cGUpO1xuICB9XG5cbiAgYXN5bmMgZG93bmxvYWRGaWxlKFxuICAgIGJsb2I6IEJsb2IgfCBudWxsLFxuICAgIGZpbGVUeXBlOiBzdHJpbmcsXG4gICAgbWVhc3VyZW1lbnRzWmlwRmlsZU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdCA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5maWx0ZXIoXG4gICAgICAgIGRhdGFwb2ludCA9PiAhdGhpcy5kYXRhUG9pbnRzRXhjZWVkaW5nT25lTWlsbGlvbkxpbWl0LmluY2x1ZGVzKGRhdGFwb2ludClcbiAgICAgICk7XG5cbiAgICBjb25zdCBzaG91bGRTaG93QWxlcnQgPSB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5sZW5ndGggPiAwO1xuXG4gICAgLy8gSGFuZGxlcyBhIGNhc2Ugd2hlcmUgYWxsIGZpbGVzIGFyZSBzZW50IGJ5IGVtYWlsLlxuICAgIGlmICghYmxvYiAmJiBzaG91bGRTaG93QWxlcnQpIHtcbiAgICAgIHRoaXMuZGF0YUZldGNoaW5nU2VydmljZS5zaG93U2VuZFZpYUVtYWlsSW5mb0FsZXJ0KFxuICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXRcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGJsb2IpIHtcbiAgICAgIC8vIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgc29tZSBvZiB0aGUgZmlsZXMgYXJlIHNlbnQgYnkgZW1haWwuXG4gICAgICBpZiAoc2hvdWxkU2hvd0FsZXJ0KSB7XG4gICAgICAgIHRoaXMuZGF0YUZldGNoaW5nU2VydmljZS5zaG93U2VuZFZpYUVtYWlsSW5mb0FsZXJ0KFxuICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0XG4gICAgICAgID8gc2F2ZUFzKGJsb2IsIG1lYXN1cmVtZW50c1ppcEZpbGVOYW1lKVxuICAgICAgICA6IHNhdmVBcyhibG9iLCBibG9iW1NFUklFU19EQVRBX01FUkdFRF9GSUxFX05BTUVdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyBhIG1lYXN1cmVtZW50IGZpbGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgKlxuICAgKiBNZWFzdXJlbWVudHMgQVBJIGRvZXMgcHJvdmlkZSBhIHdheSB0byBmZXRjaCBhIHByZXByb2Nlc3NlZCBDU1YvRXhjZWwgZmlsZS5cbiAgICpcbiAgICogQXQgdGhpcyBwb2ludCBhIGJhY2tlZCBmaWxlIG5lZWRzIHRvIGJlIGZldGNoZWQuXG4gICAqIE1lYXN1cmVtZW50IGRhdGEgdXNlZCBmb3IgYSBwcmV2aWV3IGNvbnRhaW5zIGp1c3QgNSBmaXJzdCByZWNvcmRzXG4gICAqIGFuZCBpdCdzIG5vdCBmZXRjaGVkIHdpdGggQ1NWL0V4Y2VsIGhlYWRlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlVHlwZSAtIFRoZSB0eXBlIG9mIGZpbGUgdG8gZXhwb3J0LlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIEJsb2IgcmVwcmVzZW50aW5nIHRoZSBleHBvcnRlZCBmaWxlIG9yIG51bGwgd2hlbiBubyBkYXRhIHRvIGV4cG9ydCBvciBpdCdzIHNlbnQgdmlhIGVtYWlsLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0TWVhc3VyZW1lbnRGaWxlKGZpbGVUeXBlOiBzdHJpbmcpOiBQcm9taXNlPEJsb2I+IHwgbnVsbCB7XG4gICAgY29uc3QgeyBhY2NlcHRUeXBlLCBleHRlbnNpb24gfSA9IHRoaXMuZGF0YXBvaW50c0V4cG9ydE1vZGFsU2VydmljZS5maWxlVHlwZXNDb25maWdzW2ZpbGVUeXBlXTtcblxuICAgIGNvbnN0IHVwZGF0ZWRFeHBvcnRDb25maWc6IEV4cG9ydENvbmZpZyA9IHRoaXMuZXhjbHVkZURhdGFwb2ludHNUaGF0RXhjZWVkc0FwaUxpbWl0KFxuICAgICAgdGhpcy5leHBvcnRDb25maWdcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YVRvRXhwb3J0OiBEYXRhVG9FeHBvcnRXaXRoQmFja2VuZENyZWF0ZWRGaWxlW10gPVxuICAgICAgYXdhaXQgdGhpcy5kYXRhRmV0Y2hpbmdTZXJ2aWNlLmZldGNoTWVhc3VyZW1lbnREYXRhRmlsZXNBbmRQYWlyV2l0aFNvdXJjZURldGFpbHMoXG4gICAgICAgIGFjY2VwdFR5cGUsXG4gICAgICAgIHVwZGF0ZWRFeHBvcnRDb25maWdcbiAgICAgICk7XG5cbiAgICBjb25zdCBpc0FsbFVuZGVmaW5lZCA9IGRhdGFUb0V4cG9ydC5ldmVyeShkYXRhID0+IGRhdGEgPT09IHVuZGVmaW5lZCk7XG4gICAgaWYgKGlzQWxsVW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlLmdldE1lYXN1cmVtZW50RXhwb3J0ZWREYXRhQmxvYihcbiAgICAgIGV4dGVuc2lvbixcbiAgICAgIGRhdGFUb0V4cG9ydFxuICAgICk7XG4gIH1cblxuICBleGNsdWRlRGF0YXBvaW50c1RoYXRFeGNlZWRzQXBpTGltaXQoZXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWcpOiBFeHBvcnRDb25maWcge1xuICAgIGNvbnN0IHNraXBwZWREYXRhcG9pbnRzU291cmNlOiBzdHJpbmdbXSA9IHRoaXMuZGF0YVBvaW50c0V4Y2VlZGluZ09uZU1pbGxpb25MaW1pdC5tYXAoXG4gICAgICBkYXRhcG9pbnQgPT4gZGF0YXBvaW50LmRhdGFwb2ludERldGFpbC5zb3VyY2UudG9TdHJpbmcoKVxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJlZERhdGFwb2ludHM6IERhdGFwb2ludERldGFpbHNbXSA9IGV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzLmZpbHRlcihcbiAgICAgIGRhdGFwb2ludCA9PiAhc2tpcHBlZERhdGFwb2ludHNTb3VyY2UuaW5jbHVkZXMoU3RyaW5nKGRhdGFwb2ludC5zb3VyY2UpKVxuICAgICk7XG5cbiAgICBleHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscyA9IGZpbHRlcmVkRGF0YXBvaW50cztcbiAgICByZXR1cm4gZXhwb3J0Q29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIHNlcmllcyBkYXRhIHRvIGEgZmlsZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAqXG4gICAqIFNlcmllcyBBUEkgZG9lcyBub3QgcHJvdmlkZSBhIHdheSB0byBmZXRjaCBhIHByZXByb2Nlc3NlZCBDU1YvRXhjZWwgZmlsZS5cbiAgICpcbiAgICogU2VyaWVzIGRhdGEgdXNlZCBmb3IgZXhwb3J0aW5nIGEgZmlsZSBpcyBhbHJlYWR5IGZldGNoZWQgZm9yIGEgcHJldmlld1xuICAgKiBhbmQgY2FuIGJlIHJldXNlZCBmb3IgZXhwb3J0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZVR5cGUgLSBUaGUgdHlwZSBvZiBmaWxlIHRvIGV4cG9ydCAoZS5nLiwgQ1NWLCBFeGNlbCkuXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgQmxvYiByZXByZXNlbnRpbmcgdGhlIGV4cG9ydGVkIGZpbGUuXG4gICAqL1xuICBhc3luYyBleHBvcnRTZXJpZXNGaWxlKGZpbGVUeXBlOiBzdHJpbmcpOiBQcm9taXNlPEJsb2I+IHtcbiAgICBjb25zdCBtZXJnZWRFeHBvcnREZXRhaWxzOiBNZXJnZWRFeHBvcnREZXRhaWxzID0ge1xuICAgICAgYWdncmVnYXRpb246IHRoaXMuZXhwb3J0Q29uZmlnLmFnZ3JlZ2F0aW9uLFxuICAgICAgZGF0ZUZyb206IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVGcm9tLFxuICAgICAgZGF0ZVRvOiB0aGlzLmV4cG9ydENvbmZpZy5kYXRlVG9cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZUV4cG9ydGVyU2VydmljZS5nZXRTZXJpZXNFeHBvcnRlZERhdGFCbG9iKFxuICAgICAgZmlsZVR5cGUsXG4gICAgICB0aGlzLmRhdGFUb0V4cG9ydCxcbiAgICAgIG1lcmdlZEV4cG9ydERldGFpbHNcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgb25BZ2dyZWdhdGlvbkNoYW5nZShuZXdBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25PcHRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50QWdncmVnYXRpb24gPSB0aGlzLmV4cG9ydENvbmZpZy5hZ2dyZWdhdGlvbiA/PyBBR0dSRUdBVElPTl9WQUxVRVMubm9uZTtcblxuICAgIGlmIChjdXJyZW50QWdncmVnYXRpb24gPT09IG5ld0FnZ3JlZ2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb24gPSBuZXdBZ2dyZWdhdGlvbjtcblxuICAgIGlmICh0aGlzLmlzQWdncmVnYXRpb25DaGFuZ2VkUHJvZ3JhbW1hdGljYWxseSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMubG9hZEV4cG9ydERhdGEoKTtcbiAgICB0aGlzLnVwZGF0ZURvd25sb2FkQnV0dG9uU3RhdGUoKTtcbiAgfVxuXG4gIG9uRGF0ZUZyb21DaGFuZ2UodXBkYXRlZERhdGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlKHVwZGF0ZWREYXRlLCB0aGlzLmV4cG9ydENvbmZpZy5kYXRlVG8pO1xuICB9XG5cbiAgb25EYXRlVG9DaGFuZ2UodXBkYXRlZERhdGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlKHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVGcm9tLCB1cGRhdGVkRGF0ZSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEYXRlQW5kRmV0Y2hEYXRhKFxuICAgIGRhdGVUeXBlOiAnZGF0ZUZyb20nIHwgJ2RhdGVUbycsXG4gICAgZGF0ZUluZm86IERhdGVGZXRjaENvbmZpZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmV4cG9ydENvbmZpZ1tkYXRlVHlwZV0gPSBkYXRlSW5mby5kYXRlO1xuICAgIGlmICghZGF0ZUluZm8uc2hvdWxkRmV0Y2hEYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5sb2FkRXhwb3J0RGF0YSgpO1xuXG4gICAgaWYgKHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0KSB7XG4gICAgICBhd2FpdCB0aGlzLmRldGVybWluZUlmTWVhc3VyZW1lbnRSZXNwb25zZVdpbGxCZVByb2Nlc3NlZEJ5QmFja2VuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZURvd25sb2FkQnV0dG9uU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkV4cG9ydFR5cGVDaGFuZ2UoZXhwb3J0VHlwZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGV4cG9ydFR5cGUgPT09IEVYUE9SVF9NT0RFX1ZBTFVFUy5mdWxsKSB7XG4gICAgICB0aGlzLmlzQWdncmVnYXRpb25DaGFuZ2VkUHJvZ3JhbW1hdGljYWxseSA9IHRydWU7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hZ2dyZWdhdGlvbi5zZXRWYWx1ZShBR0dSRUdBVElPTl9WQUxVRVMubm9uZSk7XG4gICAgICB0aGlzLmlzQWdncmVnYXRpb25DaGFuZ2VkUHJvZ3JhbW1hdGljYWxseSA9IGZhbHNlO1xuXG4gICAgICB0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydCA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRFeHBvcnREYXRhKCk7XG4gICAgICBhd2FpdCB0aGlzLmRldGVybWluZUlmTWVhc3VyZW1lbnRSZXNwb25zZVdpbGxCZVByb2Nlc3NlZEJ5QmFja2VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRGdWxsRXhwb3J0UmVsYXRlZFByb3BlcnRpZXMoKTtcbiAgICB0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydCA9IGZhbHNlO1xuICAgIGF3YWl0IHRoaXMubG9hZEV4cG9ydERhdGEoKTtcblxuICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoKTtcblxuICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zID0gdGhpcy5hZ2dyZWdhdGlvblNlcnZpY2UuZ2V0RGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS52YWx1ZSxcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVUby52YWx1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoXG4gICAgICB7XG4gICAgICAgIGRhdGVGcm9tOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5leHBvcnRDb25maWcuZGF0ZUZyb20pLFxuICAgICAgICBkYXRlVG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLmV4cG9ydENvbmZpZy5kYXRlVG8pLFxuICAgICAgICBhZ2dyZWdhdGlvbjogbmV3IEZvcm1Db250cm9sKFxuICAgICAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLmFnZ3JlZ2F0aW9uID8gdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb24gOiBBR0dSRUdBVElPTl9WQUxVRVMubm9uZVxuICAgICAgICApLFxuICAgICAgICBleHBvcnRNb2RlOiBuZXcgRm9ybUNvbnRyb2woRVhQT1JUX01PREVfVkFMVUVTLmNvbXBhY3QpLFxuICAgICAgICBmaWxlVHlwZXM6IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoXG4gICAgICAgICAgdGhpcy5nZW5lcmF0b3JzLnJlZHVjZSgoYSwgYykgPT4ge1xuICAgICAgICAgICAgYVtjLmdldFR5cGUoKV0gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICApXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWxpZGF0b3JzOiBbZGF0ZVJhbmdlVmFsaWRhdG9yXVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVQcmV2aWV3KCk6IHZvaWQge1xuICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5wcmV2aWV3VGFibGVEYXRhID1cbiAgICAgIHRoaXMuZGF0YXBvaW50c0V4cG9ydE1vZGFsU2VydmljZS50cmFuc2Zvcm1Ub0V4cG9ydEZpbGVTdHJ1Y3R1cmVGb3JQcmV2aWV3KHRoaXMuZGF0YVRvRXhwb3J0KTtcbiAgICB0aGlzLmlzUHJldmlld0xvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGF0ZVNlbGVjdG9yQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hZ2dyZWdhdGlvbjtcbiAgICBjb25zdCBkYXRlRnJvbVNlbGVjdG9yID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZUZyb207XG4gICAgY29uc3QgZGF0ZVRvU2VsZWN0b3IgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlVG87XG5cbiAgICBjb25zdCB1cGRhdGVBZ2dyZWdhdGlvbk9wdGlvbnMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0KSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoKTtcblxuICAgICAgICBjb25zdCBmaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uVmFsdWU6IEFnZ3JlZ2F0aW9uT3B0aW9uID1cbiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uU2VydmljZS5kZXRlcm1pbmVGaXJzdE5ld0F2YWlsYWJsZUFnZ3JlZ2F0aW9uVmFsdWUoXG4gICAgICAgICAgICBhZ2dyZWdhdGlvbkNvbnRyb2wudmFsdWUsXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zXG4gICAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmlyc3RBdmFpbGFibGVBZ2dyZWdhdGlvblZhbHVlKSB7XG4gICAgICAgICAgYWdncmVnYXRpb25Db250cm9sLnNldFZhbHVlKGZpcnN0QXZhaWxhYmxlQWdncmVnYXRpb25WYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVyZ2UoZGF0ZUZyb21TZWxlY3Rvci52YWx1ZUNoYW5nZXMsIGRhdGVUb1NlbGVjdG9yLnZhbHVlQ2hhbmdlcylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUodXBkYXRlQWdncmVnYXRpb25PcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXhwb3J0TW9kZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYWdncmVnYXRpb25Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWdncmVnYXRpb247XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5leHBvcnRNb2RlLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShleHBvcnRNb2RlVmFsdWUgPT4ge1xuICAgICAgICBpZiAoZXhwb3J0TW9kZVZhbHVlLnRvU3RyaW5nKCkgPT09IEVYUE9SVF9NT0RFX1ZBTFVFUy5mdWxsKSB7XG4gICAgICAgICAgYWdncmVnYXRpb25Db250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZ2dyZWdhdGlvbkNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlVHlwZVNlbGVjdGlvbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZmlsZVR5cGVzLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShmaWxlVHlwZXNTZWxlY3Rpb25TdGF0ZSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZVR5cGVTZWxlY3Rpb25TdGF0ZShmaWxlVHlwZXNTZWxlY3Rpb25TdGF0ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsZVR5cGVTZWxlY3Rpb25TdGF0ZShjaGVja2JveGVzU3RhdGU6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgdGhpcy5pc0FueU9mRXhwb3J0RmlsZVR5cGVDaGVja2VkID0gT2JqZWN0LnZhbHVlcyhjaGVja2JveGVzU3RhdGUpLnNvbWUoXG4gICAgICB2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZVxuICAgICk7XG4gICAgdGhpcy5maWxlVHlwZVNlbGVjdGlvblN0YXRlID0gY2hlY2tib3hlc1N0YXRlO1xuICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGb3JtVmFsaWRhdGlvbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWxlVHlwZUNvbnRyb2woKTogdm9pZCB7XG4gICAgY29uc3QgZmlsZVR5cGVzQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmZpbGVUeXBlcztcbiAgICBpZiAoZmlsZVR5cGVzQ29udHJvbCkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZmlsZVR5cGVzQ29udHJvbC52YWx1ZSB8fCB7fTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRWYWx1ZSA9IHsgLi4uY3VycmVudFZhbHVlIH07XG5cbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZmlsZVR5cGVTZWxlY3Rpb25TdGF0ZSkuZm9yRWFjaCgoW2ZpbGVUeXBlLCBpc1NlbGVjdGVkXSkgPT4ge1xuICAgICAgICBpZiAoZmlsZVR5cGUgaW4gY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgdXBkYXRlZFZhbHVlW2ZpbGVUeXBlXSA9IGlzU2VsZWN0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBmaWxlVHlwZXNDb250cm9sLnBhdGNoVmFsdWUodXBkYXRlZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRldGVybWluZVNob3dpbmdQcmV2aWV3T3JFbXB0eVN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0RhdGFUb1Nob3cgPSB0aGlzLmRhdGFUb0V4cG9ydC5zb21lKGRhdGFUb0V4cG9ydEl0ZW0gPT5cbiAgICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0XG4gICAgICAgID8gISFkYXRhVG9FeHBvcnRJdGVtXG4gICAgICAgIDogZGF0YVRvRXhwb3J0SXRlbS50aW1lVmFsdWVNYXAgJiYgT2JqZWN0LmtleXMoZGF0YVRvRXhwb3J0SXRlbS50aW1lVmFsdWVNYXApLmxlbmd0aCA+IDBcbiAgICApO1xuXG4gICAgdGhpcy5oYXNGZXRjaGVkRGF0YUFueVZhbHVlc1RvRXhwb3J0ID0gaGFzRGF0YVRvU2hvdztcblxuICAgIGlmIChoYXNEYXRhVG9TaG93KSB7XG4gICAgICB0aGlzLnByZXBhcmVQcmV2aWV3KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGV0ZXJtaW5lSWZNZWFzdXJlbWVudFJlc3BvbnNlV2lsbEJlUHJvY2Vzc2VkQnlCYWNrZW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdCA9XG4gICAgICBhd2FpdCB0aGlzLmRhdGFGZXRjaGluZ1NlcnZpY2UuZ2V0RGF0YXBvaW50c0V4Y2VlZGluZ0xpbWl0KHRoaXMuZXhwb3J0Q29uZmlnKTtcblxuICAgIGNvbnN0IHsgYnJvd3NlckRvd25sb2FkYWJsZUNvdW50LCBlbWFpbERlbGl2ZXJhYmxlQ291bnQsIG5vblJldHJpZXZhYmxlQ291bnQgfSA9XG4gICAgICB0aGlzLmNhbGN1bGF0ZURhdGFwb2ludENvdW50cygpO1xuXG4gICAgdGhpcy5oYXNOb0V4cG9ydGFibGVEYXRhID1cbiAgICAgIGJyb3dzZXJEb3dubG9hZGFibGVDb3VudCA9PT0gMCAmJiBlbWFpbERlbGl2ZXJhYmxlQ291bnQgPT09IDAgJiYgbm9uUmV0cmlldmFibGVDb3VudCA+IDA7XG5cbiAgICBpZiAodGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQubGVuZ3RoID4gMCAmJiAhdGhpcy5oYXNOb0V4cG9ydGFibGVEYXRhKSB7XG4gICAgICB0aGlzLmxpbWl0RXhjZWVkZWRNZXNzYWdlID0gdGhpcy5kYXRhRmV0Y2hpbmdTZXJ2aWNlLmdldExpbWl0RXhjZWVkZWRNZXNzYWdlKFxuICAgICAgICB0aGlzLmhhc05vRXhwb3J0YWJsZURhdGEsXG4gICAgICAgIGVtYWlsRGVsaXZlcmFibGVDb3VudCxcbiAgICAgICAgYnJvd3NlckRvd25sb2FkYWJsZUNvdW50LFxuICAgICAgICBub25SZXRyaWV2YWJsZUNvdW50LFxuICAgICAgICB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQubGVuZ3RoID4gMCAmJiB0aGlzLmhhc05vRXhwb3J0YWJsZURhdGEpIHtcbiAgICAgIHRoaXMubGltaXRFeGNlZWRlZE1lc3NhZ2UgPSB0aGlzLmRhdGFGZXRjaGluZ1NlcnZpY2UuZ2V0TGltaXRFeGNlZWRlZE1lc3NhZ2UoXG4gICAgICAgIHRoaXMuaGFzTm9FeHBvcnRhYmxlRGF0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZURvd25sb2FkQnV0dG9uU3RhdGUoKTtcblxuICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEYXRhcG9pbnRDb3VudHMoKTogRGF0YXBvaW50Q291bnRzIHtcbiAgICBjb25zdCBSRUNPUkRfQVBJX0xJTUlUID0gMV8wMDBfMDAwO1xuXG4gICAgdGhpcy5kYXRhUG9pbnRzRXhjZWVkaW5nT25lTWlsbGlvbkxpbWl0ID0gdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQuZmlsdGVyKFxuICAgICAgZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0ID0+XG4gICAgICAgIGRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC50b3RhbEVsZW1lbnRzID4gUkVDT1JEX0FQSV9MSU1JVFxuICAgICk7XG5cbiAgICBjb25zdCBub25SZXRyaWV2YWJsZUNvdW50ID0gdGhpcy5kYXRhUG9pbnRzRXhjZWVkaW5nT25lTWlsbGlvbkxpbWl0Lmxlbmd0aDtcblxuICAgIGNvbnN0IGVtYWlsRGVsaXZlcmFibGVDb3VudCA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5sZW5ndGggLSBub25SZXRyaWV2YWJsZUNvdW50O1xuXG4gICAgY29uc3QgYnJvd3NlckRvd25sb2FkYWJsZUNvdW50ID1cbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMubGVuZ3RoIC0gZW1haWxEZWxpdmVyYWJsZUNvdW50IC0gbm9uUmV0cmlldmFibGVDb3VudDtcblxuICAgIHJldHVybiB7XG4gICAgICBicm93c2VyRG93bmxvYWRhYmxlQ291bnQsXG4gICAgICBlbWFpbERlbGl2ZXJhYmxlQ291bnQsXG4gICAgICBub25SZXRyaWV2YWJsZUNvdW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcmVJbml0aWFsQ2hhbmdlYWJsZUNvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxEYXRlRnJvbSA9IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVGcm9tO1xuICAgIHRoaXMuaW5pdGlhbERhdGVUbyA9IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVUbztcbiAgICB0aGlzLmluaXRpYWxEYXRhcG9pbnREZXRhaWxzID0gdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscztcbiAgICBpZiAoIXRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0KSB7XG4gICAgICB0aGlzLmluaXRpYWxBZ2dyZWdhdGlvbiA9IHRoaXMuZXhwb3J0Q29uZmlnLmFnZ3JlZ2F0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEluaXRpYWxDaGFuZ2VhYmxlQ29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVGcm9tID0gdGhpcy5pbml0aWFsRGF0ZUZyb207XG4gICAgdGhpcy5leHBvcnRDb25maWcuZGF0ZVRvID0gdGhpcy5pbml0aWFsRGF0ZVRvO1xuICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMgPSB0aGlzLmluaXRpYWxEYXRhcG9pbnREZXRhaWxzO1xuICAgIGlmICghdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQpIHtcbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLmFnZ3JlZ2F0aW9uID0gdGhpcy5pbml0aWFsQWdncmVnYXRpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuaW52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLm9uRG93bmxvYWRCdXR0b25TdGF0ZUNoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIHRoaXMuZGF0YVRvRXhwb3J0ID0gYXdhaXQgdGhpcy5kYXRhRmV0Y2hpbmdTZXJ2aWNlLmZldGNoQW5kUHJlcGFyZURhdGFUb0V4cG9ydChcbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLFxuICAgICAgdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnRcbiAgICApO1xuXG4gICAgdGhpcy5kZXRlcm1pbmVTaG93aW5nUHJldmlld09yRW1wdHlTdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNhbkVuYWJsZURvd25sb2FkQnV0dG9uID1cbiAgICAgIHRoaXMuaGFzRmV0Y2hlZERhdGFBbnlWYWx1ZXNUb0V4cG9ydCAmJlxuICAgICAgIXRoaXMuZm9ybUdyb3VwLmludmFsaWQgJiZcbiAgICAgIHRoaXMuaXNBbnlPZkV4cG9ydEZpbGVUeXBlQ2hlY2tlZCAmJlxuICAgICAgIXRoaXMuaGFzTm9FeHBvcnRhYmxlRGF0YTtcblxuICAgIHRoaXMub25Eb3dubG9hZEJ1dHRvblN0YXRlQ2hhbmdlLmVtaXQoY2FuRW5hYmxlRG93bmxvYWRCdXR0b24pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZ1bGxFeHBvcnRSZWxhdGVkUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICB0aGlzLmhhc05vRXhwb3J0YWJsZURhdGEgPSBmYWxzZTtcbiAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdCA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbml0aWFsU2VsZWN0aW9uKFxuICAgIGZpbGVUeXBlOiB7IFtrZXk6IHN0cmluZ106IEZpbGVUeXBlTWV0YWRhdGEgfSxcbiAgICBzZWxlY3RCeURlZmF1bHQ6IG51bWJlcltdXG4gICkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmaWxlVHlwZSk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNlbGVjdGlvbiA9IGtleXMucmVkdWNlPHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9PigoYWNjLCBrZXkpID0+IHtcbiAgICAgIGFjY1trZXldID0gZmFsc2U7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIHNlbGVjdEJ5RGVmYXVsdC5mb3JFYWNoKGluZGV4ID0+IHtcbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwga2V5cy5sZW5ndGgpIHtcbiAgICAgICAgaW5pdGlhbFNlbGVjdGlvbltrZXlzW2luZGV4XV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluaXRpYWxTZWxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQWRqdXN0cyBib3RoIFwiZnJvbVwiIGFuZCBcInRvXCIgZGF0ZXMgd2hlbiBlaXRoZXIgaXMgdXBkYXRlZDpcbiAgICogLSBSZXNldHMgc2Vjb25kcyB0byAwMCBldmVuIHdoZW4gb25seSBvbmUgZGF0ZSBjaGFuZ2VzXG4gICAqIC0gUHJldmVudHMgcGVyc2lzdGluZyBoaWRkZW4gc2Vjb25kcyDiiaAgMDAgZnJvbSBpbml0aWFsIGxvYWRcbiAgICogLSBUcmlnZ2VycyBkYXRhIGZldGNoXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIFdoZW4gdXNlciBjaGFuZ2VzIFwiZnJvbVwiIGRhdGU6XG4gICAqIElucHV0OiBzdGFydERhdGUgPSBcIjIwMjQtMDMtMjYgMTM6MzA6NDVcIiwgZW5kRGF0ZSA9IFwiMjAyNC0wMy0yNyAxNToyMDo0NVwiXG4gICAqIFJlc3VsdDogc3RhcnREYXRlIC0+IFwiMjAyNC0wMy0yNiAxNDozMDowMFwiLCBlbmREYXRlIC0+IFwiMjAyNC0wMy0yNyAxNToyMDowMFwiXG4gICAqXG4gICAqIFdoZW4gdXNlciBjaGFuZ2VzIFwidG9cIiBkYXRlOlxuICAgKiBJbnB1dDogc3RhcnREYXRlID0gXCIyMDI0LTAzLTI2IDE0OjMwOjQ1XCIsIGVuZERhdGUgPSBcIjIwMjQtMDMtMjcgMTU6MjA6NDVcIlxuICAgKiBSZXN1bHQ6IHN0YXJ0RGF0ZSAtPiBcIjIwMjQtMDMtMjYgMTQ6MzA6MDBcIiwgZW5kRGF0ZSAtPiBcIjIwMjQtMDMtMjcgMTY6MjA6MDBcIlxuICAgKlxuICAgKiBAcGFyYW0gc3RhcnREYXRlIC0gVGhlIFwic3RhcnRcIiBkYXRlIHRvIGJlIGFkanVzdGVkLlxuICAgKiBAcGFyYW0gZW5kRGF0ZSAtIFRoZSBcImVuZFwiIGRhdGUgdG8gYmUgYWRqdXN0ZWQuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZShzdGFydERhdGU6IHN0cmluZywgZW5kRGF0ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlRnJvbVN1YmplY3QubmV4dCh7XG4gICAgICBkYXRlOiB0aGlzLmRhdGFGZXRjaGluZ1NlcnZpY2UuYWRqdXN0RGF0ZShzdGFydERhdGUsIDApLFxuICAgICAgc2hvdWxkRmV0Y2hEYXRhOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgdGhpcy5kYXRlVG9TdWJqZWN0Lm5leHQoe1xuICAgICAgZGF0ZTogdGhpcy5kYXRhRmV0Y2hpbmdTZXJ2aWNlLmFkanVzdERhdGUoZW5kRGF0ZSwgMCksXG4gICAgICBzaG91bGRGZXRjaERhdGE6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlckdhaW5zaWdodERvd25sb2FkRXZlbnQoc2VsZWN0ZWRGaWxlRXhwb3J0czogRmlsZUV4cG9ydENvbmZpZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgY29tbW9uRXZlbnREYXRhID0ge1xuICAgICAgYWN0aW9uOiBQUk9EVUNUX0VYUEVSSUVOQ0VfREFUQVBPSU5UU19FWFBPUlRfU0VMRUNUT1IuQUNUSU9OUy5ET1dOTE9BRF9TVEFSVEVELFxuICAgICAgY29tcG9uZW50OlxuICAgICAgICBQUk9EVUNUX0VYUEVSSUVOQ0VfREFUQVBPSU5UU19FWFBPUlRfU0VMRUNUT1IuQ09NUE9ORU5UU1xuICAgICAgICAgIC5EQVRBUE9JTlRTX0VYUE9SVF9TRUxFQ1RPUl9GSUxFX0VYUE9SVEVSLFxuICAgICAgc2VsZWN0ZWRGaWxlVHlwZTogc2VsZWN0ZWRGaWxlRXhwb3J0cy5tYXAoaXRlbSA9PiBpdGVtLmZpbGVUeXBlKVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQpIHtcbiAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS50cmlnZ2VyRXZlbnQoXG4gICAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9EQVRBUE9JTlRTX0VYUE9SVF9TRUxFQ1RPUi5FVkVOVFMuRVhQT1JUX1NFTEVDVE9SLFxuICAgICAgICB7XG4gICAgICAgICAgLi4uY29tbW9uRXZlbnREYXRhLFxuICAgICAgICAgIHNlbGVjdGVkRXhwb3J0VHlwZTpcbiAgICAgICAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9EQVRBUE9JTlRTX0VYUE9SVF9TRUxFQ1RPUi5FWFBPUlRfQ09ORklHLkZVTExfRVhQT1JUX1RZUEVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChcbiAgICAgICAgUFJPRFVDVF9FWFBFUklFTkNFX0RBVEFQT0lOVFNfRVhQT1JUX1NFTEVDVE9SLkVWRU5UUy5FWFBPUlRfU0VMRUNUT1IsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5jb21tb25FdmVudERhdGEsXG4gICAgICAgICAgc2VsZWN0ZWRFeHBvcnRUeXBlOlxuICAgICAgICAgICAgUFJPRFVDVF9FWFBFUklFTkNFX0RBVEFQT0lOVFNfRVhQT1JUX1NFTEVDVE9SLkVYUE9SVF9DT05GSUcuQ09NUEFDVF9FWFBPUlRfVFlQRSxcbiAgICAgICAgICBzZWxlY3RlZEFnZ3JlZ2F0aW9uOiB0aGlzLmV4cG9ydENvbmZpZy5hZ2dyZWdhdGlvbiA/PyBBR0dSRUdBVElPTl9WQUxVRVMubm9uZVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInAtYi0xNlwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzUGVybWlzc2lvblRvUmVhZEFueU1lYXN1cmVtZW50czsgZWxzZSBoYXNOb1JvbGVUb1JlYWRBbnlNZWFzdXJlbWVudHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwicC0xNiB0ZXh0LWNlbnRlciBzZXBhcmF0b3ItYm90dG9tIHN0aWNreS10b3AgYmctY29tcG9uZW50XCI+XG4gICAgICA8cCBjbGFzcz1cInRleHQtbWVkaXVtIHRleHQtMTZcIj5cbiAgICAgICAge3sgJ0NvbmZpZ3VyZSBleHBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJwLXQtMjQgcC1yLTE2IHAtbC0xNiBnYXAtOCBwLWItMTYgZmxleC13cmFwXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlcGFyYXRvci1ib3R0b20nOiBpc0Z1bGxUeXBlT2ZFeHBvcnQgfVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICA8Yzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLXRpbWUtcmFuZ2VcbiAgICAgICAgICAgICpuZ0lmPVwidGhpcy5oYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzXCJcbiAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgICAgICAgICAgIChvbkRhdGVGcm9tQ2hhbmdlKT1cIm9uRGF0ZUZyb21DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25EYXRlVG9DaGFuZ2UpPVwib25EYXRlVG9DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvYzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLXRpbWUtcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICA8Yzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWRhdGEtc2NvcGVcbiAgICAgICAgICAgICpuZ0lmPVwidGhpcy5oYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc109XCJkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc1wiXG4gICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICAgICAgICAob25BZ2dyZWdhdGlvbkNoYW5nZSk9XCJvbkFnZ3JlZ2F0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgKG9uRXhwb3J0VHlwZUNoYW5nZSk9XCJvbkV4cG9ydFR5cGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvYzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWRhdGEtc2NvcGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICA8Yzh5LWRhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtdHlwZXNcbiAgICAgICAgICAgICpuZ0lmPVwidGhpcy5oYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzXCJcbiAgICAgICAgICAgIFtkeW5hbWljRmlsZXNUeXBlTWV0YWRhdGFdPVwiZHluYW1pY0ZpbGVzVHlwZU1ldGFkYXRhXCJcbiAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgICAgICAgICA+PC9jOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS10eXBlcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cIiFpc0Z1bGxUeXBlT2ZFeHBvcnQgJiYgIWhhc0ZldGNoZWREYXRhQW55VmFsdWVzVG9FeHBvcnQgJiYgIWlzUHJldmlld0xvYWRpbmdcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtMjQgcC1yLTE2IHAtbC0xNiBwLWItMTYgZC1mbGV4XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmcgY2VudGVyLWJsb2NrXCJcbiAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICAgIGRhdGEtY3k9XCJmaWxlLWV4cG9ydGVyLS1uby1kYXRhLWF2YWlsYWJsZVwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBObyBkYXRhIGF2YWlsYWJsZS5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0Lmxlbmd0aCA+IDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtMjQgcC1yLTE2IHAtbC0xNiBwLWItMTYgc2VwYXJhdG9yLWJvdHRvbSBkLWZsZXhcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgIGhhc05vRXhwb3J0YWJsZURhdGFcbiAgICAgICAgICAgICAgPyAnYWxlcnQgYWxlcnQtd2FybmluZyBjZW50ZXItYmxvY2snXG4gICAgICAgICAgICAgIDogJ2FsZXJ0IGFsZXJ0LWluZm8gY2VudGVyLWJsb2NrJ1xuICAgICAgICAgIFwiXG4gICAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImxpbWl0RXhjZWVkZWRNZXNzYWdlXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRnVsbFR5cGVPZkV4cG9ydFwiPlxuICAgICAgPGM4eS1kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1wcmV2aWV3XG4gICAgICAgICpuZ0lmPVwidGhpcy5oYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzXCJcbiAgICAgICAgW2hhc0ZldGNoZWREYXRhQW55VmFsdWVzVG9FeHBvcnRdPVwiaGFzRmV0Y2hlZERhdGFBbnlWYWx1ZXNUb0V4cG9ydFwiXG4gICAgICAgIFtpc1ByZXZpZXdMb2FkaW5nXT1cImlzUHJldmlld0xvYWRpbmdcIlxuICAgICAgICBbcHJldmlld1RhYmxlRGF0YV09XCJwcmV2aWV3VGFibGVEYXRhXCJcbiAgICAgID48L2M4eS1kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1wcmV2aWV3PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNoYXNOb1JvbGVUb1JlYWRBbnlNZWFzdXJlbWVudHM+XG4gICAgPGRpdiBjbGFzcz1cInAtdC0yNCBwLXItMTYgcC1sLTE2IHAtYi0xNiBkLWZsZXhcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIGNlbnRlci1ibG9ja1wiXG4gICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICA8cD5UbyBleHBvcnQgZGF0YSwgeW91IG11c3QgbWVldCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgY3JpdGVyaWE6PC9wPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpPlxuICAgICAgICAgICAgSGF2ZVxuICAgICAgICAgICAgPGI+UkVBRCBwZXJtaXNzaW9uIGZvciBcIk1lYXN1cmVtZW50c1wiIHBlcm1pc3Npb24gdHlwZTwvYj5cbiAgICAgICAgICAgIChlaXRoZXIgYXMgYSBnbG9iYWwgcm9sZSBvciBmb3IgdGhlIHNwZWNpZmljIHNvdXJjZSlcbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIEJlIHRoZVxuICAgICAgICAgICAgPGI+b3duZXIgb2YgdGhlIHNvdXJjZTwvYj5cbiAgICAgICAgICAgIHlvdSB3YW50IHRvIGV4cG9ydCBkYXRhIGZyb21cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgICA8cD5Eb24ndCBtZWV0IHRoZXNlIHJlcXVpcmVtZW50cz8gQ29udGFjdCB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGZvciBhc3Npc3RhbmNlLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG4iXX0=
|