@c8y/ngx-components 1021.55.1 → 1021.55.3
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/common/interval-based-reload.abstract.d.ts +13 -3
- package/core/common/interval-based-reload.abstract.d.ts.map +1 -1
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +3 -4
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -1
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -1
- package/core/dashboard/widgets-dashboard-event.service.d.ts +7 -0
- package/core/dashboard/widgets-dashboard-event.service.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +6 -2
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
- package/datapoint-explorer/view/configuration/workspace-configuration.component.d.ts.map +1 -1
- 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.component.d.ts +3 -1
- package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -1
- package/echart/charts.component.d.ts.map +1 -1
- package/esm2022/core/aggregation/aggregation.model.mjs +2 -2
- package/esm2022/core/common/interval-based-reload.abstract.mjs +13 -13
- package/esm2022/core/dashboard/dashboard-child.component.mjs +3 -3
- package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +6 -8
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +9 -1
- package/esm2022/core/dashboard/widgets-dashboard-event.service.mjs +19 -2
- package/esm2022/core/dashboard/widgets-dashboard.component.mjs +3 -3
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +3 -3
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +48 -23
- package/esm2022/datapoint-explorer/view/configuration/workspace-configuration.component.mjs +13 -8
- package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +2 -2
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +1 -3
- package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +9 -5
- package/esm2022/echart/charts.component.mjs +22 -84
- package/esm2022/widgets/definitions/datapoints-table/index.mjs +3 -2
- package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +3 -3
- package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +17 -100
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +47 -34
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +35 -13
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +3 -3
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +75 -35
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +3 -5
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +13 -8
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +7 -6
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +21 -83
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +18 -101
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +147 -76
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +209 -162
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +3 -7
- package/package.json +1 -1
- package/widgets/definitions/datapoints-table/index.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +18 -63
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +4 -2
- 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-reload/datapoints-reload.component.d.ts +16 -8
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +21 -4
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +4 -1
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -1
|
@@ -40,9 +40,7 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
40
40
|
this.widgetConfig = widgetConfig;
|
|
41
41
|
this.AGGREGATION_LABELS = AGGREGATION_LABELS;
|
|
42
42
|
this.DATE_SELECTION_LABELS = DATE_SELECTION_LABELS;
|
|
43
|
-
|
|
44
|
-
// readonly DEFAULT_DATE_SELECTOR_VALUE = DATE_SELECTION_VALUES.dashboard_context;
|
|
45
|
-
this.DEFAULT_DATE_SELECTOR_VALUE = DATE_SELECTION_VALUES.config;
|
|
43
|
+
this.DEFAULT_DATE_SELECTOR_VALUE = DATE_SELECTION_VALUES.dashboard_context;
|
|
46
44
|
this.DEFAULT_INTERVAL_VALUE = INTERVAL_VALUES.hours;
|
|
47
45
|
this.TIME_RANGE_INTERVAL_LABELS = TIME_RANGE_INTERVAL_LABELS;
|
|
48
46
|
this.AGGREGATION_VALUES_ARR = AGGREGATION_VALUES_ARR;
|
|
@@ -77,14 +75,11 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
77
75
|
this.destroy$ = new Subject();
|
|
78
76
|
}
|
|
79
77
|
ngOnInit() {
|
|
80
|
-
// Condition will be removed in MTM-61920
|
|
81
|
-
if (this.config.widgetInstanceGlobalTimeContext) {
|
|
82
|
-
this.config.widgetInstanceGlobalTimeContext = false;
|
|
83
|
-
}
|
|
84
78
|
if (this.widgetConfig.context?.id) {
|
|
85
79
|
this.datapointSelectionConfig.contextAsset = this.widgetConfig?.context;
|
|
86
80
|
}
|
|
87
|
-
this.isWidgetLinkedToGlobalTimeContext =
|
|
81
|
+
this.isWidgetLinkedToGlobalTimeContext =
|
|
82
|
+
this.config.widgetInstanceGlobalAutoRefreshContext ?? true;
|
|
88
83
|
this.initForm();
|
|
89
84
|
this.handleAutoRefreshToggleChanges();
|
|
90
85
|
this.handleIntervalSelectorChanges();
|
|
@@ -100,8 +95,7 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
100
95
|
if (this.formGroup.value.aggregation === AGGREGATION_VALUES.none ||
|
|
101
96
|
(!this.formGroup.value.aggregation && config.aggregation === AGGREGATION_VALUES.none)) {
|
|
102
97
|
// The 'NONE' aggregation type is not handled by a backend, so it simply needs to be deleted to get data without aggregation.
|
|
103
|
-
|
|
104
|
-
delete config.aggregation;
|
|
98
|
+
this.deleteAggregationProperty(config);
|
|
105
99
|
}
|
|
106
100
|
this.updateTimeContext(config, this.formGroup.value.globalDateSelector);
|
|
107
101
|
Object.assign(config, this.formGroup.value);
|
|
@@ -113,19 +107,21 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
113
107
|
}
|
|
114
108
|
updateTimeContext(config, selectedDateContext) {
|
|
115
109
|
switch (selectedDateContext) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
110
|
+
case DATE_SELECTION_VALUES.dashboard_context:
|
|
111
|
+
config.displayDateSelection = false;
|
|
112
|
+
config.widgetInstanceGlobalAutoRefreshContext = true;
|
|
113
|
+
if (config.aggregation !== 'NONE') {
|
|
114
|
+
this.deleteAggregationProperty(config);
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
121
117
|
case DATE_SELECTION_VALUES.view_and_config:
|
|
122
118
|
config.displayDateSelection = true;
|
|
123
|
-
config.
|
|
119
|
+
config.widgetInstanceGlobalAutoRefreshContext = false;
|
|
124
120
|
break;
|
|
125
121
|
case DATE_SELECTION_VALUES.config:
|
|
126
122
|
default:
|
|
127
123
|
config.displayDateSelection = false;
|
|
128
|
-
config.
|
|
124
|
+
config.widgetInstanceGlobalAutoRefreshContext = false;
|
|
129
125
|
}
|
|
130
126
|
}
|
|
131
127
|
initForm() {
|
|
@@ -139,7 +135,8 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
139
135
|
}
|
|
140
136
|
createForm() {
|
|
141
137
|
const { dateFrom, dateTo } = this.datapointsTableService.calculateDateRange(this.DEFAULT_INTERVAL_VALUE);
|
|
142
|
-
const isLegacyWidget = this.config.
|
|
138
|
+
const isLegacyWidget = this.config.hasOwnProperty('widgetInstanceGlobalTimeContext') &&
|
|
139
|
+
!this.config.hasOwnProperty('decimalPlaces');
|
|
143
140
|
return this.formBuilder.group({
|
|
144
141
|
aggregation: new FormControl({
|
|
145
142
|
value: AGGREGATION_VALUES.none,
|
|
@@ -150,7 +147,9 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
150
147
|
Validators.minLength(1),
|
|
151
148
|
minOneDatapointActive()
|
|
152
149
|
]),
|
|
153
|
-
globalDateSelector: new FormControl(
|
|
150
|
+
globalDateSelector: new FormControl(isLegacyWidget
|
|
151
|
+
? this.determineGlobalDateSelectorValueForLegacyWidget()
|
|
152
|
+
: this.DEFAULT_DATE_SELECTOR_VALUE),
|
|
154
153
|
dateFrom: new FormControl(dateFrom),
|
|
155
154
|
dateTo: new FormControl(dateTo),
|
|
156
155
|
decimalPlaces: [
|
|
@@ -170,15 +169,26 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
170
169
|
})
|
|
171
170
|
}, { validators: dateRangeValidator });
|
|
172
171
|
}
|
|
172
|
+
determineGlobalDateSelectorValueForLegacyWidget() {
|
|
173
|
+
const { displayDateSelection, widgetInstanceGlobalAutoRefreshContext } = this.config;
|
|
174
|
+
// State of widgetInstanceGlobalTimeContext was converted to widgetInstanceGlobalAutoRefreshContext.
|
|
175
|
+
// That is why it use here in a legacy widget context.
|
|
176
|
+
if (widgetInstanceGlobalAutoRefreshContext) {
|
|
177
|
+
return DATE_SELECTION_VALUES.dashboard_context;
|
|
178
|
+
}
|
|
179
|
+
return displayDateSelection
|
|
180
|
+
? DATE_SELECTION_VALUES.view_and_config
|
|
181
|
+
: DATE_SELECTION_VALUES.config;
|
|
182
|
+
}
|
|
173
183
|
isAutoRefershDisabled() {
|
|
174
184
|
const isInitialWidgetCreation = Object.keys(this.config).length === 1 && this.config['settings'];
|
|
175
185
|
if (isInitialWidgetCreation) {
|
|
176
186
|
return false;
|
|
177
187
|
}
|
|
178
188
|
const isLegacyWidgetRealtimeNotActive = !this.config.realtime &&
|
|
179
|
-
!this.config.decimalPlaces &&
|
|
180
|
-
!this.config.refreshInterval &&
|
|
181
|
-
!this.config.isAutoRefreshEnabled;
|
|
189
|
+
!this.config.hasOwnProperty('decimalPlaces') &&
|
|
190
|
+
!this.config.hasOwnProperty('refreshInterval') &&
|
|
191
|
+
!this.config.hasOwnProperty('isAutoRefreshEnabled');
|
|
182
192
|
if (isLegacyWidgetRealtimeNotActive) {
|
|
183
193
|
return true;
|
|
184
194
|
}
|
|
@@ -295,14 +305,13 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
295
305
|
handleGlobalDateSelectorChanges() {
|
|
296
306
|
this.formGroup.controls.globalDateSelector.valueChanges
|
|
297
307
|
.pipe(takeUntil(this.destroy$))
|
|
298
|
-
.subscribe(() => {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
// }
|
|
308
|
+
.subscribe((selected) => {
|
|
309
|
+
if (selected === DATE_SELECTION_VALUES.dashboard_context) {
|
|
310
|
+
this.handleDashboardContext();
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
this.handleNonDashboardContext();
|
|
314
|
+
}
|
|
306
315
|
});
|
|
307
316
|
}
|
|
308
317
|
handleDashboardContext() {
|
|
@@ -317,7 +326,7 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
317
326
|
this.setIntervalToCustom(this.formGroup.controls.interval);
|
|
318
327
|
}
|
|
319
328
|
isConfigSavedWithoutDashboardTimeOption() {
|
|
320
|
-
return !this.config.
|
|
329
|
+
return !this.config.widgetInstanceGlobalAutoRefreshContext;
|
|
321
330
|
}
|
|
322
331
|
updateAggregationIfNecessary() {
|
|
323
332
|
const aggregationControl = this.formGroup.controls.aggregation;
|
|
@@ -350,8 +359,12 @@ export class DatapointsTableWidgetConfigComponent {
|
|
|
350
359
|
aggregationControl.setValue(newAggregationValue);
|
|
351
360
|
}
|
|
352
361
|
}
|
|
362
|
+
deleteAggregationProperty(config) {
|
|
363
|
+
delete this.formGroup.value.aggregation;
|
|
364
|
+
delete config.aggregation;
|
|
365
|
+
}
|
|
353
366
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsTableWidgetConfigComponent, deps: [{ token: i1.AggregationService }, { token: i2.DatapointsTableService }, { token: i3.FormBuilder }, { token: i3.NgForm }, { token: i4.WidgetConfigComponent }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
354
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsTableWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-table-view-config", inputs: { config: "config" }, ngImport: i0, template: "<div class=\"p-l-24 p-r-24\">\n <form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n >\n <!-- <datapoints-selector> -->\n <div class=\"col-md-6\">\n <div class=\"row\">\n <!-- global-time-context-selector -->\n <div class=\"form-group m-b-0 p-b-16 separator-bottom\">\n <label\n class=\"d-flex a-i-center p-t-4\"\n for=\"dateSelection\"\n >\n {{ 'Date selection' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"popoverTemplate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <ng-template #popoverTemplate>\n <span translate>\n Choose how to select a date range, the available options are:\n <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n <!-- Will be re-enabled in MTM-61920 -->\n <!-- <li>\n <b>Dashboard time range:</b>\n restricts date selection to the global dashboard configuration only\n </li> -->\n <li>\n <b>Widget configuration:</b>\n restricts the date selection only to the widget configuration\n </li>\n <li>\n <b>Widget and widget configuration:</b>\n restricts the date selection to the widget view and widget configuration only\n </li>\n </ul>\n </span>\n </ng-template>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Date selection' | translate\"\n [attr.aria-label]=\"'Date selection' | translate\"\n id=\"globalDateSelector\"\n formControlName=\"globalDateSelector\"\n >\n <option\n *ngFor=\"let dataSelectionValue of DATE_SELECTION_VALUES_ARR\"\n [ngValue]=\"dataSelectionValue\"\n >\n {{ DATE_SELECTION_LABELS[dataSelectionValue] | translate }}\n </option>\n </select>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n listTitle=\"{{ 'Data points' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"row\">\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"col-md-6\">\n <!-- interval selector -->\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex a-i-center\">\n {{ 'Auto refresh' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Change the state of interval automatic refresh and set the refresh frequency.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-16 form-group-sm\">\n <div class=\"d-flex gap-4 m-t-8 m-b-8 a-i-center\">\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n (click)=\"toggleRefreshIntervalControl()\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Auto refresh' | translate }}</span>\n </label>\n <label\n class=\"m-b-0\"\n for=\"refreshInterval\"\n >\n {{ 'Interval' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_VALUES_ARR\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </ng-container>\n <!-- decimal input -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Decimal places' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <input\n class=\"form-control\"\n name=\"decimalPlaces\"\n type=\"number\"\n formControlName=\"decimalPlaces\"\n step=\"1\"\n />\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- aggregation selector -->\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Aggregation' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <!-- Setting below [attr.disabled] ensures that the control is visually disabled and user interaction is prevented,\n while still allowing the value to be updated and saved correctly in the form.\n This solution covers the case where the user enables auto-refresh, in which case aggregation must be set to NONE. -->\n <select\n class=\"form-control text-12\"\n [title]=\"'Aggregation' | translate\"\n id=\"aggregation\"\n formControlName=\"aggregation\"\n [attr.disabled]=\"formGroup.value.isAutoRefreshEnabled ? true : null\"\n >\n <option\n *ngFor=\"let aggregationValue of AGGREGATION_VALUES_ARR\"\n [ngValue]=\"aggregationValue\"\n [disabled]=\"disabledAggregationOptions[aggregationValue]\"\n >\n {{ AGGREGATION_LABELS[aggregationValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n <!-- time interval selector -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Time interval' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Interval' | translate\"\n id=\"interval\"\n formControlName=\"interval\"\n >\n <option\n *ngFor=\"let intervalValue of INTERVAL_VALUES_ARR\"\n [ngValue]=\"intervalValue\"\n >\n {{ TIME_RANGE_INTERVAL_LABELS[intervalValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- date pickers -->\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Date range' | translate }}\n </legend>\n <c8y-date-range-picker></c8y-date-range-picker>\n </fieldset>\n </ng-container>\n </div>\n </form>\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: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i6.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "component", type: DateRangePickerComponent, selector: "c8y-date-range-picker", inputs: ["isEmittingDateChange", "showLabel"], outputs: ["updatedDate"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i7.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
|
|
367
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsTableWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-table-view-config", inputs: { config: "config" }, ngImport: i0, template: "<div class=\"p-l-24 p-r-24\">\n <form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n >\n <!-- <datapoints-selector> -->\n <div class=\"col-md-6\">\n <div class=\"row\">\n <!-- global-time-context-selector -->\n <div class=\"form-group m-b-0 p-b-16 separator-bottom\">\n <label\n class=\"d-flex a-i-center p-t-4\"\n for=\"dateSelection\"\n >\n {{ 'Date selection' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"popoverTemplate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <ng-template #popoverTemplate>\n <span translate>\n Choose how to select a date range, the available options are:\n <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n <li>\n <b>Dashboard time range:</b>\n restricts date selection to the global dashboard configuration only\n </li>\n <li>\n <b>Widget configuration:</b>\n restricts the date selection only to the widget configuration\n </li>\n <li>\n <b>Widget and widget configuration:</b>\n restricts the date selection to the widget view and widget configuration only\n </li>\n </ul>\n </span>\n </ng-template>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Date selection' | translate\"\n [attr.aria-label]=\"'Date selection' | translate\"\n id=\"globalDateSelector\"\n formControlName=\"globalDateSelector\"\n >\n <option\n *ngFor=\"let dataSelectionValue of DATE_SELECTION_VALUES_ARR\"\n [ngValue]=\"dataSelectionValue\"\n >\n {{ DATE_SELECTION_LABELS[dataSelectionValue] | translate }}\n </option>\n </select>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n listTitle=\"{{ 'Data points' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"row\">\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"col-md-6\">\n <!-- interval selector -->\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex a-i-center\">\n {{ 'Auto refresh' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Change the state of interval automatic refresh and set the refresh frequency.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-16 form-group-sm\">\n <div class=\"d-flex gap-4 m-t-8 m-b-8 a-i-center\">\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n (click)=\"toggleRefreshIntervalControl()\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Auto refresh' | translate }}</span>\n </label>\n <label\n class=\"m-b-0\"\n for=\"refreshInterval\"\n >\n {{ 'Interval' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_VALUES_ARR\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </ng-container>\n <!-- decimal input -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Decimal places' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <input\n class=\"form-control\"\n name=\"decimalPlaces\"\n type=\"number\"\n formControlName=\"decimalPlaces\"\n step=\"1\"\n />\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- aggregation selector -->\n <div class=\"row\">\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Aggregation' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <!-- Setting below [attr.disabled] ensures that the control is visually disabled and user interaction is prevented,\n while still allowing the value to be updated and saved correctly in the form.\n This solution covers the case where the user enables auto-refresh, in which case aggregation must be set to NONE. -->\n <select\n class=\"form-control text-12\"\n [title]=\"'Aggregation' | translate\"\n id=\"aggregation\"\n formControlName=\"aggregation\"\n [attr.disabled]=\"formGroup.value.isAutoRefreshEnabled ? true : null\"\n >\n <option\n *ngFor=\"let aggregationValue of AGGREGATION_VALUES_ARR\"\n [ngValue]=\"aggregationValue\"\n [disabled]=\"disabledAggregationOptions[aggregationValue]\"\n >\n {{ AGGREGATION_LABELS[aggregationValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </ng-container>\n <!-- time interval selector -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Time interval' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Interval' | translate\"\n id=\"interval\"\n formControlName=\"interval\"\n >\n <option\n *ngFor=\"let intervalValue of INTERVAL_VALUES_ARR\"\n [ngValue]=\"intervalValue\"\n >\n {{ TIME_RANGE_INTERVAL_LABELS[intervalValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- date pickers -->\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Date range' | translate }}\n </legend>\n <c8y-date-range-picker></c8y-date-range-picker>\n </fieldset>\n </div>\n </form>\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: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i6.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "component", type: DateRangePickerComponent, selector: "c8y-date-range-picker", inputs: ["isEmittingDateChange", "showLabel"], outputs: ["updatedDate"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i7.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
|
|
355
368
|
}
|
|
356
369
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsTableWidgetConfigComponent, decorators: [{
|
|
357
370
|
type: Component,
|
|
@@ -361,8 +374,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
361
374
|
DateRangePickerComponent,
|
|
362
375
|
PopoverModule,
|
|
363
376
|
ReactiveFormsModule
|
|
364
|
-
], template: "<div class=\"p-l-24 p-r-24\">\n <form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n >\n <!-- <datapoints-selector> -->\n <div class=\"col-md-6\">\n <div class=\"row\">\n <!-- global-time-context-selector -->\n <div class=\"form-group m-b-0 p-b-16 separator-bottom\">\n <label\n class=\"d-flex a-i-center p-t-4\"\n for=\"dateSelection\"\n >\n {{ 'Date selection' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"popoverTemplate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <ng-template #popoverTemplate>\n <span translate>\n Choose how to select a date range, the available options are:\n <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n
|
|
377
|
+
], template: "<div class=\"p-l-24 p-r-24\">\n <form\n class=\"no-card-context\"\n [formGroup]=\"formGroup\"\n >\n <!-- <datapoints-selector> -->\n <div class=\"col-md-6\">\n <div class=\"row\">\n <!-- global-time-context-selector -->\n <div class=\"form-group m-b-0 p-b-16 separator-bottom\">\n <label\n class=\"d-flex a-i-center p-t-4\"\n for=\"dateSelection\"\n >\n {{ 'Date selection' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"popoverTemplate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </label>\n <ng-template #popoverTemplate>\n <span translate>\n Choose how to select a date range, the available options are:\n <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n <li>\n <b>Dashboard time range:</b>\n restricts date selection to the global dashboard configuration only\n </li>\n <li>\n <b>Widget configuration:</b>\n restricts the date selection only to the widget configuration\n </li>\n <li>\n <b>Widget and widget configuration:</b>\n restricts the date selection to the widget view and widget configuration only\n </li>\n </ul>\n </span>\n </ng-template>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Date selection' | translate\"\n [attr.aria-label]=\"'Date selection' | translate\"\n id=\"globalDateSelector\"\n formControlName=\"globalDateSelector\"\n >\n <option\n *ngFor=\"let dataSelectionValue of DATE_SELECTION_VALUES_ARR\"\n [ngValue]=\"dataSelectionValue\"\n >\n {{ DATE_SELECTION_LABELS[dataSelectionValue] | translate }}\n </option>\n </select>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-datapoint-selection-list\n class=\"bg-inherit separator-top p-t-16 d-block\"\n listTitle=\"{{ 'Data points' | translate }}\"\n name=\"datapoints\"\n [defaultFormOptions]=\"defaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"row\">\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"col-md-6\">\n <!-- interval selector -->\n <fieldset class=\"c8y-fieldset\">\n <legend class=\"d-flex a-i-center\">\n {{ 'Auto refresh' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Change the state of interval automatic refresh and set the refresh frequency.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"true\"\n ></button>\n </legend>\n <c8y-form-group class=\"m-b-16 form-group-sm\">\n <div class=\"d-flex gap-4 m-t-8 m-b-8 a-i-center\">\n <label class=\"c8y-switch\">\n <input\n id=\"refreshToggle\"\n name=\"isAutoRefreshEnabled\"\n type=\"checkbox\"\n formControlName=\"isAutoRefreshEnabled\"\n (click)=\"toggleRefreshIntervalControl()\"\n />\n <span></span>\n <span class=\"sr-only\">{{ 'Auto refresh' | translate }}</span>\n </label>\n <label\n class=\"m-b-0\"\n for=\"refreshInterval\"\n >\n {{ 'Interval' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Refresh interval in seconds' | translate\"\n id=\"refreshInterval\"\n formControlName=\"refreshInterval\"\n >\n <option\n *ngFor=\"let refreshInterval of REFRESH_INTERVAL_VALUES_ARR\"\n [ngValue]=\"refreshInterval\"\n >\n {{ '{{ seconds }} s' | translate: { seconds: refreshInterval / 1000 } }}\n </option>\n </select>\n </div>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </ng-container>\n <!-- decimal input -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Decimal places' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <input\n class=\"form-control\"\n name=\"decimalPlaces\"\n type=\"number\"\n formControlName=\"decimalPlaces\"\n step=\"1\"\n />\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- aggregation selector -->\n <div class=\"row\">\n <ng-container *ngIf=\"!isWidgetLinkedToGlobalTimeContext\">\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Aggregation' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <!-- Setting below [attr.disabled] ensures that the control is visually disabled and user interaction is prevented,\n while still allowing the value to be updated and saved correctly in the form.\n This solution covers the case where the user enables auto-refresh, in which case aggregation must be set to NONE. -->\n <select\n class=\"form-control text-12\"\n [title]=\"'Aggregation' | translate\"\n id=\"aggregation\"\n formControlName=\"aggregation\"\n [attr.disabled]=\"formGroup.value.isAutoRefreshEnabled ? true : null\"\n >\n <option\n *ngFor=\"let aggregationValue of AGGREGATION_VALUES_ARR\"\n [ngValue]=\"aggregationValue\"\n [disabled]=\"disabledAggregationOptions[aggregationValue]\"\n >\n {{ AGGREGATION_LABELS[aggregationValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </ng-container>\n <!-- time interval selector -->\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Time interval' | translate }}\n </legend>\n <c8y-form-group class=\"p-t-8\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control text-12\"\n [title]=\"'Interval' | translate\"\n id=\"interval\"\n formControlName=\"interval\"\n >\n <option\n *ngFor=\"let intervalValue of INTERVAL_VALUES_ARR\"\n [ngValue]=\"intervalValue\"\n >\n {{ TIME_RANGE_INTERVAL_LABELS[intervalValue] | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n <!-- date pickers -->\n <fieldset class=\"c8y-fieldset\">\n <legend>\n {{ 'Date range' | translate }}\n </legend>\n <c8y-date-range-picker></c8y-date-range-picker>\n </fieldset>\n </div>\n </form>\n</div>\n" }]
|
|
365
378
|
}], ctorParameters: () => [{ type: i1.AggregationService }, { type: i2.DatapointsTableService }, { type: i3.FormBuilder }, { type: i3.NgForm }, { type: i4.WidgetConfigComponent }], propDecorators: { config: [{
|
|
366
379
|
type: Input
|
|
367
380
|
}] } });
|
|
368
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUtY29uZmlnL2RhdGFwb2ludHMtdGFibGUtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBRUwsV0FBVyxFQUNYLFdBQVcsRUFDWCxNQUFNLEVBQ04sbUJBQW1CLEVBR25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUd0QixrQkFBa0IsRUFDbEIsVUFBVSxFQUNYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUdMLHVCQUF1QixFQUV4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3BGLE9BQU8sRUFBWSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFFTCxxQkFBcUIsRUFDckIs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QkFBa0IsQ0FBQywwQ0FBMEMsQ0FDNUYsWUFBWSxFQUNaLElBQUksQ0FBQywwQkFBMEIsQ0FDaEMsQ0FBQztRQUVGLElBQUksbUJBQW1CLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDekMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7K0dBcllVLG9DQUFvQzttR0FBcEMsb0NBQW9DLDBIQzFFakQsKzBSQWdPQSwyQ0Q3SkksVUFBVSwrMEVBQ1YsdUJBQXVCLHNUQUN2Qix3QkFBd0IsMElBQ3hCLGFBQWEsOFZBQ2IsbUJBQW1COzs0RkFHVixvQ0FBb0M7a0JBWmhELFNBQVM7K0JBQ0Usa0NBQWtDLGNBRWhDLElBQUksV0FDUDt3QkFDUCxVQUFVO3dCQUNWLHVCQUF1Qjt3QkFDdkIsd0JBQXdCO3dCQUN4QixhQUFhO3dCQUNiLG1CQUFtQjtxQkFDcEI7K01BTVEsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBOZ0Zvcm0sXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEFHR1JFR0FUSU9OX0xBQkVMUyxcbiAgQUdHUkVHQVRJT05fVkFMVUVTLFxuICBBR0dSRUdBVElPTl9WQUxVRVNfQVJSLFxuICBBZ2dyZWdhdGlvbk9wdGlvbixcbiAgQWdncmVnYXRpb25PcHRpb25TdGF0dXMsXG4gIEFnZ3JlZ2F0aW9uU2VydmljZSxcbiAgQ29yZU1vZHVsZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFdpZGdldENvbmZpZ0NvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHtcbiAgRGF0YXBvaW50QXR0cmlidXRlc0Zvcm1Db25maWcsXG4gIERhdGFwb2ludFNlbGVjdG9yTW9kYWxPcHRpb25zLFxuICBEYXRhcG9pbnRTZWxlY3Rvck1vZHVsZSxcbiAgS1BJRGV0YWlsc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludC1zZWxlY3Rvcic7XG5pbXBvcnQgeyBkYXRlUmFuZ2VWYWxpZGF0b3IgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yJztcbmltcG9ydCB7IEludGVydmFsLCBJTlRFUlZBTF9WQUxVRVMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ludGVydmFsLXBpY2tlcic7XG5pbXBvcnQgeyBQb3BvdmVyTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9wb3BvdmVyJztcbmltcG9ydCB7IG1lcmdlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERhdGFwb2ludHNUYWJsZUNvbmZpZyxcbiAgREFURV9TRUxFQ1RJT05fTEFCRUxTLFxuICBEQVRFX1NFTEVDVElPTl9WQUxVRVMsXG4gIERBVEVfU0VMRUNUSU9OX1ZBTFVFU19BUlIsXG4gIERhdGVSYW5nZSxcbiAgREVGQVVMVF9EUFRfUkVGUkVTSF9JTlRFUlZBTF9WQUxVRSxcbiAgSU5URVJWQUxfVkFMVUVTX0FSUixcbiAgUkVGUkVTSF9JTlRFUlZBTF9WQUxVRVNfQVJSLFxuICBUSU1FX1JBTkdFX0lOVEVSVkFMX0xBQkVMU1xufSBmcm9tICcuLi9kYXRhcG9pbnRzLXRhYmxlLXdpZGdldC5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhcG9pbnRzVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0YXBvaW50cy10YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtaW5PbmVEYXRhcG9pbnRBY3RpdmUoKTogVmFsaWRhdG9yRm4ge1xuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBjb25zdCBkYXRhcG9pbnRzOiBLUElEZXRhaWxzW10gPSBjb250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCFkYXRhcG9pbnRzIHx8ICFkYXRhcG9pbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlRGF0YXBvaW50cyA9IGRhdGFwb2ludHMuZmlsdGVyKGRhdGFwb2ludCA9PiBkYXRhcG9pbnQuX19hY3RpdmUpO1xuXG4gICAgaWYgKGFjdGl2ZURhdGFwb2ludHMubGVuZ3RoID49IDEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4geyBleGFjdGx5T25lRGF0YXBvaW50TmVlZHNUb0JlQWN0aXZlOiB0cnVlIH07XG4gIH07XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhcG9pbnRzLXRhYmxlLXZpZXctY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFwb2ludHMtdGFibGUtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvcmVNb2R1bGUsXG4gICAgRGF0YXBvaW50U2VsZWN0b3JNb2R1bGUsXG4gICAgRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50LFxuICAgIFBvcG92ZXJNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFwb2ludHNUYWJsZVdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqICBEYXRhIHBvaW50cyB0YWJsZSB3aWRnZXQgY29uZmlnLlxuICAgKi9cbiAgQElucHV0KCkgY29uZmlnOiBEYXRhcG9pbnRzVGFibGVDb25maWc7XG5cbiAgcmVhZG9ubHkgQUdHUkVHQVRJT05fTEFCRUxTID0gQUdHUkVHQVRJT05fTEFCRUxTO1xuICByZWFkb25seSBEQVRFX1NFTEVDVElPTl9MQUJFTFMgPSBEQVRFX1NFTEVDVElPTl9MQUJFTFM7XG4gIC8vIFdpbGwgYmUgdW5jb21tZW50ZWQgaW4gTVRNLTYxOTIwXG4gIC8vIHJlYWRvbmx5IERFRkFVTFRfREFURV9TRUxFQ1RPUl9WQUxVRSA9IERBVEVfU0VMRUNUSU9OX1ZBTFVFUy5kYXNoYm9hcmRfY29udGV4dDtcbiAgcmVhZG9ubHkgREVGQVVMVF9EQVRFX1NFTEVDVE9SX1ZBTFVFID0gREFURV9TRUxFQ1RJT05fVkFMVUVTLmNvbmZpZztcbiAgcmVhZG9ubHkgREVGQVVMVF9JTlRFUlZBTF9WQUxVRSA9IElOVEVSVkFMX1ZBTFVFUy5ob3VycztcbiAgcmVhZG9ubHkgVElNRV9SQU5HRV9JTlRFUlZBTF9MQUJFTFMgPSBUSU1FX1JBTkdFX0lOVEVSVkFMX0xBQkVMUztcblxuICByZWFkb25seSBBR0dSRUdBVElPTl9WQUxVRVNfQVJSID0gQUdHUkVHQVRJT05fVkFMVUVTX0FSUjtcbiAgcmVhZG9ubHkgREFURV9TRUxFQ1RJT05fVkFMVUVTX0FSUiA9IERBVEVfU0VMRUNUSU9OX1ZBTFVFU19BUlI7XG4gIHJlYWRvbmx5IElOVEVSVkFMX1ZBTFVFU19BUlIgPSBJTlRFUlZBTF9WQUxVRVNfQVJSO1xuICByZWFkb25seSBSRUZSRVNIX0lOVEVSVkFMX1ZBTFVFU19BUlIgPSBSRUZSRVNIX0lOVEVSVkFMX1ZBTFVFU19BUlI7XG5cbiAgZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnOiBQYXJ0aWFsPERhdGFwb2ludFNlbGVjdG9yTW9kYWxPcHRpb25zPiA9IHt9O1xuICBkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uczogQWdncmVnYXRpb25PcHRpb25TdGF0dXMgPSB7fTtcbiAgZGVmYXVsdEZvcm1PcHRpb25zOiBQYXJ0aWFsPERhdGFwb2ludEF0dHJpYnV0ZXNGb3JtQ29uZmlnPiA9IHtcbiAgICBzZWxlY3RhYmxlQ2hhcnRMaW5lVHlwZXM6IFtdLFxuICAgIHNlbGVjdGFibGVBeGlzVHlwZXM6IFtdLFxuICAgIHNob3dSZWRSYW5nZTogdHJ1ZSxcbiAgICBzaG93WWVsbG93UmFuZ2U6IHRydWVcbiAgfTtcbiAgZm9ybUdyb3VwOiBSZXR1cm5UeXBlPERhdGFwb2ludHNUYWJsZVdpZGdldENvbmZpZ0NvbXBvbmVudFsnY3JlYXRlRm9ybSddPjtcbiAgaXNXaWRnZXRMaW5rZWRUb0dsb2JhbFRpbWVDb250ZXh0OiBib29sZWFuO1xuXG4gIHByaXZhdGUgZGVjaW1hbExpbWl0cyA9IHtcbiAgICBudW1iZXJPZkRlY2ltYWxQbGFjZXNNaW46IDAsXG4gICAgbnVtYmVyT2ZEZWNpbWFsUGxhY2VzTWF4OiAxMFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZSB3aGVuIHRoZSB0aW1lIGludGVydmFsIHNlbGVjdG9yIGl0ZW0gaGFzIGJlZW4gY2hhbmdlZCBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gdHJhY2sgY2hhbmdlcyBpbiB0aGUgdGltZSBpbnRlcnZhbCBzZWxlY3RvclxuICAgKiB0aGF0IGFyZSBub3QgdHJpZ2dlcmVkIGJ5IGRpcmVjdCB1c2VyIGludGVyYWN0aW9uLCBidXQgYnkgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZi5cbiAgICpcbiAgICogSW4gb3VyIGNhc2UsIHRoZSBkYXRlIHNlbGVjdG9yIGFuZCB0aGUgaW50ZXJ2YWwgc2VsZWN0b3IgYXJlIGxpbmtlZC5cbiAgICogU28sIHdoZW4gb25lIG9mIHRoZW0gY2hhbmdlcywgaXQgYWZmZWN0cyB0aGUgb3RoZXIuXG4gICAqIEZvciBleGFtcGxlLCBzZWxlY3RpbmcgXCJMYXN0IGhvdXJcIiBpbiB0aGUgaW50ZXJ2YWwgc2VsZWN0b3Igc2hvdWxkIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBkYXRlIHJhbmdlIHRvIHRoZSBsYXN0IGhvdXIuXG4gICAqIEJ1dCB3aXRob3V0IHRoaXMgZmxhZywgY2hhbmdpbmcgdGhlIGRhdGUgcmFuZ2Ugd291bGQgYWxzbyB1cGRhdGUgdGhlIGludGVydmFsIHNlbGVjdG9yLCByZXN1bHRpbmcgaW4gXCJDdXN0b20gZGF0ZVwiIGJlaW5nIHNlbGVjdGVkLlxuICAgKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB0aGUgc3lzdGVtIHdvdWxkIGludGVycHJldCB0aGUgYmVoYXZpb3IgdGhpcyB3YXkuXG4gICAqL1xuICBwcml2YXRlIGlzSW50ZXJ2YWxTZWxlY3RvckNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5ID0gZmFsc2U7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWdncmVnYXRpb25TZXJ2aWNlOiBBZ2dyZWdhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhcG9pbnRzVGFibGVTZXJ2aWNlOiBEYXRhcG9pbnRzVGFibGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgZm9ybTogTmdGb3JtLFxuICAgIHByaXZhdGUgd2lkZ2V0Q29uZmlnOiBXaWRnZXRDb25maWdDb21wb25lbnRcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIENvbmRpdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gTVRNLTYxOTIwXG4gICAgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy53aWRnZXRDb25maWcuY29udGV4dD8uaWQpIHtcbiAgICAgIHRoaXMuZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnLmNvbnRleHRBc3NldCA9IHRoaXMud2lkZ2V0Q29uZmlnPy5jb250ZXh0O1xuICAgIH1cbiAgICB0aGlzLmlzV2lkZ2V0TGlua2VkVG9HbG9iYWxUaW1lQ29udGV4dCA9IHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQ7XG4gICAgdGhpcy5pbml0Rm9ybSgpO1xuXG4gICAgdGhpcy5oYW5kbGVBdXRvUmVmcmVzaFRvZ2dsZUNoYW5nZXMoKTtcbiAgICB0aGlzLmhhbmRsZUludGVydmFsU2VsZWN0b3JDaGFuZ2VzKCk7XG4gICAgdGhpcy5oYW5kbGVEYXRlU2VsZWN0b3JDaGFuZ2VzKCk7XG4gICAgdGhpcy5oYW5kbGVHbG9iYWxEYXRlU2VsZWN0b3JDaGFuZ2VzKCk7XG5cbiAgICB0aGlzLnVwZGF0ZURpc2FibGVkQWdncmVnYXRpb25PcHRpb25zKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBvbkJlZm9yZVNhdmUoY29uZmlnPzogRGF0YXBvaW50c1RhYmxlQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5mb3JtR3JvdXAudmFsdWUuYWdncmVnYXRpb24gPT09IEFHR1JFR0FUSU9OX1ZBTFVFUy5ub25lIHx8XG4gICAgICAoIXRoaXMuZm9ybUdyb3VwLnZhbHVlLmFnZ3JlZ2F0aW9uICYmIGNvbmZpZy5hZ2dyZWdhdGlvbiA9PT0gQUdHUkVHQVRJT05fVkFMVUVTLm5vbmUpXG4gICAgKSB7XG4gICAgICAvLyBUaGUgJ05PTkUnIGFnZ3JlZ2F0aW9uIHR5cGUgaXMgbm90IGhhbmRsZWQgYnkgYSBiYWNrZW5kLCBzbyBpdCBzaW1wbHkgbmVlZHMgdG8gYmUgZGVsZXRlZCB0byBnZXQgZGF0YSB3aXRob3V0IGFnZ3JlZ2F0aW9uLlxuICAgICAgZGVsZXRlIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmFnZ3JlZ2F0aW9uO1xuICAgICAgZGVsZXRlIGNvbmZpZy5hZ2dyZWdhdGlvbjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUaW1lQ29udGV4dChjb25maWcsIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmdsb2JhbERhdGVTZWxlY3Rvcik7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIHRoaXMuZm9ybUdyb3VwLnZhbHVlKTtcbiAgfVxuXG4gIHRvZ2dsZVJlZnJlc2hJbnRlcnZhbENvbnRyb2woKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuaXNBdXRvUmVmcmVzaEVuYWJsZWQudmFsdWVcbiAgICAgID8gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMucmVmcmVzaEludGVydmFsLmRpc2FibGUoKVxuICAgICAgOiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5yZWZyZXNoSW50ZXJ2YWwuZW5hYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRpbWVDb250ZXh0KGNvbmZpZzogRGF0YXBvaW50c1RhYmxlQ29uZmlnLCBzZWxlY3RlZERhdGVDb250ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHNlbGVjdGVkRGF0ZUNvbnRleHQpIHtcbiAgICAgIC8vIENvbmRpdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gTVRNLTYxOTIwXG4gICAgICAvLyBjYXNlIERBVEVfU0VMRUNUSU9OX1ZBTFVFUy5kYXNoYm9hcmRfY29udGV4dDpcbiAgICAgIC8vICAgY29uZmlnLmRpc3BsYXlEYXRlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAvLyAgIGNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIC8vICAgYnJlYWs7XG4gICAgICBjYXNlIERBVEVfU0VMRUNUSU9OX1ZBTFVFUy52aWV3X2FuZF9jb25maWc6XG4gICAgICAgIGNvbmZpZy5kaXNwbGF5RGF0ZVNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEQVRFX1NFTEVDVElPTl9WQUxVRVMuY29uZmlnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uZmlnLmRpc3BsYXlEYXRlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIGNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuY3JlYXRlRm9ybSgpO1xuICAgIC8vIFdoZW4gdGhlICdOT05FJyBhZ2dyZWdhdGlvbiBpcyByZW1vdmVkIGF0IHRoZSAnb25CZWZvcmVTYXZlJyBibG9jayxcbiAgICAvLyBhbmQgYSBHbG9iYWwgRGF0ZSBDb250ZXh0IGZvcmNlcyB3aWRnZXRzIGF1dG8gcmVmcmVzaCB0byBiZSBlbmFibGVkXG4gICAgLy8gdGhlbiwgdGhlIGFnZ3JlZ2F0aW9uIHNlbGVjdG9yIHdpbGwgYmUgZW1wdHkgb24gaW5pdGlhbCBsb2FkLlxuICAgIHRoaXMuY29uZmlnLmFnZ3JlZ2F0aW9uID0gdGhpcy5jb25maWcuYWdncmVnYXRpb24gPz8gQUdHUkVHQVRJT05fVkFMVUVTLm5vbmU7XG5cbiAgICB0aGlzLmZvcm0uZm9ybS5hZGRDb250cm9sKCdjb25maWcnLCB0aGlzLmZvcm1Hcm91cCk7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgY29uc3QgeyBkYXRlRnJvbSwgZGF0ZVRvIH0gPSB0aGlzLmRhdGFwb2ludHNUYWJsZVNlcnZpY2UuY2FsY3VsYXRlRGF0ZVJhbmdlKFxuICAgICAgdGhpcy5ERUZBVUxUX0lOVEVSVkFMX1ZBTFVFXG4gICAgKTtcbiAgICBjb25zdCBpc0xlZ2FjeVdpZGdldCA9IHRoaXMuY29uZmlnLnJlYWx0aW1lICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuY29uZmlnLmRlY2ltYWxQbGFjZXM7XG5cbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cChcbiAgICAgIHtcbiAgICAgICAgYWdncmVnYXRpb246IG5ldyBGb3JtQ29udHJvbCh7XG4gICAgICAgICAgdmFsdWU6IEFHR1JFR0FUSU9OX1ZBTFVFUy5ub25lIGFzIEFnZ3JlZ2F0aW9uT3B0aW9uLFxuICAgICAgICAgIGRpc2FibGVkOiAhdGhpcy5pc0F1dG9SZWZlcnNoRGlzYWJsZWQoKVxuICAgICAgICB9KSxcbiAgICAgICAgZGF0YXBvaW50czogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG5ldyBBcnJheTxLUElEZXRhaWxzPigpLCBbXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKSxcbiAgICAgICAgICBtaW5PbmVEYXRhcG9pbnRBY3RpdmUoKVxuICAgICAgICBdKSxcbiAgICAgICAgZ2xvYmFsRGF0ZVNlbGVjdG9yOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5ERUZBVUxUX0RBVEVfU0VMRUNUT1JfVkFMVUUpLFxuICAgICAgICBkYXRlRnJvbTogbmV3IEZvcm1Db250cm9sKGRhdGVGcm9tKSxcbiAgICAgICAgZGF0ZVRvOiBuZXcgRm9ybUNvbnRyb2woZGF0ZVRvKSxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogW1xuICAgICAgICAgIDIsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWluKHRoaXMuZGVjaW1hbExpbWl0cy5udW1iZXJPZkRlY2ltYWxQbGFjZXNNaW4pLFxuICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXgodGhpcy5kZWNpbWFsTGltaXRzLm51bWJlck9mRGVjaW1hbFBsYWNlc01heCksXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05XSskJylcbiAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIGludGVydmFsOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5ERUZBVUxUX0lOVEVSVkFMX1ZBTFVFIGFzIEludGVydmFsWydpZCddKSxcbiAgICAgICAgaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IGlzTGVnYWN5V2lkZ2V0ID8gdGhpcy5jb25maWcucmVhbHRpbWUgOiBbdHJ1ZV0sXG4gICAgICAgIHJlZnJlc2hJbnRlcnZhbDogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgICAgICB2YWx1ZTogREVGQVVMVF9EUFRfUkVGUkVTSF9JTlRFUlZBTF9WQUxVRSxcbiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0F1dG9SZWZlcnNoRGlzYWJsZWQoKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHsgdmFsaWRhdG9yczogZGF0ZVJhbmdlVmFsaWRhdG9yIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0F1dG9SZWZlcnNoRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXNJbml0aWFsV2lkZ2V0Q3JlYXRpb24gPVxuICAgICAgT2JqZWN0LmtleXModGhpcy5jb25maWcpLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmNvbmZpZ1snc2V0dGluZ3MnXTtcblxuICAgIGlmIChpc0luaXRpYWxXaWRnZXRDcmVhdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGlzTGVnYWN5V2lkZ2V0UmVhbHRpbWVOb3RBY3RpdmUgPVxuICAgICAgIXRoaXMuY29uZmlnLnJlYWx0aW1lICYmXG4gICAgICAhdGhpcy5jb25maWcuZGVjaW1hbFBsYWNlcyAmJlxuICAgICAgIXRoaXMuY29uZmlnLnJlZnJlc2hJbnRlcnZhbCAmJlxuICAgICAgIXRoaXMuY29uZmlnLmlzQXV0b1JlZnJlc2hFbmFibGVkO1xuXG4gICAgaWYgKGlzTGVnYWN5V2lkZ2V0UmVhbHRpbWVOb3RBY3RpdmUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5jb25maWcuaXNBdXRvUmVmcmVzaEVuYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFuZ2VzIHRvIHRoZSBhdXRvLXJlZnJlc2ggdG9nZ2xlIGNvbnRyb2wgYW5kIHVwZGF0ZXMgdGhlIGFnZ3JlZ2F0aW9uIGNvbnRyb2wgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHN1YnNjcmliZXMgdG8gdGhlIHZhbHVlIGNoYW5nZXMgb2YgdGhlIGF1dG8tcmVmcmVzaCB0b2dnbGUgZm9ybSBjb250cm9sLlxuICAgKiBXaGVuIGF1dG8tcmVmcmVzaCBpcyBlbmFibGVkLCB0aGUgYWdncmVnYXRpb24gY29udHJvbCdzIHZhbHVlIGlzIHNldCB0byAnbm9uZScgYW5kIHRoZSBjb250cm9sIGlzXG4gICAqIHZpc3VhbGx5IGRpc2FibGVkIChidXQgbm90IHByb2dyYW1tYXRpY2FsbHkgZGlzYWJsZWQgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzYXZlZCkuXG4gICAqIFdoZW4gYXV0by1yZWZyZXNoIGlzIGRpc2FibGVkLCB0aGUgYWdncmVnYXRpb24gY29udHJvbCBpcyBlbmFibGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVBdXRvUmVmcmVzaFRvZ2dsZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuaXNBdXRvUmVmcmVzaEVuYWJsZWQudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChpc0F1dG9SZWZyZXNoRW5hYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGlvbkNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hZ2dyZWdhdGlvbjtcbiAgICAgICAgaWYgKGlzQXV0b1JlZnJlc2hFbmFibGVkKSB7XG4gICAgICAgICAgYWdncmVnYXRpb25Db250cm9sLnNldFZhbHVlKEFHR1JFR0FUSU9OX1ZBTFVFUy5ub25lKTtcbiAgICAgICAgICAvLyBEbyBub3QgZGlzYWJsZSB0aGUgY29udHJvbCBwcm9ncmFtbWF0aWNhbGx5IHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2F2ZWQuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWdncmVnYXRpb25Db250cm9sLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNoYW5nZXMgaW4gdGhlIGludGVydmFsIHNlbGVjdG9yIGZvcm0gY29udHJvbC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlSW50ZXJ2YWxTZWxlY3RvckNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuaW50ZXJ2YWwudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChzZWxlY3RlZEludGVydmFsOiBJbnRlcnZhbFsnaWQnXSkgPT4ge1xuICAgICAgICBpZiAoc2VsZWN0ZWRJbnRlcnZhbCA9PT0gSU5URVJWQUxfVkFMVUVTLmN1c3RvbSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZU5vbkN1c3RvbUludGVydmFsKHNlbGVjdGVkSW50ZXJ2YWwpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vbkN1c3RvbUludGVydmFsKHNlbGVjdGVkSW50ZXJ2YWw6IEludGVydmFsWydpZCddKTogdm9pZCB7XG4gICAgdGhpcy5pc0ludGVydmFsU2VsZWN0b3JDaGFuZ2VkUHJvZ3JhbW1hdGljYWxseSA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVEYXRlUmFuZ2Uoc2VsZWN0ZWRJbnRlcnZhbCk7XG4gICAgdGhpcy51cGRhdGVEaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlQWdncmVnYXRpb25JZkF1dG9SZWZyZXNoRGlzYWJsZWQoc2VsZWN0ZWRJbnRlcnZhbCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURhdGVSYW5nZShzZWxlY3RlZEludGVydmFsOiBJbnRlcnZhbFsnaWQnXSk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGVSYW5nZTogRGF0ZVJhbmdlID0gdGhpcy5kYXRhcG9pbnRzVGFibGVTZXJ2aWNlLmNhbGN1bGF0ZURhdGVSYW5nZShzZWxlY3RlZEludGVydmFsKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlVG8uc2V0VmFsdWUoZGF0ZVJhbmdlLmRhdGVUbyk7XG5cbiAgICAvLyBNVE0tNjEzNTFcbiAgICAvLyBVc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIHF1ZXVlIHRoZSBkYXRlRnJvbSB1cGRhdGUuXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1pbmcgaXNzdWVzIHdoZXJlIHJhcGlkIHNldFZhbHVlIGNhbGxzIG1pZ2h0XG4gICAgLy8gY2F1c2UgdGhlIHZpZXcgdG8gZ28gb3V0IG9mIHN5bmMgd2l0aCBmb3JtIGNvbnRyb2wgdmFsdWVzLFxuICAgIC8vIGVzcGVjaWFsbHkgZHVyaW5nIHRoZSBmaXJzdCBjaGFuZ2UgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAvKipcbiAgICAgKiBXaXRob3V0IHRoaXMgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIG9yIHNldFRpbWVvdXQsIGRhdGVGcm9tIHdvbid0IGNoYW5nZSB0byBhIGNvcnJlY3QgdmFsdWUgYWZ0ZXIgZmlyc3Qgc2VsZWN0b3IgY2hhbmdlLlxuICAgICAqIFdoZW4gZm9ybSBpcyBzYXZlZCBpdCBzYXZlcyB3aXRoIGEgY29ycmVjdCB2YWx1ZSwgZXZlbiB3aXRob3V0IHdpdGggdGhpcyBmaXguXG4gICAgICogSG93IHRvIHJlcHJvZHVjZTpcbiAgICAgKiAxLiBzZXQgZGF0ZSB2YWx1ZXMgdG8gZS5nLjogMDEuMDUuMjAyNC0zMC4wNS4yMDI0IGFuZCBzYXZlIGl0XG4gICAgICogMi4gcmVvcGVuIGEgY29uZmlnIGFuZCBzd2l0Y2ggaW50ZXJ2YWwgdG8gbGFzdCBtb250aFxuICAgICAqL1xuICAgIC8vIFRoaXMgZml4IGJyYWtlcyBhIGxvZ2ljIGJlaGluZCBkaXNhYmxpbmcgbm9uIGF2YWlsYWJsZSBhZ2dyZWdhdGlvbnMuXG4gICAgLy8gRm9ybSB3aWxsIGJlIHN0aWxsIHNhdmVkIHdpdGggY29ycmVjdCBkYXRlIHZhbHVlLCBvbmx5IHZpZXcgaXMgb3V0IG9mIGEgc3luYy5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS5zZXRWYWx1ZShkYXRlUmFuZ2UuZGF0ZUZyb20pO1xuICAgIHRoaXMuaXNJbnRlcnZhbFNlbGVjdG9yQ2hhbmdlZFByb2dyYW1tYXRpY2FsbHkgPSBmYWxzZTtcbiAgICAvLyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucyA9IHRoaXMuYWdncmVnYXRpb25TZXJ2aWNlLmdldERpc2FibGVkQWdncmVnYXRpb25PcHRpb25zKFxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZUZyb20udmFsdWUsXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlVG8udmFsdWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBZ2dyZWdhdGlvbklmQXV0b1JlZnJlc2hEaXNhYmxlZChzZWxlY3RlZEludGVydmFsOiBJbnRlcnZhbFsnaWQnXSk6IHZvaWQge1xuICAgIGNvbnN0IGlzQXV0b1JlZnJlc2hEaXNhYmxlZCA9ICF0aGlzLmZvcm1Hcm91cC5jb250cm9scy5pc0F1dG9SZWZyZXNoRW5hYmxlZC52YWx1ZTtcbiAgICBpZiAoaXNBdXRvUmVmcmVzaERpc2FibGVkKSB7XG4gICAgICB0aGlzLnNldEFnZ3JlZ2F0aW9uVmFsdWUoc2VsZWN0ZWRJbnRlcnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRBZ2dyZWdhdGlvblZhbHVlKGludGVydmFsOiBJbnRlcnZhbFsnaWQnXSk6IHZvaWQge1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uO1xuXG4gICAgY29uc3QgbmV3QWdncmVnYXRpb25WYWx1ZSA9IHRoaXMuYWdncmVnYXRpb25TZXJ2aWNlLmRldGVybWluZUFnZ3JlZ2F0aW9uVmFsdWUoaW50ZXJ2YWwpO1xuICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5zZXRWYWx1ZShuZXdBZ2dyZWdhdGlvblZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNoYW5nZXMgaW4gdGhlIGRhdGUgc2VsZWN0b3IgZm9ybSBjb250cm9sLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEYXRlU2VsZWN0b3JDaGFuZ2VzKCk6IHZvaWQge1xuICAgIG1lcmdlKFxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZUZyb20udmFsdWVDaGFuZ2VzLFxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvLnZhbHVlQ2hhbmdlc1xuICAgIClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oYW5kbGVEYXRlQ2hhbmdlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEYXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW50ZXJ2YWxTZWxlY3RvckNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZXJ2YWxDb250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuaW50ZXJ2YWw7XG4gICAgaWYgKGludGVydmFsQ29udHJvbC52YWx1ZSA9PT0gSU5URVJWQUxfVkFMVUVTLmN1c3RvbSkge1xuICAgICAgdGhpcy5oYW5kbGVDdXN0b21JbnRlcnZhbERhdGVDaGFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRJbnRlcnZhbFRvQ3VzdG9tKGludGVydmFsQ29udHJvbCk7XG4gICAgfVxuICAgIHRoaXMuc2V0VG9GaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uT3B0aW9uSWZDdXJyZW50QWdncmVnYXRpb25Jc0Rpc2FibGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUN1c3RvbUludGVydmFsRGF0ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZURpc2FibGVkQWdncmVnYXRpb25PcHRpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIHNldEludGVydmFsVG9DdXN0b20oaW50ZXJ2YWxDb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcbiAgICBpbnRlcnZhbENvbnRyb2wuc2V0VmFsdWUoSU5URVJWQUxfVkFMVUVTLmN1c3RvbSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBnbG9iYWwgZGF0ZSBzZWxlY3RvciBmb3JtIGNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUdsb2JhbERhdGVTZWxlY3RvckNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZ2xvYmFsRGF0ZVNlbGVjdG9yLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIC5zdWJzY3JpYmUoKHNlbGVjdGVkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gQ29uZGl0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiBNVE0tNjE5MjBcbiAgICAgICAgLy8gaWYgKHNlbGVjdGVkID09PSBEQVRFX1NFTEVDVElPTl9WQUxVRVMuZGFzaGJvYXJkX2NvbnRleHQpIHtcbiAgICAgICAgLy8gdGhpcy5oYW5kbGVEYXNoYm9hcmRDb250ZXh0KCk7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTm9uRGFzaGJvYXJkQ29udGV4dCgpO1xuICAgICAgICAvLyB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGFzaGJvYXJkQ29udGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzV2lkZ2V0TGlua2VkVG9HbG9iYWxUaW1lQ29udGV4dCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5vbkRhc2hib2FyZENvbnRleHQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1dpZGdldExpbmtlZFRvR2xvYmFsVGltZUNvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmlzQ29uZmlnU2F2ZWRXaXRob3V0RGFzaGJvYXJkVGltZU9wdGlvbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbklmTmVjZXNzYXJ5KCk7XG4gICAgdGhpcy5zZXRJbnRlcnZhbFRvQ3VzdG9tKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmludGVydmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDb25maWdTYXZlZFdpdGhvdXREYXNoYm9hcmRUaW1lT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWdncmVnYXRpb25JZk5lY2Vzc2FyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hZ2dyZWdhdGlvbjtcbiAgICBjb25zdCBpc0Rhc2hib2FyZFRpbWVPcHRpb25TZXRBZ2dyZWdhdGlvblRvTnVsbCA9ICFhZ2dyZWdhdGlvbkNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoaXNEYXNoYm9hcmRUaW1lT3B0aW9uU2V0QWdncmVnYXRpb25Ub051bGwpIHtcbiAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5zZXRWYWx1ZShBR0dSRUdBVElPTl9WQUxVRVMubm9uZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFnZ3JlZ2F0aW9uIGNvbnRyb2wgdG8gdGhlIGZpcnN0IGF2YWlsYWJsZSAobm9uLWRpc2FibGVkKSBvcHRpb24gaWYgdGhlIGN1cnJlbnQgb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZDpcbiAgICogLSBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGFnZ3JlZ2F0aW9uIGNvbnRyb2wuXG4gICAqIC0gQ2hlY2tzIGlmIHRoZSBjdXJyZW50IGFnZ3JlZ2F0aW9uIG9wdGlvbiBpcyBkaXNhYmxlZC5cbiAgICogLSBJZiB0aGUgY3VycmVudCBvcHRpb24gaXMgZGlzYWJsZWQsIHNldHMgdGhlIGNvbnRyb2wgdG8gdGhlIGZpcnN0IGF2YWlsYWJsZSAobm9uLWRpc2FibGVkKSBvcHRpb24gYmFzZWQgb24gdGhlIGZvbGxvd2luZyBvcmRlcjpcbiAgICogICAtIElmIHRoZSBjdXJyZW50IHZhbHVlIGlzIGBEQUlMWWAsIGl0IHN3aXRjaGVzIHRvIGBIT1VSTFlgIGlmIGl0J3Mgbm90IGRpc2FibGVkLCBvdGhlcndpc2UgdG8gYE1JTlVURUxZYCBpZiBgSE9VUkxZYCBpcyBhbHNvIGRpc2FibGVkLlxuICAgKiAgIC0gSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYEhPVVJMWWAsIGl0IHN3aXRjaGVzIHRvIGBNSU5VVEVMWWAgaWYgaXQncyBub3QgZGlzYWJsZWQuXG4gICAqICAgLSBJZiBhbGwgb3B0aW9ucyBhcmUgZGlzYWJsZWQsIGl0IHNldHMgdGhlIHZhbHVlIHRvIGBOT05FYC5cbiAgICpcbiAgICogVGhlIGRpc2FibGVkIHN0YXRlIGlzIHN0b3JlZCBpbiB0aGUgYGRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zYCBvYmplY3QsXG4gICAqIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGFnZ3JlZ2F0aW9uIHZhbHVlIGFuZCB0aGUgdmFsdWUgaXMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgKlxuICAgKiBUaGUgYEFHR1JFR0FUSU9OX1ZBTFVFU2Agb2JqZWN0IGRlZmluZXMgdGhlIHBvc3NpYmxlIGFnZ3JlZ2F0aW9uIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgc2V0VG9GaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uT3B0aW9uSWZDdXJyZW50QWdncmVnYXRpb25Jc0Rpc2FibGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGFnZ3JlZ2F0aW9uQ29udHJvbC52YWx1ZTtcblxuICAgIGNvbnN0IG5ld0FnZ3JlZ2F0aW9uVmFsdWUgPSB0aGlzLmFnZ3JlZ2F0aW9uU2VydmljZS5kZXRlcm1pbmVGaXJzdE5ld0F2YWlsYWJsZUFnZ3JlZ2F0aW9uVmFsdWUoXG4gICAgICBjdXJyZW50VmFsdWUsXG4gICAgICB0aGlzLmRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zXG4gICAgKTtcblxuICAgIGlmIChuZXdBZ2dyZWdhdGlvblZhbHVlICE9PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5zZXRWYWx1ZShuZXdBZ2dyZWdhdGlvblZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwLWwtMjQgcC1yLTI0XCI+XG4gIDxmb3JtXG4gICAgY2xhc3M9XCJuby1jYXJkLWNvbnRleHRcIlxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgPlxuICAgIDwhLS0gPGRhdGFwb2ludHMtc2VsZWN0b3I+IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8IS0tIGdsb2JhbC10aW1lLWNvbnRleHQtc2VsZWN0b3IgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG0tYi0wIHAtYi0xNiBzZXBhcmF0b3ItYm90dG9tXCI+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyIHAtdC00XCJcbiAgICAgICAgICAgIGZvcj1cImRhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdEYXRlIHNlbGVjdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtwb3BvdmVyXT1cInBvcG92ZXJUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BvcG92ZXJUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgQ2hvb3NlIGhvdyB0byBzZWxlY3QgYSBkYXRlIHJhbmdlLCB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJtLWwtMCBwLWwtOCBtLXQtOCBtLWItMFwiPlxuICAgICAgICAgICAgICAgIDwhLS0gV2lsbCBiZSByZS1lbmFibGVkIGluIE1UTS02MTkyMCAtLT5cbiAgICAgICAgICAgICAgICA8IS0tIDxsaT5cbiAgICAgICAgICAgICAgICAgIDxiPkRhc2hib2FyZCB0aW1lIHJhbmdlOjwvYj5cbiAgICAgICAgICAgICAgICAgIHJlc3RyaWN0cyBkYXRlIHNlbGVjdGlvbiB0byB0aGUgZ2xvYmFsIGRhc2hib2FyZCBjb25maWd1cmF0aW9uIG9ubHlcbiAgICAgICAgICAgICAgICA8L2xpPiAtLT5cbiAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICA8Yj5XaWRnZXQgY29uZmlndXJhdGlvbjo8L2I+XG4gICAgICAgICAgICAgICAgICByZXN0cmljdHMgdGhlIGRhdGUgc2VsZWN0aW9uIG9ubHkgdG8gdGhlIHdpZGdldCBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICA8Yj5XaWRnZXQgYW5kIHdpZGdldCBjb25maWd1cmF0aW9uOjwvYj5cbiAgICAgICAgICAgICAgICAgIHJlc3RyaWN0cyB0aGUgZGF0ZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldCB2aWV3IGFuZCB3aWRnZXQgY29uZmlndXJhdGlvbiBvbmx5XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC0xMlwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInRGF0ZSBzZWxlY3Rpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGF0ZSBzZWxlY3Rpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgaWQ9XCJnbG9iYWxEYXRlU2VsZWN0b3JcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJnbG9iYWxEYXRlU2VsZWN0b3JcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRhdGFTZWxlY3Rpb25WYWx1ZSBvZiBEQVRFX1NFTEVDVElPTl9WQUxVRVNfQVJSXCJcbiAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJkYXRhU2VsZWN0aW9uVmFsdWVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgREFURV9TRUxFQ1RJT05fTEFCRUxTW2RhdGFTZWxlY3Rpb25WYWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgPGM4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWluaGVyaXQgc2VwYXJhdG9yLXRvcCBwLXQtMTYgZC1ibG9ja1wiXG4gICAgICAgICAgbGlzdFRpdGxlPVwie3sgJ0RhdGEgcG9pbnRzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgbmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICAgIFtkZWZhdWx0Rm9ybU9wdGlvbnNdPVwiZGVmYXVsdEZvcm1PcHRpb25zXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZ1wiXG4gICAgICAgICAgW21pbkFjdGl2ZUNvdW50XT1cIjFcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICA+PC9jOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNXaWRnZXRMaW5rZWRUb0dsb2JhbFRpbWVDb250ZXh0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICA8IS0tIGludGVydmFsIHNlbGVjdG9yIC0tPlxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0XCI+XG4gICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIHt7ICdBdXRvIHJlZnJlc2gnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgICdDaGFuZ2UgdGhlIHN0YXRlIG9mIGludGVydmFsIGF1dG9tYXRpYyByZWZyZXNoIGFuZCBzZXQgdGhlIHJlZnJlc2ggZnJlcXVlbmN5LidcbiAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItMTYgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTQgbS10LTggbS1iLTggYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXN3aXRjaFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBpZD1cInJlZnJlc2hUb2dnbGVcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpc0F1dG9SZWZyZXNoRW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpc0F1dG9SZWZyZXNoRW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJlZnJlc2hJbnRlcnZhbENvbnRyb2woKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+e3sgJ0F1dG8gcmVmcmVzaCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibS1iLTBcIlxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyAnSW50ZXJ2YWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC0xMlwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidSZWZyZXNoIGludGVydmFsIGluIHNlY29uZHMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBpZD1cInJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByZWZyZXNoSW50ZXJ2YWwgb2YgUkVGUkVTSF9JTlRFUlZBTF9WQUxVRVNfQVJSXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cInJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3t7IHNlY29uZHMgfX0gcycgfCB0cmFuc2xhdGU6IHsgc2Vjb25kczogcmVmcmVzaEludGVydmFsIC8gMTAwMCB9IH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBkZWNpbWFsIGlucHV0IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXRcIj5cbiAgICAgICAgICAgIDxsZWdlbmQ+XG4gICAgICAgICAgICAgIHt7ICdEZWNpbWFsIHBsYWNlcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwicC10LThcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJkZWNpbWFsUGxhY2VzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWNpbWFsUGxhY2VzXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIGFnZ3JlZ2F0aW9uIHNlbGVjdG9yIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1dpZGdldExpbmtlZFRvR2xvYmFsVGltZUNvbnRleHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0XCI+XG4gICAgICAgICAgICAgIDxsZWdlbmQ+XG4gICAgICAgICAgICAgICAge3sgJ0FnZ3JlZ2F0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwicC10LThcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmcgYmVsb3cgW2F0dHIuZGlzYWJsZWRdIGVuc3VyZXMgdGhhdCB0aGUgY29udHJvbCBpcyB2aXN1YWxseSBkaXNhYmxlZCBhbmQgdXNlciBpbnRlcmFjdGlvbiBpcyBwcmV2ZW50ZWQsXG4gICAgICAgICAgICAgICB3aGlsZSBzdGlsbCBhbGxvd2luZyB0aGUgdmFsdWUgdG8gYmUgdXBkYXRlZCBhbmQgc2F2ZWQgY29ycmVjdGx5IGluIHRoZSBmb3JtLlxuICAgICAgICAgICAgICAgVGhpcyBzb2x1dGlvbiBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgZW5hYmxlcyBhdXRvLXJlZnJlc2gsIGluIHdoaWNoIGNhc2UgYWdncmVnYXRpb24gbXVzdCBiZSBzZXQgdG8gTk9ORS4gLS0+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtMTJcIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FnZ3JlZ2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiYWdncmVnYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZ2dyZWdhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cImZvcm1Hcm91cC52YWx1ZS5pc0F1dG9SZWZyZXNoRW5hYmxlZCA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhZ2dyZWdhdGlvblZhbHVlIG9mIEFHR1JFR0FUSU9OX1ZBTFVFU19BUlJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImFnZ3JlZ2F0aW9uVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc1thZ2dyZWdhdGlvblZhbHVlXVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBBR0dSRUdBVElPTl9MQUJFTFNbYWdncmVnYXRpb25WYWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSB0aW1lIGludGVydmFsIHNlbGVjdG9yIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0XCI+XG4gICAgICAgICAgICAgIDxsZWdlbmQ+XG4gICAgICAgICAgICAgICAge3sgJ1RpbWUgaW50ZXJ2YWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLXQtOFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC0xMlwiXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInSW50ZXJ2YWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImludGVydmFsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpbnRlcnZhbFZhbHVlIG9mIElOVEVSVkFMX1ZBTFVFU19BUlJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImludGVydmFsVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgVElNRV9SQU5HRV9JTlRFUlZBTF9MQUJFTFNbaW50ZXJ2YWxWYWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIGRhdGUgcGlja2VycyAtLT5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0XCI+XG4gICAgICAgICAgPGxlZ2VuZD5cbiAgICAgICAgICAgIHt7ICdEYXRlIHJhbmdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgIDxjOHktZGF0ZS1yYW5nZS1waWNrZXI+PC9jOHktZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9kaXY+XG4iXX0=
|
|
381
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUtY29uZmlnL2RhdGFwb2ludHMtdGFibGUtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBRUwsV0FBVyxFQUNYLFdBQVcsRUFDWCxNQUFNLEVBQ04sbUJBQW1CLEVBR25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUd0QixrQkFBa0IsRUFDbEIsVUFBVSxFQUNYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUdMLHVCQUF1QixFQUV4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3BGLE9BQU8sRUFBWSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFFTCxxQkFBcUIsRUFDckIs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Q1AsVUFBVTt3QkFDVix1QkFBdUI7d0JBQ3ZCLHdCQUF3Qjt3QkFDeEIsYUFBYTt3QkFDYixtQkFBbUI7cUJBQ3BCOytNQU1RLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtQ29udHJvbCxcbiAgTmdGb3JtLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBBR0dSRUdBVElPTl9MQUJFTFMsXG4gIEFHR1JFR0FUSU9OX1ZBTFVFUyxcbiAgQUdHUkVHQVRJT05fVkFMVUVTX0FSUixcbiAgQWdncmVnYXRpb25PcHRpb24sXG4gIEFnZ3JlZ2F0aW9uT3B0aW9uU3RhdHVzLFxuICBBZ2dyZWdhdGlvblNlcnZpY2UsXG4gIENvcmVNb2R1bGVcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBXaWRnZXRDb25maWdDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2NvbnRleHQtZGFzaGJvYXJkJztcbmltcG9ydCB7XG4gIERhdGFwb2ludEF0dHJpYnV0ZXNGb3JtQ29uZmlnLFxuICBEYXRhcG9pbnRTZWxlY3Rvck1vZGFsT3B0aW9ucyxcbiAgRGF0YXBvaW50U2VsZWN0b3JNb2R1bGUsXG4gIEtQSURldGFpbHNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgZGF0ZVJhbmdlVmFsaWRhdG9yIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvcic7XG5pbXBvcnQgeyBJbnRlcnZhbCwgSU5URVJWQUxfVkFMVUVTIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9pbnRlcnZhbC1waWNrZXInO1xuaW1wb3J0IHsgUG9wb3Zlck1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvcG9wb3Zlcic7XG5pbXBvcnQgeyBtZXJnZSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBEYXRhcG9pbnRzVGFibGVDb25maWcsXG4gIERBVEVfU0VMRUNUSU9OX0xBQkVMUyxcbiAgREFURV9TRUxFQ1RJT05fVkFMVUVTLFxuICBEQVRFX1NFTEVDVElPTl9WQUxVRVNfQVJSLFxuICBEYXRlUmFuZ2UsXG4gIERFRkFVTFRfRFBUX1JFRlJFU0hfSU5URVJWQUxfVkFMVUUsXG4gIElOVEVSVkFMX1ZBTFVFU19BUlIsXG4gIFJFRlJFU0hfSU5URVJWQUxfVkFMVUVTX0FSUixcbiAgVElNRV9SQU5HRV9JTlRFUlZBTF9MQUJFTFNcbn0gZnJvbSAnLi4vZGF0YXBvaW50cy10YWJsZS13aWRnZXQubW9kZWwnO1xuaW1wb3J0IHsgRGF0YXBvaW50c1RhYmxlU2VydmljZSB9IGZyb20gJy4uL2RhdGFwb2ludHMtdGFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWluT25lRGF0YXBvaW50QWN0aXZlKCk6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgZGF0YXBvaW50czogS1BJRGV0YWlsc1tdID0gY29udHJvbC52YWx1ZTtcblxuICAgIGlmICghZGF0YXBvaW50cyB8fCAhZGF0YXBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZURhdGFwb2ludHMgPSBkYXRhcG9pbnRzLmZpbHRlcihkYXRhcG9pbnQgPT4gZGF0YXBvaW50Ll9fYWN0aXZlKTtcblxuICAgIGlmIChhY3RpdmVEYXRhcG9pbnRzLmxlbmd0aCA+PSAxKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgZXhhY3RseU9uZURhdGFwb2ludE5lZWRzVG9CZUFjdGl2ZTogdHJ1ZSB9O1xuICB9O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50cy10YWJsZS12aWV3LWNvbmZpZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb3JlTW9kdWxlLFxuICAgIERhdGFwb2ludFNlbGVjdG9yTW9kdWxlLFxuICAgIERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCxcbiAgICBQb3BvdmVyTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzVGFibGVXaWRnZXRDb25maWdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiAgRGF0YSBwb2ludHMgdGFibGUgd2lkZ2V0IGNvbmZpZy5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZzogRGF0YXBvaW50c1RhYmxlQ29uZmlnO1xuXG4gIHJlYWRvbmx5IEFHR1JFR0FUSU9OX0xBQkVMUyA9IEFHR1JFR0FUSU9OX0xBQkVMUztcbiAgcmVhZG9ubHkgREFURV9TRUxFQ1RJT05fTEFCRUxTID0gREFURV9TRUxFQ1RJT05fTEFCRUxTO1xuICByZWFkb25seSBERUZBVUxUX0RBVEVfU0VMRUNUT1JfVkFMVUUgPSBEQVRFX1NFTEVDVElPTl9WQUxVRVMuZGFzaGJvYXJkX2NvbnRleHQ7XG4gIHJlYWRvbmx5IERFRkFVTFRfSU5URVJWQUxfVkFMVUUgPSBJTlRFUlZBTF9WQUxVRVMuaG91cnM7XG4gIHJlYWRvbmx5IFRJTUVfUkFOR0VfSU5URVJWQUxfTEFCRUxTID0gVElNRV9SQU5HRV9JTlRFUlZBTF9MQUJFTFM7XG5cbiAgcmVhZG9ubHkgQUdHUkVHQVRJT05fVkFMVUVTX0FSUiA9IEFHR1JFR0FUSU9OX1ZBTFVFU19BUlI7XG4gIHJlYWRvbmx5IERBVEVfU0VMRUNUSU9OX1ZBTFVFU19BUlIgPSBEQVRFX1NFTEVDVElPTl9WQUxVRVNfQVJSO1xuICByZWFkb25seSBJTlRFUlZBTF9WQUxVRVNfQVJSID0gSU5URVJWQUxfVkFMVUVTX0FSUjtcbiAgcmVhZG9ubHkgUkVGUkVTSF9JTlRFUlZBTF9WQUxVRVNfQVJSID0gUkVGUkVTSF9JTlRFUlZBTF9WQUxVRVNfQVJSO1xuXG4gIGRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZzogUGFydGlhbDxEYXRhcG9pbnRTZWxlY3Rvck1vZGFsT3B0aW9ucz4gPSB7fTtcbiAgZGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnM6IEFnZ3JlZ2F0aW9uT3B0aW9uU3RhdHVzID0ge307XG4gIGRlZmF1bHRGb3JtT3B0aW9uczogUGFydGlhbDxEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZz4gPSB7XG4gICAgc2VsZWN0YWJsZUNoYXJ0TGluZVR5cGVzOiBbXSxcbiAgICBzZWxlY3RhYmxlQXhpc1R5cGVzOiBbXSxcbiAgICBzaG93UmVkUmFuZ2U6IHRydWUsXG4gICAgc2hvd1llbGxvd1JhbmdlOiB0cnVlXG4gIH07XG4gIGZvcm1Hcm91cDogUmV0dXJuVHlwZTxEYXRhcG9pbnRzVGFibGVXaWRnZXRDb25maWdDb21wb25lbnRbJ2NyZWF0ZUZvcm0nXT47XG4gIGlzV2lkZ2V0TGlua2VkVG9HbG9iYWxUaW1lQ29udGV4dDogYm9vbGVhbjtcblxuICBwcml2YXRlIGRlY2ltYWxMaW1pdHMgPSB7XG4gICAgbnVtYmVyT2ZEZWNpbWFsUGxhY2VzTWluOiAwLFxuICAgIG51bWJlck9mRGVjaW1hbFBsYWNlc01heDogMTBcbiAgfSBhcyBjb25zdDtcblxuICAvKipcbiAgICogSW5kaWNhdGUgd2hlbiB0aGUgdGltZSBpbnRlcnZhbCBzZWxlY3RvciBpdGVtIGhhcyBiZWVuIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseS5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIHRyYWNrIGNoYW5nZXMgaW4gdGhlIHRpbWUgaW50ZXJ2YWwgc2VsZWN0b3JcbiAgICogdGhhdCBhcmUgbm90IHRyaWdnZXJlZCBieSBkaXJlY3QgdXNlciBpbnRlcmFjdGlvbiwgYnV0IGJ5IHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYuXG4gICAqXG4gICAqIEluIG91ciBjYXNlLCB0aGUgZGF0ZSBzZWxlY3RvciBhbmQgdGhlIGludGVydmFsIHNlbGVjdG9yIGFyZSBsaW5rZWQuXG4gICAqIFNvLCB3aGVuIG9uZSBvZiB0aGVtIGNoYW5nZXMsIGl0IGFmZmVjdHMgdGhlIG90aGVyLlxuICAgKiBGb3IgZXhhbXBsZSwgc2VsZWN0aW5nIFwiTGFzdCBob3VyXCIgaW4gdGhlIGludGVydmFsIHNlbGVjdG9yIHNob3VsZCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgZGF0ZSByYW5nZSB0byB0aGUgbGFzdCBob3VyLlxuICAgKiBCdXQgd2l0aG91dCB0aGlzIGZsYWcsIGNoYW5naW5nIHRoZSBkYXRlIHJhbmdlIHdvdWxkIGFsc28gdXBkYXRlIHRoZSBpbnRlcnZhbCBzZWxlY3RvciwgcmVzdWx0aW5nIGluIFwiQ3VzdG9tIGRhdGVcIiBiZWluZyBzZWxlY3RlZC5cbiAgICogVGhpcyBoYXBwZW5zIGJlY2F1c2UgdGhlIHN5c3RlbSB3b3VsZCBpbnRlcnByZXQgdGhlIGJlaGF2aW9yIHRoaXMgd2F5LlxuICAgKi9cbiAgcHJpdmF0ZSBpc0ludGVydmFsU2VsZWN0b3JDaGFuZ2VkUHJvZ3JhbW1hdGljYWxseSA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFnZ3JlZ2F0aW9uU2VydmljZTogQWdncmVnYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YXBvaW50c1RhYmxlU2VydmljZTogRGF0YXBvaW50c1RhYmxlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGZvcm06IE5nRm9ybSxcbiAgICBwcml2YXRlIHdpZGdldENvbmZpZzogV2lkZ2V0Q29uZmlnQ29tcG9uZW50XG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53aWRnZXRDb25maWcuY29udGV4dD8uaWQpIHtcbiAgICAgIHRoaXMuZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnLmNvbnRleHRBc3NldCA9IHRoaXMud2lkZ2V0Q29uZmlnPy5jb250ZXh0O1xuICAgIH1cblxuICAgIHRoaXMuaXNXaWRnZXRMaW5rZWRUb0dsb2JhbFRpbWVDb250ZXh0ID1cbiAgICAgIHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0ID8/IHRydWU7XG5cbiAgICB0aGlzLmluaXRGb3JtKCk7XG5cbiAgICB0aGlzLmhhbmRsZUF1dG9SZWZyZXNoVG9nZ2xlQ2hhbmdlcygpO1xuICAgIHRoaXMuaGFuZGxlSW50ZXJ2YWxTZWxlY3RvckNoYW5nZXMoKTtcbiAgICB0aGlzLmhhbmRsZURhdGVTZWxlY3RvckNoYW5nZXMoKTtcbiAgICB0aGlzLmhhbmRsZUdsb2JhbERhdGVTZWxlY3RvckNoYW5nZXMoKTtcblxuICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG9uQmVmb3JlU2F2ZShjb25maWc/OiBEYXRhcG9pbnRzVGFibGVDb25maWcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZS5hZ2dyZWdhdGlvbiA9PT0gQUdHUkVHQVRJT05fVkFMVUVTLm5vbmUgfHxcbiAgICAgICghdGhpcy5mb3JtR3JvdXAudmFsdWUuYWdncmVnYXRpb24gJiYgY29uZmlnLmFnZ3JlZ2F0aW9uID09PSBBR0dSRUdBVElPTl9WQUxVRVMubm9uZSlcbiAgICApIHtcbiAgICAgIC8vIFRoZSAnTk9ORScgYWdncmVnYXRpb24gdHlwZSBpcyBub3QgaGFuZGxlZCBieSBhIGJhY2tlbmQsIHNvIGl0IHNpbXBseSBuZWVkcyB0byBiZSBkZWxldGVkIHRvIGdldCBkYXRhIHdpdGhvdXQgYWdncmVnYXRpb24uXG4gICAgICB0aGlzLmRlbGV0ZUFnZ3JlZ2F0aW9uUHJvcGVydHkoY29uZmlnKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUaW1lQ29udGV4dChjb25maWcsIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmdsb2JhbERhdGVTZWxlY3Rvcik7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIHRoaXMuZm9ybUdyb3VwLnZhbHVlKTtcbiAgfVxuXG4gIHRvZ2dsZVJlZnJlc2hJbnRlcnZhbENvbnRyb2woKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuaXNBdXRvUmVmcmVzaEVuYWJsZWQudmFsdWVcbiAgICAgID8gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMucmVmcmVzaEludGVydmFsLmRpc2FibGUoKVxuICAgICAgOiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5yZWZyZXNoSW50ZXJ2YWwuZW5hYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRpbWVDb250ZXh0KGNvbmZpZzogRGF0YXBvaW50c1RhYmxlQ29uZmlnLCBzZWxlY3RlZERhdGVDb250ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHNlbGVjdGVkRGF0ZUNvbnRleHQpIHtcbiAgICAgIGNhc2UgREFURV9TRUxFQ1RJT05fVkFMVUVTLmRhc2hib2FyZF9jb250ZXh0OlxuICAgICAgICBjb25maWcuZGlzcGxheURhdGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5hZ2dyZWdhdGlvbiAhPT0gJ05PTkUnKSB7XG4gICAgICAgICAgdGhpcy5kZWxldGVBZ2dyZWdhdGlvblByb3BlcnR5KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERBVEVfU0VMRUNUSU9OX1ZBTFVFUy52aWV3X2FuZF9jb25maWc6XG4gICAgICAgIGNvbmZpZy5kaXNwbGF5RGF0ZVNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbEF1dG9SZWZyZXNoQ29udGV4dCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgREFURV9TRUxFQ1RJT05fVkFMVUVTLmNvbmZpZzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbmZpZy5kaXNwbGF5RGF0ZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICBjb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxBdXRvUmVmcmVzaENvbnRleHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5jcmVhdGVGb3JtKCk7XG4gICAgLy8gV2hlbiB0aGUgJ05PTkUnIGFnZ3JlZ2F0aW9uIGlzIHJlbW92ZWQgYXQgdGhlICdvbkJlZm9yZVNhdmUnIGJsb2NrLFxuICAgIC8vIGFuZCBhIEdsb2JhbCBEYXRlIENvbnRleHQgZm9yY2VzIHdpZGdldHMgYXV0byByZWZyZXNoIHRvIGJlIGVuYWJsZWRcbiAgICAvLyB0aGVuLCB0aGUgYWdncmVnYXRpb24gc2VsZWN0b3Igd2lsbCBiZSBlbXB0eSBvbiBpbml0aWFsIGxvYWQuXG4gICAgdGhpcy5jb25maWcuYWdncmVnYXRpb24gPSB0aGlzLmNvbmZpZy5hZ2dyZWdhdGlvbiA/PyBBR0dSRUdBVElPTl9WQUxVRVMubm9uZTtcblxuICAgIHRoaXMuZm9ybS5mb3JtLmFkZENvbnRyb2woJ2NvbmZpZycsIHRoaXMuZm9ybUdyb3VwKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpIHtcbiAgICBjb25zdCB7IGRhdGVGcm9tLCBkYXRlVG8gfSA9IHRoaXMuZGF0YXBvaW50c1RhYmxlU2VydmljZS5jYWxjdWxhdGVEYXRlUmFuZ2UoXG4gICAgICB0aGlzLkRFRkFVTFRfSU5URVJWQUxfVkFMVUVcbiAgICApO1xuICAgIGNvbnN0IGlzTGVnYWN5V2lkZ2V0ID1cbiAgICAgIHRoaXMuY29uZmlnLmhhc093blByb3BlcnR5KCd3aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0JykgJiZcbiAgICAgICF0aGlzLmNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnZGVjaW1hbFBsYWNlcycpO1xuXG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoXG4gICAgICB7XG4gICAgICAgIGFnZ3JlZ2F0aW9uOiBuZXcgRm9ybUNvbnRyb2woe1xuICAgICAgICAgIHZhbHVlOiBBR0dSRUdBVElPTl9WQUxVRVMubm9uZSBhcyBBZ2dyZWdhdGlvbk9wdGlvbixcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuaXNBdXRvUmVmZXJzaERpc2FibGVkKClcbiAgICAgICAgfSksXG4gICAgICAgIGRhdGFwb2ludHM6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChuZXcgQXJyYXk8S1BJRGV0YWlscz4oKSwgW1xuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgVmFsaWRhdG9ycy5taW5MZW5ndGgoMSksXG4gICAgICAgICAgbWluT25lRGF0YXBvaW50QWN0aXZlKClcbiAgICAgICAgXSksXG4gICAgICAgIGdsb2JhbERhdGVTZWxlY3RvcjogbmV3IEZvcm1Db250cm9sKFxuICAgICAgICAgIGlzTGVnYWN5V2lkZ2V0XG4gICAgICAgICAgICA/IHRoaXMuZGV0ZXJtaW5lR2xvYmFsRGF0ZVNlbGVjdG9yVmFsdWVGb3JMZWdhY3lXaWRnZXQoKVxuICAgICAgICAgICAgOiB0aGlzLkRFRkFVTFRfREFURV9TRUxFQ1RPUl9WQUxVRVxuICAgICAgICApLFxuICAgICAgICBkYXRlRnJvbTogbmV3IEZvcm1Db250cm9sKGRhdGVGcm9tKSxcbiAgICAgICAgZGF0ZVRvOiBuZXcgRm9ybUNvbnRyb2woZGF0ZVRvKSxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogW1xuICAgICAgICAgIDIsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWluKHRoaXMuZGVjaW1hbExpbWl0cy5udW1iZXJPZkRlY2ltYWxQbGFjZXNNaW4pLFxuICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXgodGhpcy5kZWNpbWFsTGltaXRzLm51bWJlck9mRGVjaW1hbFBsYWNlc01heCksXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05XSskJylcbiAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIGludGVydmFsOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5ERUZBVUxUX0lOVEVSVkFMX1ZBTFVFIGFzIEludGVydmFsWydpZCddKSxcbiAgICAgICAgaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IGlzTGVnYWN5V2lkZ2V0ID8gdGhpcy5jb25maWcucmVhbHRpbWUgOiBbdHJ1ZV0sXG4gICAgICAgIHJlZnJlc2hJbnRlcnZhbDogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgICAgICB2YWx1ZTogREVGQVVMVF9EUFRfUkVGUkVTSF9JTlRFUlZBTF9WQUxVRSxcbiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0F1dG9SZWZlcnNoRGlzYWJsZWQoKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHsgdmFsaWRhdG9yczogZGF0ZVJhbmdlVmFsaWRhdG9yIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVHbG9iYWxEYXRlU2VsZWN0b3JWYWx1ZUZvckxlZ2FjeVdpZGdldCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgZGlzcGxheURhdGVTZWxlY3Rpb24sIHdpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0IH0gPSB0aGlzLmNvbmZpZztcblxuICAgIC8vIFN0YXRlIG9mIHdpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQgd2FzIGNvbnZlcnRlZCB0byB3aWRnZXRJbnN0YW5jZUdsb2JhbEF1dG9SZWZyZXNoQ29udGV4dC5cbiAgICAvLyBUaGF0IGlzIHdoeSBpdCB1c2UgaGVyZSBpbiBhIGxlZ2FjeSB3aWRnZXQgY29udGV4dC5cbiAgICBpZiAod2lkZ2V0SW5zdGFuY2VHbG9iYWxBdXRvUmVmcmVzaENvbnRleHQpIHtcbiAgICAgIHJldHVybiBEQVRFX1NFTEVDVElPTl9WQUxVRVMuZGFzaGJvYXJkX2NvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc3BsYXlEYXRlU2VsZWN0aW9uXG4gICAgICA/IERBVEVfU0VMRUNUSU9OX1ZBTFVFUy52aWV3X2FuZF9jb25maWdcbiAgICAgIDogREFURV9TRUxFQ1RJT05fVkFMVUVTLmNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgaXNBdXRvUmVmZXJzaERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzSW5pdGlhbFdpZGdldENyZWF0aW9uID1cbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnKS5sZW5ndGggPT09IDEgJiYgdGhpcy5jb25maWdbJ3NldHRpbmdzJ107XG5cbiAgICBpZiAoaXNJbml0aWFsV2lkZ2V0Q3JlYXRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0xlZ2FjeVdpZGdldFJlYWx0aW1lTm90QWN0aXZlID1cbiAgICAgICF0aGlzLmNvbmZpZy5yZWFsdGltZSAmJlxuICAgICAgIXRoaXMuY29uZmlnLmhhc093blByb3BlcnR5KCdkZWNpbWFsUGxhY2VzJykgJiZcbiAgICAgICF0aGlzLmNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncmVmcmVzaEludGVydmFsJykgJiZcbiAgICAgICF0aGlzLmNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnaXNBdXRvUmVmcmVzaEVuYWJsZWQnKTtcblxuICAgIGlmIChpc0xlZ2FjeVdpZGdldFJlYWx0aW1lTm90QWN0aXZlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXMuY29uZmlnLmlzQXV0b1JlZnJlc2hFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2hhbmdlcyB0byB0aGUgYXV0by1yZWZyZXNoIHRvZ2dsZSBjb250cm9sIGFuZCB1cGRhdGVzIHRoZSBhZ2dyZWdhdGlvbiBjb250cm9sIGFjY29yZGluZ2x5LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzdWJzY3JpYmVzIHRvIHRoZSB2YWx1ZSBjaGFuZ2VzIG9mIHRoZSBhdXRvLXJlZnJlc2ggdG9nZ2xlIGZvcm0gY29udHJvbC5cbiAgICogV2hlbiBhdXRvLXJlZnJlc2ggaXMgZW5hYmxlZCwgdGhlIGFnZ3JlZ2F0aW9uIGNvbnRyb2wncyB2YWx1ZSBpcyBzZXQgdG8gJ25vbmUnIGFuZCB0aGUgY29udHJvbCBpc1xuICAgKiB2aXN1YWxseSBkaXNhYmxlZCAoYnV0IG5vdCBwcm9ncmFtbWF0aWNhbGx5IGRpc2FibGVkIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2F2ZWQpLlxuICAgKiBXaGVuIGF1dG8tcmVmcmVzaCBpcyBkaXNhYmxlZCwgdGhlIGFnZ3JlZ2F0aW9uIGNvbnRyb2wgaXMgZW5hYmxlZC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQXV0b1JlZnJlc2hUb2dnbGVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmlzQXV0b1JlZnJlc2hFbmFibGVkLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWdncmVnYXRpb247XG4gICAgICAgIGlmIChpc0F1dG9SZWZyZXNoRW5hYmxlZCkge1xuICAgICAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5zZXRWYWx1ZShBR0dSRUdBVElPTl9WQUxVRVMubm9uZSk7XG4gICAgICAgICAgLy8gRG8gbm90IGRpc2FibGUgdGhlIGNvbnRyb2wgcHJvZ3JhbW1hdGljYWxseSB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNhdmVkLlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBpbnRlcnZhbCBzZWxlY3RvciBmb3JtIGNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUludGVydmFsU2VsZWN0b3JDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmludGVydmFsLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoc2VsZWN0ZWRJbnRlcnZhbDogSW50ZXJ2YWxbJ2lkJ10pID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkSW50ZXJ2YWwgPT09IElOVEVSVkFMX1ZBTFVFUy5jdXN0b20pIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZURpc2FibGVkQWdncmVnYXRpb25PcHRpb25zKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVOb25DdXN0b21JbnRlcnZhbChzZWxlY3RlZEludGVydmFsKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb25DdXN0b21JbnRlcnZhbChzZWxlY3RlZEludGVydmFsOiBJbnRlcnZhbFsnaWQnXSk6IHZvaWQge1xuICAgIHRoaXMuaXNJbnRlcnZhbFNlbGVjdG9yQ2hhbmdlZFByb2dyYW1tYXRpY2FsbHkgPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKHNlbGVjdGVkSW50ZXJ2YWwpO1xuICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMoKTtcbiAgICB0aGlzLnVwZGF0ZUFnZ3JlZ2F0aW9uSWZBdXRvUmVmcmVzaERpc2FibGVkKHNlbGVjdGVkSW50ZXJ2YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEYXRlUmFuZ2Uoc2VsZWN0ZWRJbnRlcnZhbDogSW50ZXJ2YWxbJ2lkJ10pOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlUmFuZ2U6IERhdGVSYW5nZSA9IHRoaXMuZGF0YXBvaW50c1RhYmxlU2VydmljZS5jYWxjdWxhdGVEYXRlUmFuZ2Uoc2VsZWN0ZWRJbnRlcnZhbCk7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvLnNldFZhbHVlKGRhdGVSYW5nZS5kYXRlVG8pO1xuXG4gICAgLy8gTVRNLTYxMzUxXG4gICAgLy8gVXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0byBxdWV1ZSB0aGUgZGF0ZUZyb20gdXBkYXRlLlxuICAgIC8vIFRoaXMgcHJldmVudHMgdGltaW5nIGlzc3VlcyB3aGVyZSByYXBpZCBzZXRWYWx1ZSBjYWxscyBtaWdodFxuICAgIC8vIGNhdXNlIHRoZSB2aWV3IHRvIGdvIG91dCBvZiBzeW5jIHdpdGggZm9ybSBjb250cm9sIHZhbHVlcyxcbiAgICAvLyBlc3BlY2lhbGx5IGR1cmluZyB0aGUgZmlyc3QgY2hhbmdlIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgLyoqXG4gICAgICogV2l0aG91dCB0aGlzIHJlcXVlc3RBbmltYXRpb25GcmFtZSBvciBzZXRUaW1lb3V0LCBkYXRlRnJvbSB3b24ndCBjaGFuZ2UgdG8gYSBjb3JyZWN0IHZhbHVlIGFmdGVyIGZpcnN0IHNlbGVjdG9yIGNoYW5nZS5cbiAgICAgKiBXaGVuIGZvcm0gaXMgc2F2ZWQgaXQgc2F2ZXMgd2l0aCBhIGNvcnJlY3QgdmFsdWUsIGV2ZW4gd2l0aG91dCB3aXRoIHRoaXMgZml4LlxuICAgICAqIEhvdyB0byByZXByb2R1Y2U6XG4gICAgICogMS4gc2V0IGRhdGUgdmFsdWVzIHRvIGUuZy46IDAxLjA1LjIwMjQtMzAuMDUuMjAyNCBhbmQgc2F2ZSBpdFxuICAgICAqIDIuIHJlb3BlbiBhIGNvbmZpZyBhbmQgc3dpdGNoIGludGVydmFsIHRvIGxhc3QgbW9udGhcbiAgICAgKi9cbiAgICAvLyBUaGlzIGZpeCBicmFrZXMgYSBsb2dpYyBiZWhpbmQgZGlzYWJsaW5nIG5vbiBhdmFpbGFibGUgYWdncmVnYXRpb25zLlxuICAgIC8vIEZvcm0gd2lsbCBiZSBzdGlsbCBzYXZlZCB3aXRoIGNvcnJlY3QgZGF0ZSB2YWx1ZSwgb25seSB2aWV3IGlzIG91dCBvZiBhIHN5bmMuXG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZUZyb20uc2V0VmFsdWUoZGF0ZVJhbmdlLmRhdGVGcm9tKTtcbiAgICB0aGlzLmlzSW50ZXJ2YWxTZWxlY3RvckNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5ID0gZmFsc2U7XG4gICAgLy8gfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURpc2FibGVkQWdncmVnYXRpb25PcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnMgPSB0aGlzLmFnZ3JlZ2F0aW9uU2VydmljZS5nZXREaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucyhcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVGcm9tLnZhbHVlLFxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvLnZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWdncmVnYXRpb25JZkF1dG9SZWZyZXNoRGlzYWJsZWQoc2VsZWN0ZWRJbnRlcnZhbDogSW50ZXJ2YWxbJ2lkJ10pOiB2b2lkIHtcbiAgICBjb25zdCBpc0F1dG9SZWZyZXNoRGlzYWJsZWQgPSAhdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuaXNBdXRvUmVmcmVzaEVuYWJsZWQudmFsdWU7XG4gICAgaWYgKGlzQXV0b1JlZnJlc2hEaXNhYmxlZCkge1xuICAgICAgdGhpcy5zZXRBZ2dyZWdhdGlvblZhbHVlKHNlbGVjdGVkSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0QWdncmVnYXRpb25WYWx1ZShpbnRlcnZhbDogSW50ZXJ2YWxbJ2lkJ10pOiB2b2lkIHtcbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hZ2dyZWdhdGlvbjtcblxuICAgIGNvbnN0IG5ld0FnZ3JlZ2F0aW9uVmFsdWUgPSB0aGlzLmFnZ3JlZ2F0aW9uU2VydmljZS5kZXRlcm1pbmVBZ2dyZWdhdGlvblZhbHVlKGludGVydmFsKTtcbiAgICBhZ2dyZWdhdGlvbkNvbnRyb2wuc2V0VmFsdWUobmV3QWdncmVnYXRpb25WYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBkYXRlIHNlbGVjdG9yIGZvcm0gY29udHJvbC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRGF0ZVNlbGVjdG9yQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBtZXJnZShcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVGcm9tLnZhbHVlQ2hhbmdlcyxcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVUby52YWx1ZUNoYW5nZXNcbiAgICApXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGFuZGxlRGF0ZUNoYW5nZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGF0ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ludGVydmFsU2VsZWN0b3JDaGFuZ2VkUHJvZ3JhbW1hdGljYWxseSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVydmFsQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmludGVydmFsO1xuICAgIGlmIChpbnRlcnZhbENvbnRyb2wudmFsdWUgPT09IElOVEVSVkFMX1ZBTFVFUy5jdXN0b20pIHtcbiAgICAgIHRoaXMuaGFuZGxlQ3VzdG9tSW50ZXJ2YWxEYXRlQ2hhbmdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0SW50ZXJ2YWxUb0N1c3RvbShpbnRlcnZhbENvbnRyb2wpO1xuICAgIH1cbiAgICB0aGlzLnNldFRvRmlyc3RBdmFpbGFibGVBZ2dyZWdhdGlvbk9wdGlvbklmQ3VycmVudEFnZ3JlZ2F0aW9uSXNEaXNhYmxlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDdXN0b21JbnRlcnZhbERhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVEaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbnRlcnZhbFRvQ3VzdG9tKGludGVydmFsQ29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgaW50ZXJ2YWxDb250cm9sLnNldFZhbHVlKElOVEVSVkFMX1ZBTFVFUy5jdXN0b20pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2hhbmdlcyBpbiB0aGUgZ2xvYmFsIGRhdGUgc2VsZWN0b3IgZm9ybSBjb250cm9sLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVHbG9iYWxEYXRlU2VsZWN0b3JDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmdsb2JhbERhdGVTZWxlY3Rvci52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHNlbGVjdGVkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkID09PSBEQVRFX1NFTEVDVElPTl9WQUxVRVMuZGFzaGJvYXJkX2NvbnRleHQpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZURhc2hib2FyZENvbnRleHQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZU5vbkRhc2hib2FyZENvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURhc2hib2FyZENvbnRleHQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1dpZGdldExpbmtlZFRvR2xvYmFsVGltZUNvbnRleHQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb25EYXNoYm9hcmRDb250ZXh0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNXaWRnZXRMaW5rZWRUb0dsb2JhbFRpbWVDb250ZXh0ID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5pc0NvbmZpZ1NhdmVkV2l0aG91dERhc2hib2FyZFRpbWVPcHRpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQWdncmVnYXRpb25JZk5lY2Vzc2FyeSgpO1xuICAgIHRoaXMuc2V0SW50ZXJ2YWxUb0N1c3RvbSh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5pbnRlcnZhbCk7XG4gIH1cblxuICBwcml2YXRlIGlzQ29uZmlnU2F2ZWRXaXRob3V0RGFzaGJvYXJkVGltZU9wdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBZ2dyZWdhdGlvbklmTmVjZXNzYXJ5KCk6IHZvaWQge1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uO1xuICAgIGNvbnN0IGlzRGFzaGJvYXJkVGltZU9wdGlvblNldEFnZ3JlZ2F0aW9uVG9OdWxsID0gIWFnZ3JlZ2F0aW9uQ29udHJvbC52YWx1ZTtcblxuICAgIGlmIChpc0Rhc2hib2FyZFRpbWVPcHRpb25TZXRBZ2dyZWdhdGlvblRvTnVsbCkge1xuICAgICAgYWdncmVnYXRpb25Db250cm9sLnNldFZhbHVlKEFHR1JFR0FUSU9OX1ZBTFVFUy5ub25lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWdncmVnYXRpb24gY29udHJvbCB0byB0aGUgZmlyc3QgYXZhaWxhYmxlIChub24tZGlzYWJsZWQpIG9wdGlvbiBpZiB0aGUgY3VycmVudCBvcHRpb24gaXMgZGlzYWJsZWQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kOlxuICAgKiAtIFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYWdncmVnYXRpb24gY29udHJvbC5cbiAgICogLSBDaGVja3MgaWYgdGhlIGN1cnJlbnQgYWdncmVnYXRpb24gb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgKiAtIElmIHRoZSBjdXJyZW50IG9wdGlvbiBpcyBkaXNhYmxlZCwgc2V0cyB0aGUgY29udHJvbCB0byB0aGUgZmlyc3QgYXZhaWxhYmxlIChub24tZGlzYWJsZWQpIG9wdGlvbiBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuICAgKiAgIC0gSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYERBSUxZYCwgaXQgc3dpdGNoZXMgdG8gYEhPVVJMWWAgaWYgaXQncyBub3QgZGlzYWJsZWQsIG90aGVyd2lzZSB0byBgTUlOVVRFTFlgIGlmIGBIT1VSTFlgIGlzIGFsc28gZGlzYWJsZWQuXG4gICAqICAgLSBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBgSE9VUkxZYCwgaXQgc3dpdGNoZXMgdG8gYE1JTlVURUxZYCBpZiBpdCdzIG5vdCBkaXNhYmxlZC5cbiAgICogICAtIElmIGFsbCBvcHRpb25zIGFyZSBkaXNhYmxlZCwgaXQgc2V0cyB0aGUgdmFsdWUgdG8gYE5PTkVgLlxuICAgKlxuICAgKiBUaGUgZGlzYWJsZWQgc3RhdGUgaXMgc3RvcmVkIGluIHRoZSBgZGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnNgIG9iamVjdCxcbiAgICogd2hlcmUgdGhlIGtleSBpcyB0aGUgYWdncmVnYXRpb24gdmFsdWUgYW5kIHRoZSB2YWx1ZSBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWQuXG4gICAqXG4gICAqIFRoZSBgQUdHUkVHQVRJT05fVkFMVUVTYCBvYmplY3QgZGVmaW5lcyB0aGUgcG9zc2libGUgYWdncmVnYXRpb24gdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRUb0ZpcnN0QXZhaWxhYmxlQWdncmVnYXRpb25PcHRpb25JZkN1cnJlbnRBZ2dyZWdhdGlvbklzRGlzYWJsZWQoKTogdm9pZCB7XG4gICAgY29uc3QgYWdncmVnYXRpb25Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWdncmVnYXRpb247XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gYWdncmVnYXRpb25Db250cm9sLnZhbHVlO1xuXG4gICAgY29uc3QgbmV3QWdncmVnYXRpb25WYWx1ZSA9IHRoaXMuYWdncmVnYXRpb25TZXJ2aWNlLmRldGVybWluZUZpcnN0TmV3QXZhaWxhYmxlQWdncmVnYXRpb25WYWx1ZShcbiAgICAgIGN1cnJlbnRWYWx1ZSxcbiAgICAgIHRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnNcbiAgICApO1xuXG4gICAgaWYgKG5ld0FnZ3JlZ2F0aW9uVmFsdWUgIT09IGN1cnJlbnRWYWx1ZSkge1xuICAgICAgYWdncmVnYXRpb25Db250cm9sLnNldFZhbHVlKG5ld0FnZ3JlZ2F0aW9uVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlQWdncmVnYXRpb25Qcm9wZXJ0eShjb25maWc6IERhdGFwb2ludHNUYWJsZUNvbmZpZyk6IHZvaWQge1xuICAgIGRlbGV0ZSB0aGlzLmZvcm1Hcm91cC52YWx1ZS5hZ2dyZWdhdGlvbjtcbiAgICBkZWxldGUgY29uZmlnLmFnZ3JlZ2F0aW9uO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicC1sLTI0IHAtci0yNFwiPlxuICA8Zm9ybVxuICAgIGNsYXNzPVwibm8tY2FyZC1jb250ZXh0XCJcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gID5cbiAgICA8IS0tIDxkYXRhcG9pbnRzLXNlbGVjdG9yPiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgPCEtLSBnbG9iYWwtdGltZS1jb250ZXh0LXNlbGVjdG9yIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtLWItMCBwLWItMTYgc2VwYXJhdG9yLWJvdHRvbVwiPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlciBwLXQtNFwiXG4gICAgICAgICAgICBmb3I9XCJkYXRlU2VsZWN0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnRGF0ZSBzZWxlY3Rpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJwb3BvdmVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFthZGFwdGl2ZVBvc2l0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwb3BvdmVyVGVtcGxhdGU+XG4gICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+XG4gICAgICAgICAgICAgIENob29zZSBob3cgdG8gc2VsZWN0IGEgZGF0ZSByYW5nZSwgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZTpcbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibS1sLTAgcC1sLTggbS10LTggbS1iLTBcIj5cbiAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICA8Yj5EYXNoYm9hcmQgdGltZSByYW5nZTo8L2I+XG4gICAgICAgICAgICAgICAgICByZXN0cmljdHMgZGF0ZSBzZWxlY3Rpb24gdG8gdGhlIGdsb2JhbCBkYXNoYm9hcmQgY29uZmlndXJhdGlvbiBvbmx5XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICA8Yj5XaWRnZXQgY29uZmlndXJhdGlvbjo8L2I+XG4gICAgICAgICAgICAgICAgICByZXN0cmljdHMgdGhlIGRhdGUgc2VsZWN0aW9uIG9ubHkgdG8gdGhlIHdpZGdldCBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICA8Yj5XaWRnZXQgYW5kIHdpZGdldCBjb25maWd1cmF0aW9uOjwvYj5cbiAgICAgICAgICAgICAgICAgIHJlc3RyaWN0cyB0aGUgZGF0ZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldCB2aWV3IGFuZCB3aWRnZXQgY29uZmlndXJhdGlvbiBvbmx5XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC0xMlwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInRGF0ZSBzZWxlY3Rpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGF0ZSBzZWxlY3Rpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgaWQ9XCJnbG9iYWxEYXRlU2VsZWN0b3JcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJnbG9iYWxEYXRlU2VsZWN0b3JcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRhdGFTZWxlY3Rpb25WYWx1ZSBvZiBEQVRFX1NFTEVDVElPTl9WQUxVRVNfQVJSXCJcbiAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJkYXRhU2VsZWN0aW9uVmFsdWVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgREFURV9TRUxFQ1RJT05fTEFCRUxTW2RhdGFTZWxlY3Rpb25WYWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgPGM4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWluaGVyaXQgc2VwYXJhdG9yLXRvcCBwLXQtMTYgZC1ibG9ja1wiXG4gICAgICAgICAgbGlzdFRpdGxlPVwie3sgJ0RhdGEgcG9pbnRzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgbmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICAgIFtkZWZhdWx0Rm9ybU9wdGlvbnNdPVwiZGVmYXVsdEZvcm1PcHRpb25zXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZ1wiXG4gICAgICAgICAgW21pbkFjdGl2ZUNvdW50XT1cIjFcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICA+PC9jOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNXaWRnZXRMaW5rZWRUb0dsb2JhbFRpbWVDb250ZXh0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICA8IS0tIGludGVydmFsIHNlbGVjdG9yIC0tPlxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0XCI+XG4gICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIHt7ICdBdXRvIHJlZnJlc2gnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgICdDaGFuZ2UgdGhlIHN0YXRlIG9mIGludGVydmFsIGF1dG9tYXRpYyByZWZyZXNoIGFuZCBzZXQgdGhlIHJlZnJlc2ggZnJlcXVlbmN5LidcbiAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItMTYgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTQgbS10LTggbS1iLTggYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXN3aXRjaFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBpZD1cInJlZnJlc2hUb2dnbGVcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpc0F1dG9SZWZyZXNoRW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpc0F1dG9SZWZyZXNoRW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJlZnJlc2hJbnRlcnZhbENvbnRyb2woKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+e3sgJ0F1dG8gcmVmcmVzaCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibS1iLTBcIlxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyAnSW50ZXJ2YWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC0xMlwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidSZWZyZXNoIGludGVydmFsIGluIHNlY29uZHMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBpZD1cInJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByZWZyZXNoSW50ZXJ2YWwgb2YgUkVGUkVTSF9JTlRFUlZBTF9WQUxVRVNfQVJSXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cInJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3t7IHNlY29uZHMgfX0gcycgfCB0cmFuc2xhdGU6IHsgc2Vjb25kczogcmVmcmVzaEludGVydmFsIC8gMTAwMCB9IH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBkZWNpbWFsIGlucHV0IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXRcIj5cbiAgICAgICAgICAgIDxsZWdlbmQ+XG4gICAgICAgICAgICAgIHt7ICdEZWNpbWFsIHBsYWNlcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwicC10LThcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJkZWNpbWFsUGxhY2VzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWNpbWFsUGxhY2VzXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIGFnZ3JlZ2F0aW9uIHNlbGVjdG9yIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzV2lkZ2V0TGlua2VkVG9HbG9iYWxUaW1lQ29udGV4dFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0XCI+XG4gICAgICAgICAgICAgIDxsZWdlbmQ+XG4gICAgICAgICAgICAgICAge3sgJ0FnZ3JlZ2F0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwicC10LThcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIFNldHRpbmcgYmVsb3cgW2F0dHIuZGlzYWJsZWRdIGVuc3VyZXMgdGhhdCB0aGUgY29udHJvbCBpcyB2aXN1YWxseSBkaXNhYmxlZCBhbmQgdXNlciBpbnRlcmFjdGlvbiBpcyBwcmV2ZW50ZWQsXG4gICAgICAgICAgICAgICB3aGlsZSBzdGlsbCBhbGxvd2luZyB0aGUgdmFsdWUgdG8gYmUgdXBkYXRlZCBhbmQgc2F2ZWQgY29ycmVjdGx5IGluIHRoZSBmb3JtLlxuICAgICAgICAgICAgICAgVGhpcyBzb2x1dGlvbiBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgZW5hYmxlcyBhdXRvLXJlZnJlc2gsIGluIHdoaWNoIGNhc2UgYWdncmVnYXRpb24gbXVzdCBiZSBzZXQgdG8gTk9ORS4gLS0+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtMTJcIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FnZ3JlZ2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiYWdncmVnYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZ2dyZWdhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cImZvcm1Hcm91cC52YWx1ZS5pc0F1dG9SZWZyZXNoRW5hYmxlZCA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhZ2dyZWdhdGlvblZhbHVlIG9mIEFHR1JFR0FUSU9OX1ZBTFVFU19BUlJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImFnZ3JlZ2F0aW9uVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc1thZ2dyZWdhdGlvblZhbHVlXVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBBR0dSRUdBVElPTl9MQUJFTFNbYWdncmVnYXRpb25WYWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIHRpbWUgaW50ZXJ2YWwgc2VsZWN0b3IgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldFwiPlxuICAgICAgICAgICAgPGxlZ2VuZD5cbiAgICAgICAgICAgICAge3sgJ1RpbWUgaW50ZXJ2YWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2xlZ2VuZD5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cInAtdC04XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LTEyXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInSW50ZXJ2YWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiaW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW50ZXJ2YWxcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGludGVydmFsVmFsdWUgb2YgSU5URVJWQUxfVkFMVUVTX0FSUlwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cImludGVydmFsVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBUSU1FX1JBTkdFX0lOVEVSVkFMX0xBQkVMU1tpbnRlcnZhbFZhbHVlXSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBkYXRlIHBpY2tlcnMgLS0+XG4gICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXRcIj5cbiAgICAgICAgPGxlZ2VuZD5cbiAgICAgICAgICB7eyAnRGF0ZSByYW5nZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgIDxjOHktZGF0ZS1yYW5nZS1waWNrZXI+PC9jOHktZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj5cbiJdfQ==
|