@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
298 lines • 44.4 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { SmartGroupsService } from '@c8y/client';
import { BuiltInActionType, DataGridComponent, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, gettext, UserPreferencesConfigurationStrategy } from '@c8y/ngx-components';
import { AssetNodeService } from '@c8y/ngx-components/assets-navigator';
import { DeviceListExtensionService } from '@c8y/ngx-components/device-list';
import { BsModalService } from 'ngx-bootstrap/modal';
import { of, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { DeleteAssetsModalComponent } from './delete-assets-modal/delete-assets-modal.component';
import { PRODUCT_EXPERIENCE_SUB_ASSETS_SHARED } from './shared/sub-assets.model';
import { SmartGroupGridConfigurationStrategy } from './smart-group-grid-configuration-strategy.service';
import { SubAssetsGridConfigurationStrategy } from './sub-assets-grid-configuration-strategy.service';
import { SubAssetsService } from './sub-assets.service';
import { UnassignModalComponent } from './unassign-assets-modal/unassign-modal.component';
import * as i0 from "@angular/core";
import * as i1 from "./sub-assets.service";
import * as i2 from "ngx-bootstrap/modal";
import * as i3 from "@c8y/client";
import * as i4 from "@c8y/ngx-components/device-list";
import * as i5 from "@c8y/ngx-components/assets-navigator";
import * as i6 from "@c8y/ngx-components";
import * as i7 from "@angular/common";
export class SubAssetsGridComponent {
get columns() {
return this._columns;
}
set columns(value) {
this._columns = value ?? this.subAssetsGridService.getDefaultColumns();
}
set _pagination(value) {
if (value) {
this.pagination = value;
}
else {
this.pagination = this.subAssetsGridService.getDefaultPagination();
}
}
set _actionControls(value) {
if (value) {
this.actionControls = value;
}
else {
this.actionControls = this.subAssetsGridService.getDefaultActionControls();
}
}
set _bulkActionControls(value) {
if (value) {
this.bulkActionControls = value;
}
else {
this.bulkActionControls = this.subAssetsGridService.getDefaultBulkActionControls();
}
}
get isRootGroup() {
return !this.parentGroup;
}
get getInfiniteScrollMode() {
return this.isRootGroup && this.subAssetsGridService.isUsingInventoryRoles()
? 'auto'
: undefined;
}
set _displayOptions(displayOptions) {
this.displayOptions = { ...this.displayOptions, ...displayOptions };
}
constructor(subAssetsGridService, bsModalService, smartGroupsService, deviceListExtensionService, assetNodeService) {
this.subAssetsGridService = subAssetsGridService;
this.bsModalService = bsModalService;
this.smartGroupsService = smartGroupsService;
this.deviceListExtensionService = deviceListExtensionService;
this.assetNodeService = assetNodeService;
this.PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_SUB_ASSETS_SHARED;
this.title = gettext('Subassets');
this.emptyStateText = gettext('Add your first group or assign devices using the buttons on the action bar.');
this.loadingItemsLabel = gettext('Loading assets…');
this.selectable = false;
this.baseQuery = {};
this.filterable = true;
this.sortable = true;
this.onColumnsChange = new EventEmitter();
this.itemsSelect = new EventEmitter();
this.pagination = this.subAssetsGridService.getDefaultPagination();
this.showCounterWarning = false;
this.bulkActionControls = this.subAssetsGridService.getDefaultBulkActionControls();
this.displayOptions = {
striped: true,
bordered: false,
gridHeader: true,
filter: true,
hover: true
};
this.showSearch = false;
this.noResultsMessage = gettext('No matching items.');
this.noDataMessage = gettext('No items to display.');
this.noResultsSubtitle = gettext('Refine your search terms or check your spelling.');
this.destroyed$ = new Subject();
this.serverSideDataCallback = this.onDataSourceModifier.bind(this);
}
getGridConfigContext() {
if (!!this.columnsConfigKey) {
return { key: this.columnsConfigKey, group: this.parentGroup };
}
}
ngOnInit() {
const isDynamicGroup = !!this.parentGroup && this.assetNodeService.isDynamicGroup(this.parentGroup);
if (!this.isRootGroup) {
(isDynamicGroup
? this.deviceListExtensionService.items$
: of(this.subAssetsGridService.getDefaultColumns(this.filterable, this.sortable)))
.pipe(takeUntil(this.destroyed$))
.subscribe(columns => (this.columns = columns));
}
if (!this.filterable || !this.sortable) {
this.displayOptions.filter = this.filterable;
this.columns.forEach(column => {
column.filterable = this.filterable;
column.sortable = this.sortable;
});
}
this.setActionControls();
this.showSearch = isDynamicGroup || !this.parentGroup;
}
setActionControls() {
const actionControls = [];
const unassignAction = {
type: 'UNASSIGN',
icon: 'unlink',
text: gettext('Unassign'),
priority: 1000,
callback: (asset) => this.onUnassignAsset(asset, this.parentGroup),
showIf: (asset) => this.subAssetsGridService.isDevice(asset) &&
!this.subAssetsGridService.isSmartGroup(this.parentGroup)
};
actionControls.push(unassignAction);
const deleteAction = {
type: BuiltInActionType.Delete,
priority: -Infinity,
callback: (asset) => this.onDeleteAsset(asset, this.parentGroup),
showIf: (asset) => {
if (this.smartGroupsService.isSmartGroup(asset)) {
return this.subAssetsGridService.canDeleteSmartGroup();
}
return true;
}
};
actionControls.push(deleteAction);
if (!this.actionControls) {
this.actionControls = actionControls;
}
}
onUnassignAsset(asset, parentRef) {
const initialState = {
asset
};
const modalRef = this.bsModalService.show(UnassignModalComponent, { initialState });
modalRef.content.closeSubject.subscribe(async (result) => {
if (result) {
await this.subAssetsGridService.unassignAsset(asset, parentRef);
this.refresh.emit();
}
});
}
async onDeleteAsset(asset, parentRef) {
const initialState = {
showWithDeviceUserCheckbox: this.subAssetsGridService.shouldShowWithDeviceUserCheckbox(asset),
asset,
showWithCascadeCheckbox: !this.smartGroupsService.isSmartGroup(asset)
};
const modalRef = this.bsModalService.show(DeleteAssetsModalComponent, { initialState });
modalRef.content.closeSubject.subscribe(async (result) => {
if (result) {
await this.subAssetsGridService.deleteAsset(asset, parentRef, result);
if (result.cascade) {
this.showCounterWarning = true;
}
this.refresh.emit();
}
});
}
ngOnChanges(changes) {
if (changes.parentGroup && !changes.parentGroup.firstChange) {
this.dataGrid.reload();
}
}
trackByName(_index, column) {
return column.name;
}
onReload() {
this.assetNodeService.rootNode.refresh();
}
async onDataSourceModifier(dataSourceModifier) {
const promises = [];
let counters;
promises.push(this.subAssetsGridService.getData(dataSourceModifier.columns, dataSourceModifier.pagination, this.parentGroup, this.baseQuery, dataSourceModifier.searchText));
promises.push(this.subAssetsGridService.getTotal(this.parentGroup, this.baseQuery));
promises.push(this.subAssetsGridService.getCount(dataSourceModifier.columns, dataSourceModifier.pagination, this.parentGroup, this.baseQuery, dataSourceModifier.searchText));
const [dataResponse, size, filteredSize] = await Promise.all(promises);
if (!counters) {
counters = {
size,
filteredSize
};
}
this.onColumnsChange.emit(dataSourceModifier.columns);
return {
res: dataResponse.res,
data: dataResponse.data,
paging: dataResponse.paging,
...counters
};
}
ngOnDestroy() {
this.destroyed$.next();
this.destroyed$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubAssetsGridComponent, deps: [{ token: i1.SubAssetsService }, { token: i2.BsModalService }, { token: i3.SmartGroupsService }, { token: i4.DeviceListExtensionService }, { token: i5.AssetNodeService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SubAssetsGridComponent, selector: "c8y-sub-assets-grid", inputs: { parentGroup: ["parent-group", "parentGroup"], refresh: "refresh", title: "title", emptyStateText: "emptyStateText", loadingItemsLabel: "loadingItemsLabel", columnsConfigKey: "columnsConfigKey", columns: "columns", _pagination: ["pagination", "_pagination"], _actionControls: ["actionControls", "_actionControls"], selectable: "selectable", baseQuery: "baseQuery", _bulkActionControls: ["bulkActionControls", "_bulkActionControls"], filterable: "filterable", sortable: "sortable", _displayOptions: ["displayOptions", "_displayOptions"] }, outputs: { onColumnsChange: "onColumnsChange", itemsSelect: "itemsSelect" }, providers: [
{
provide: UserPreferencesConfigurationStrategy,
useClass: UserPreferencesConfigurationStrategy
},
{
provide: SmartGroupGridConfigurationStrategy,
useClass: SmartGroupGridConfigurationStrategy
},
{
provide: DATA_GRID_CONFIGURATION_STRATEGY,
useClass: SubAssetsGridConfigurationStrategy
},
{
provide: DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER,
useExisting: SubAssetsGridComponent
}
], viewQueries: [{ propertyName: "dataGrid", first: true, predicate: DataGridComponent, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<c8y-data-grid\n [title]=\"title\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [bulkActionControls]=\"bulkActionControls\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [infiniteScroll]=\"getInfiniteScrollMode\"\n [showCounterWarning]=\"showCounterWarning\"\n [refresh]=\"refresh\"\n [showSearch]=\"showSearch\"\n [displayOptions]=\"displayOptions\"\n (itemsSelect)=\"itemsSelect.emit($event)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n (onReload)=\"onReload()\"\n>\n <c8y-ui-empty-state\n [icon]=\"'c8y-group-add'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (emptyStateText | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\">\n <c8y-column [name]=\"column.name\"></c8y-column>\n </ng-container>\n</c8y-data-grid>\n", dependencies: [{ kind: "component", type: i6.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i6.EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i6.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "directive", type: i6.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "pipe", type: i6.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubAssetsGridComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-sub-assets-grid', providers: [
{
provide: UserPreferencesConfigurationStrategy,
useClass: UserPreferencesConfigurationStrategy
},
{
provide: SmartGroupGridConfigurationStrategy,
useClass: SmartGroupGridConfigurationStrategy
},
{
provide: DATA_GRID_CONFIGURATION_STRATEGY,
useClass: SubAssetsGridConfigurationStrategy
},
{
provide: DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER,
useExisting: SubAssetsGridComponent
}
], template: "<c8y-data-grid\n [title]=\"title\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [bulkActionControls]=\"bulkActionControls\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [infiniteScroll]=\"getInfiniteScrollMode\"\n [showCounterWarning]=\"showCounterWarning\"\n [refresh]=\"refresh\"\n [showSearch]=\"showSearch\"\n [displayOptions]=\"displayOptions\"\n (itemsSelect)=\"itemsSelect.emit($event)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n (onReload)=\"onReload()\"\n>\n <c8y-ui-empty-state\n [icon]=\"'c8y-group-add'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (emptyStateText | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\">\n <c8y-column [name]=\"column.name\"></c8y-column>\n </ng-container>\n</c8y-data-grid>\n" }]
}], ctorParameters: () => [{ type: i1.SubAssetsService }, { type: i2.BsModalService }, { type: i3.SmartGroupsService }, { type: i4.DeviceListExtensionService }, { type: i5.AssetNodeService }], propDecorators: { parentGroup: [{
type: Input,
args: ['parent-group']
}], refresh: [{
type: Input
}], title: [{
type: Input
}], emptyStateText: [{
type: Input
}], loadingItemsLabel: [{
type: Input
}], columnsConfigKey: [{
type: Input
}], columns: [{
type: Input
}], _pagination: [{
type: Input,
args: ['pagination']
}], _actionControls: [{
type: Input,
args: ['actionControls']
}], selectable: [{
type: Input
}], baseQuery: [{
type: Input
}], _bulkActionControls: [{
type: Input,
args: ['bulkActionControls']
}], filterable: [{
type: Input
}], sortable: [{
type: Input
}], onColumnsChange: [{
type: Output
}], itemsSelect: [{
type: Output
}], dataGrid: [{
type: ViewChild,
args: [DataGridComponent, { static: true }]
}], _displayOptions: [{
type: Input,
args: ['displayOptions']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLWFzc2V0cy1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3N1Yi1hc3NldHMvc3ViLWFzc2V0cy1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3N1Yi1hc3NldHMvc3ViLWFzc2V0cy1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBa0Isa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakUsT0FBTyxFQUVMLGlCQUFpQixFQUdqQixpQkFBaUIsRUFFakIsd0NBQXdDLEVBQ3hDLGdDQUFnQyxFQUVoQyxPQUFPLEVBTVAsb0NBQW9DLEVBQ3JDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUNqRyxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRixPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RyxPQUFPLEVBRUwsa0NBQWtDLEVBQ25DLE1BQU0sa0RBQWtELENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FB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QUUsd0NBQXdDOzRCQUNqRCxXQUFXLHdCQUF3Qjt5QkFDcEM7cUJBQ0Y7Mk5BSXNCLFdBQVc7c0JBQWpDLEtBQUs7dUJBQUMsY0FBYztnQkFDWixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFLTyxPQUFPO3NCQUFuQixLQUFLO2dCQUdtQixXQUFXO3NCQUFuQyxLQUFLO3VCQUFDLFlBQVk7Z0JBT1UsZUFBZTtzQkFBM0MsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBT2QsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUMyQixtQkFBbUI7c0JBQW5ELEtBQUs7dUJBQUMsb0JBQW9CO2dCQU9sQixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQVVQLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBK0IxQyxlQUFlO3NCQURsQixLQUFLO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIFNtYXJ0R3JvdXBzU2VydmljZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFjdGlvbkNvbnRyb2wsXG4gIEJ1aWx0SW5BY3Rpb25UeXBlLFxuICBCdWxrQWN0aW9uQ29udHJvbCxcbiAgQ29sdW1uLFxuICBEYXRhR3JpZENvbXBvbmVudCxcbiAgRGF0YVNvdXJjZU1vZGlmaWVyLFxuICBEQVRBX0dSSURfQ09ORklHVVJBVElPTl9DT05URVhUX1BST1ZJREVSLFxuICBEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSxcbiAgRGlzcGxheU9wdGlvbnMsXG4gIGdldHRleHQsXG4gIEdyaWRDb25maWdDb250ZXh0UHJvdmlkZXIsXG4gIFBhZ2luYXRpb24sXG4gIFJvdyxcbiAgU2VydmVyU2lkZURhdGFDYWxsYmFjayxcbiAgU2VydmVyU2lkZURhdGFSZXN1bHQsXG4gIFVzZXJQcmVmZXJlbmNlc0NvbmZpZ3VyYXRpb25TdHJhdGVneVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFzc2V0Tm9kZVNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2Fzc2V0cy1uYXZpZ2F0b3InO1xuaW1wb3J0IHsgRGV2aWNlTGlzdEV4dGVuc2lvblNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RldmljZS1saXN0JztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGVsZXRlTW9kYWxDaGVja2JveGVzIH0gZnJvbSAnLi9kZWxldGUtYXNzZXRzLW1vZGFsJztcbmltcG9ydCB7IERlbGV0ZUFzc2V0c01vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9kZWxldGUtYXNzZXRzLW1vZGFsL2RlbGV0ZS1hc3NldHMtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFBST0RVQ1RfRVhQRVJJRU5DRV9TVUJfQVNTRVRTX1NIQVJFRCB9IGZyb20gJy4vc2hhcmVkL3N1Yi1hc3NldHMubW9kZWwnO1xuaW1wb3J0IHsgU21hcnRHcm91cEdyaWRDb25maWd1cmF0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL3NtYXJ0LWdyb3VwLWdyaWQtY29uZmlndXJhdGlvbi1zdHJhdGVneS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFN1YkFzc2V0c0dyaWRDb25maWdDb250ZXh0LFxuICBTdWJBc3NldHNHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5XG59IGZyb20gJy4vc3ViLWFzc2V0cy1ncmlkLWNvbmZpZ3VyYXRpb24tc3RyYXRlZ3kuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJBc3NldHNTZXJ2aWNlIH0gZnJvbSAnLi9zdWItYXNzZXRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVW5hc3NpZ25Nb2RhbENvbXBvbmVudCB9IGZyb20gJy4vdW5hc3NpZ24tYXNzZXRzLW1vZGFsL3VuYXNzaWduLW1vZGFsLmNvbXBvbmVudCc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktc3ViLWFzc2V0cy1ncmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N1Yi1hc3NldHMtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFVzZXJQcmVmZXJlbmNlc0NvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgICAgIHVzZUNsYXNzOiBVc2VyUHJlZmVyZW5jZXNDb25maWd1cmF0aW9uU3RyYXRlZ3lcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFNtYXJ0R3JvdXBHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5LFxuICAgICAgdXNlQ2xhc3M6IFNtYXJ0R3JvdXBHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5XG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSxcbiAgICAgIHVzZUNsYXNzOiBTdWJBc3NldHNHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5XG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBEQVRBX0dSSURfQ09ORklHVVJBVElPTl9DT05URVhUX1BST1ZJREVSLFxuICAgICAgdXNlRXhpc3Rpbmc6IFN1YkFzc2V0c0dyaWRDb21wb25lbnRcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU3ViQXNzZXRzR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBHcmlkQ29uZmlnQ29udGV4dFByb3ZpZGVyIHtcbiAgUFJPRFVDVF9FWFBFUklFTkNFID0gUFJPRFVDVF9FWFBFUklFTkNFX1NVQl9BU1NFVFNfU0hBUkVEO1xuICBASW5wdXQoJ3BhcmVudC1ncm91cCcpIHBhcmVudEdyb3VwOiBJTWFuYWdlZE9iamVjdDtcbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPHZvaWQ+O1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gZ2V0dGV4dCgnU3ViYXNzZXRzJyk7XG4gIEBJbnB1dCgpIGVtcHR5U3RhdGVUZXh0OiBzdHJpbmcgPSBnZXR0ZXh0KFxuICAgICdBZGQgeW91ciBmaXJzdCBncm91cCBvciBhc3NpZ24gZGV2aWNlcyB1c2luZyB0aGUgYnV0dG9ucyBvbiB0aGUgYWN0aW9uIGJhci4nXG4gICk7XG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGFzc2V0c+KApicpO1xuICAvKiogVGhlIG5hbWUgb2YgdGhlIGtleSB3aGVyZSBjb2x1bW5zIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBzdG9yZWQuICovXG4gIEBJbnB1dCgpIGNvbHVtbnNDb25maWdLZXk6IHN0cmluZztcblxuICBnZXQgY29sdW1ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuICBASW5wdXQoKSBzZXQgY29sdW1ucyh2YWx1ZTogQ29sdW1uW10pIHtcbiAgICB0aGlzLl9jb2x1bW5zID0gdmFsdWUgPz8gdGhpcy5zdWJBc3NldHNHcmlkU2VydmljZS5nZXREZWZhdWx0Q29sdW1ucygpO1xuICB9XG4gIEBJbnB1dCgncGFnaW5hdGlvbicpIHNldCBfcGFnaW5hdGlvbih2YWx1ZTogUGFnaW5hdGlvbikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHRoaXMuc3ViQXNzZXRzR3JpZFNlcnZpY2UuZ2V0RGVmYXVsdFBhZ2luYXRpb24oKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpIHNldCBfYWN0aW9uQ29udHJvbHModmFsdWU6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5hY3Rpb25Db250cm9scyA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzID0gdGhpcy5zdWJBc3NldHNHcmlkU2VydmljZS5nZXREZWZhdWx0QWN0aW9uQ29udHJvbHMoKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KCkgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBiYXNlUXVlcnk6IG9iamVjdCA9IHt9O1xuICBASW5wdXQoJ2J1bGtBY3Rpb25Db250cm9scycpIHNldCBfYnVsa0FjdGlvbkNvbnRyb2xzKHZhbHVlOiBCdWxrQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmJ1bGtBY3Rpb25Db250cm9scyA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1bGtBY3Rpb25Db250cm9scyA9IHRoaXMuc3ViQXNzZXRzR3JpZFNlcnZpY2UuZ2V0RGVmYXVsdEJ1bGtBY3Rpb25Db250cm9scygpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKSBmaWx0ZXJhYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgc29ydGFibGUgPSB0cnVlO1xuICBAT3V0cHV0KCkgb25Db2x1bW5zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Q29sdW1uW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW5bXT4oKTtcbiAgQE91dHB1dCgpIGl0ZW1zU2VsZWN0OiBFdmVudEVtaXR0ZXI8c3RyaW5nW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcblxuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uID0gdGhpcy5zdWJBc3NldHNHcmlkU2VydmljZS5nZXREZWZhdWx0UGFnaW5hdGlvbigpO1xuICBzaG93Q291bnRlcldhcm5pbmcgPSBmYWxzZTtcbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXTtcbiAgYnVsa0FjdGlvbkNvbnRyb2xzOiBCdWxrQWN0aW9uQ29udHJvbFtdID1cbiAgICB0aGlzLnN1YkFzc2V0c0dyaWRTZXJ2aWNlLmdldERlZmF1bHRCdWxrQWN0aW9uQ29udHJvbHMoKTtcbiAgc2VydmVyU2lkZURhdGFDYWxsYmFjazogU2VydmVyU2lkZURhdGFDYWxsYmFjaztcblxuICBAVmlld0NoaWxkKERhdGFHcmlkQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBkYXRhR3JpZDogRGF0YUdyaWRDb21wb25lbnQ7XG5cbiAgZGlzcGxheU9wdGlvbnM6IERpc3BsYXlPcHRpb25zID0ge1xuICAgIHN0cmlwZWQ6IHRydWUsXG4gICAgYm9yZGVyZWQ6IGZhbHNlLFxuICAgIGdyaWRIZWFkZXI6IHRydWUsXG4gICAgZmlsdGVyOiB0cnVlLFxuICAgIGhvdmVyOiB0cnVlXG4gIH07XG5cbiAgc2hvd1NlYXJjaCA9IGZhbHNlO1xuXG4gIG5vUmVzdWx0c01lc3NhZ2UgPSBnZXR0ZXh0KCdObyBtYXRjaGluZyBpdGVtcy4nKTtcbiAgbm9EYXRhTWVzc2FnZSA9IGdldHRleHQoJ05vIGl0ZW1zIHRvIGRpc3BsYXkuJyk7XG4gIG5vUmVzdWx0c1N1YnRpdGxlID0gZ2V0dGV4dCgnUmVmaW5lIHlvdXIgc2VhcmNoIHRlcm1zIG9yIGNoZWNrIHlvdXIgc3BlbGxpbmcuJyk7XG5cbiAgcHJpdmF0ZSBfY29sdW1uczogQ29sdW1uW107XG4gIHByaXZhdGUgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgZ2V0IGlzUm9vdEdyb3VwKCkge1xuICAgIHJldHVybiAhdGhpcy5wYXJlbnRHcm91cDtcbiAgfVxuXG4gIGdldCBnZXRJbmZpbml0ZVNjcm9sbE1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSb290R3JvdXAgJiYgdGhpcy5zdWJBc3NldHNHcmlkU2VydmljZS5pc1VzaW5nSW52ZW50b3J5Um9sZXMoKVxuICAgICAgPyAnYXV0bydcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgQElucHV0KCdkaXNwbGF5T3B0aW9ucycpXG4gIHNldCBfZGlzcGxheU9wdGlvbnMoZGlzcGxheU9wdGlvbnMpIHtcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0geyAuLi50aGlzLmRpc3BsYXlPcHRpb25zLCAuLi5kaXNwbGF5T3B0aW9ucyB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN1YkFzc2V0c0dyaWRTZXJ2aWNlOiBTdWJBc3NldHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgc21hcnRHcm91cHNTZXJ2aWNlOiBTbWFydEdyb3Vwc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkZXZpY2VMaXN0RXh0ZW5zaW9uU2VydmljZTogRGV2aWNlTGlzdEV4dGVuc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhc3NldE5vZGVTZXJ2aWNlOiBBc3NldE5vZGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc2VydmVyU2lkZURhdGFDYWxsYmFjayA9IHRoaXMub25EYXRhU291cmNlTW9kaWZpZXIuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGdldEdyaWRDb25maWdDb250ZXh0KCk6IFN1YkFzc2V0c0dyaWRDb25maWdDb250ZXh0IHtcbiAgICBpZiAoISF0aGlzLmNvbHVtbnNDb25maWdLZXkpIHtcbiAgICAgIHJldHVybiB7IGtleTogdGhpcy5jb2x1bW5zQ29uZmlnS2V5LCBncm91cDogdGhpcy5wYXJlbnRHcm91cCB9O1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGlzRHluYW1pY0dyb3VwID1cbiAgICAgICEhdGhpcy5wYXJlbnRHcm91cCAmJiB0aGlzLmFzc2V0Tm9kZVNlcnZpY2UuaXNEeW5hbWljR3JvdXAodGhpcy5wYXJlbnRHcm91cCk7XG4gICAgaWYgKCF0aGlzLmlzUm9vdEdyb3VwKSB7XG4gICAgICAoaXNEeW5hbWljR3JvdXBcbiAgICAgICAgPyB0aGlzLmRldmljZUxpc3RFeHRlbnNpb25TZXJ2aWNlLml0ZW1zJFxuICAgICAgICA6IG9mKHRoaXMuc3ViQXNzZXRzR3JpZFNlcnZpY2UuZ2V0RGVmYXVsdENvbHVtbnModGhpcy5maWx0ZXJhYmxlLCB0aGlzLnNvcnRhYmxlKSlcbiAgICAgIClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAgIC5zdWJzY3JpYmUoY29sdW1ucyA9PiAodGhpcy5jb2x1bW5zID0gY29sdW1ucykpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZmlsdGVyYWJsZSB8fCAhdGhpcy5zb3J0YWJsZSkge1xuICAgICAgdGhpcy5kaXNwbGF5T3B0aW9ucy5maWx0ZXIgPSB0aGlzLmZpbHRlcmFibGU7XG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICBjb2x1bW4uZmlsdGVyYWJsZSA9IHRoaXMuZmlsdGVyYWJsZTtcbiAgICAgICAgY29sdW1uLnNvcnRhYmxlID0gdGhpcy5zb3J0YWJsZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNldEFjdGlvbkNvbnRyb2xzKCk7XG4gICAgdGhpcy5zaG93U2VhcmNoID0gaXNEeW5hbWljR3JvdXAgfHwgIXRoaXMucGFyZW50R3JvdXA7XG4gIH1cblxuICBzZXRBY3Rpb25Db250cm9scygpIHtcbiAgICBjb25zdCBhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdID0gW107XG5cbiAgICBjb25zdCB1bmFzc2lnbkFjdGlvbjogQWN0aW9uQ29udHJvbCA9IHtcbiAgICAgIHR5cGU6ICdVTkFTU0lHTicsXG4gICAgICBpY29uOiAndW5saW5rJyxcbiAgICAgIHRleHQ6IGdldHRleHQoJ1VuYXNzaWduJyksXG4gICAgICBwcmlvcml0eTogMTAwMCxcbiAgICAgIGNhbGxiYWNrOiAoYXNzZXQ6IFJvdykgPT4gdGhpcy5vblVuYXNzaWduQXNzZXQoYXNzZXQgYXMgSU1hbmFnZWRPYmplY3QsIHRoaXMucGFyZW50R3JvdXApLFxuICAgICAgc2hvd0lmOiAoYXNzZXQ6IFJvdykgPT5cbiAgICAgICAgdGhpcy5zdWJBc3NldHNHcmlkU2VydmljZS5pc0RldmljZShhc3NldCBhcyBJTWFuYWdlZE9iamVjdCkgJiZcbiAgICAgICAgIXRoaXMuc3ViQXNzZXRzR3JpZFNlcnZpY2UuaXNTbWFydEdyb3VwKHRoaXMucGFyZW50R3JvdXAgYXMgSU1hbmFnZWRPYmplY3QpXG4gICAgfTtcblxuICAgIGFjdGlvbkNvbnRyb2xzLnB1c2godW5hc3NpZ25BY3Rpb24pO1xuXG4gICAgY29uc3QgZGVsZXRlQWN0aW9uOiBBY3Rpb25Db250cm9sID0ge1xuICAgICAgdHlwZTogQnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlLFxuICAgICAgcHJpb3JpdHk6IC1JbmZpbml0eSxcbiAgICAgIGNhbGxiYWNrOiAoYXNzZXQ6IFJvdykgPT4gdGhpcy5vbkRlbGV0ZUFzc2V0KGFzc2V0IGFzIElNYW5hZ2VkT2JqZWN0LCB0aGlzLnBhcmVudEdyb3VwKSxcbiAgICAgIHNob3dJZjogKGFzc2V0OiBSb3cpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc21hcnRHcm91cHNTZXJ2aWNlLmlzU21hcnRHcm91cChhc3NldCBhcyBJTWFuYWdlZE9iamVjdCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWJBc3NldHNHcmlkU2VydmljZS5jYW5EZWxldGVTbWFydEdyb3VwKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYWN0aW9uQ29udHJvbHMucHVzaChkZWxldGVBY3Rpb24pO1xuXG4gICAgaWYgKCF0aGlzLmFjdGlvbkNvbnRyb2xzKSB7XG4gICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzID0gYWN0aW9uQ29udHJvbHM7XG4gICAgfVxuICB9XG5cbiAgb25VbmFzc2lnbkFzc2V0KGFzc2V0OiBJTWFuYWdlZE9iamVjdCwgcGFyZW50UmVmOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgIGFzc2V0XG4gICAgfTtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMuYnNNb2RhbFNlcnZpY2Uuc2hvdyhVbmFzc2lnbk1vZGFsQ29tcG9uZW50LCB7IGluaXRpYWxTdGF0ZSB9KTtcblxuICAgIG1vZGFsUmVmLmNvbnRlbnQuY2xvc2VTdWJqZWN0LnN1YnNjcmliZShhc3luYyAocmVzdWx0OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3ViQXNzZXRzR3JpZFNlcnZpY2UudW5hc3NpZ25Bc3NldChhc3NldCwgcGFyZW50UmVmKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoLmVtaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG9uRGVsZXRlQXNzZXQoYXNzZXQ6IElNYW5hZ2VkT2JqZWN0LCBwYXJlbnRSZWY6IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgICAgc2hvd1dpdGhEZXZpY2VVc2VyQ2hlY2tib3g6IHRoaXMuc3ViQXNzZXRzR3JpZFNlcnZpY2Uuc2hvdWxkU2hvd1dpdGhEZXZpY2VVc2VyQ2hlY2tib3goYXNzZXQpLFxuICAgICAgYXNzZXQsXG4gICAgICBzaG93V2l0aENhc2NhZGVDaGVja2JveDogIXRoaXMuc21hcnRHcm91cHNTZXJ2aWNlLmlzU21hcnRHcm91cChhc3NldClcbiAgICB9O1xuXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coRGVsZXRlQXNzZXRzTW9kYWxDb21wb25lbnQsIHsgaW5pdGlhbFN0YXRlIH0pO1xuXG4gICAgbW9kYWxSZWYuY29udGVudC5jbG9zZVN1YmplY3Quc3Vic2NyaWJlKGFzeW5jIChyZXN1bHQ6IERlbGV0ZU1vZGFsQ2hlY2tib3hlcykgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN1YkFzc2V0c0dyaWRTZXJ2aWNlLmRlbGV0ZUFzc2V0KGFzc2V0LCBwYXJlbnRSZWYsIHJlc3VsdCk7XG4gICAgICAgIGlmIChyZXN1bHQuY2FzY2FkZSkge1xuICAgICAgICAgIHRoaXMuc2hvd0NvdW50ZXJXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZnJlc2guZW1pdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnBhcmVudEdyb3VwICYmICFjaGFuZ2VzLnBhcmVudEdyb3VwLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmRhdGFHcmlkLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIHRyYWNrQnlOYW1lKF9pbmRleCwgY29sdW1uOiBDb2x1bW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW4ubmFtZTtcbiAgfVxuXG4gIG9uUmVsb2FkKCkge1xuICAgIHRoaXMuYXNzZXROb2RlU2VydmljZS5yb290Tm9kZS5yZWZyZXNoKCk7XG4gIH1cblxuICBhc3luYyBvbkRhdGFTb3VyY2VNb2RpZmllcihcbiAgICBkYXRhU291cmNlTW9kaWZpZXI6IERhdGFTb3VyY2VNb2RpZmllclxuICApOiBQcm9taXNlPFNlcnZlclNpZGVEYXRhUmVzdWx0PiB7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBsZXQgY291bnRlcnM7XG5cbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgdGhpcy5zdWJBc3NldHNHcmlkU2VydmljZS5nZXREYXRhKFxuICAgICAgICBkYXRhU291cmNlTW9kaWZpZXIuY29sdW1ucyxcbiAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLnBhZ2luYXRpb24sXG4gICAgICAgIHRoaXMucGFyZW50R3JvdXAsXG4gICAgICAgIHRoaXMuYmFzZVF1ZXJ5LFxuICAgICAgICBkYXRhU291cmNlTW9kaWZpZXIuc2VhcmNoVGV4dFxuICAgICAgKVxuICAgICk7XG5cbiAgICBwcm9taXNlcy5wdXNoKHRoaXMuc3ViQXNzZXRzR3JpZFNlcnZpY2UuZ2V0VG90YWwodGhpcy5wYXJlbnRHcm91cCwgdGhpcy5iYXNlUXVlcnkpKTtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgdGhpcy5zdWJBc3NldHNHcmlkU2VydmljZS5nZXRDb3VudChcbiAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLmNvbHVtbnMsXG4gICAgICAgIGRhdGFTb3VyY2VNb2RpZmllci5wYWdpbmF0aW9uLFxuICAgICAgICB0aGlzLnBhcmVudEdyb3VwLFxuICAgICAgICB0aGlzLmJhc2VRdWVyeSxcbiAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLnNlYXJjaFRleHRcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgW2RhdGFSZXNwb25zZSwgc2l6ZSwgZmlsdGVyZWRTaXplXSA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBpZiAoIWNvdW50ZXJzKSB7XG4gICAgICBjb3VudGVycyA9IHtcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgZmlsdGVyZWRTaXplXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLm9uQ29sdW1uc0NoYW5nZS5lbWl0KGRhdGFTb3VyY2VNb2RpZmllci5jb2x1bW5zKTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXM6IGRhdGFSZXNwb25zZS5yZXMsXG4gICAgICBkYXRhOiBkYXRhUmVzcG9uc2UuZGF0YSxcbiAgICAgIHBhZ2luZzogZGF0YVJlc3BvbnNlLnBhZ2luZyxcbiAgICAgIC4uLmNvdW50ZXJzXG4gICAgfTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxjOHktZGF0YS1ncmlkXG4gIFt0aXRsZV09XCJ0aXRsZVwiXG4gIFtsb2FkaW5nSXRlbXNMYWJlbF09XCJsb2FkaW5nSXRlbXNMYWJlbFwiXG4gIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICBbcGFnaW5hdGlvbl09XCJwYWdpbmF0aW9uXCJcbiAgW2FjdGlvbkNvbnRyb2xzXT1cImFjdGlvbkNvbnRyb2xzXCJcbiAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gIFtidWxrQWN0aW9uQ29udHJvbHNdPVwiYnVsa0FjdGlvbkNvbnRyb2xzXCJcbiAgW3NlcnZlclNpZGVEYXRhQ2FsbGJhY2tdPVwic2VydmVyU2lkZURhdGFDYWxsYmFja1wiXG4gIFtpbmZpbml0ZVNjcm9sbF09XCJnZXRJbmZpbml0ZVNjcm9sbE1vZGVcIlxuICBbc2hvd0NvdW50ZXJXYXJuaW5nXT1cInNob3dDb3VudGVyV2FybmluZ1wiXG4gIFtyZWZyZXNoXT1cInJlZnJlc2hcIlxuICBbc2hvd1NlYXJjaF09XCJzaG93U2VhcmNoXCJcbiAgW2Rpc3BsYXlPcHRpb25zXT1cImRpc3BsYXlPcHRpb25zXCJcbiAgKGl0ZW1zU2VsZWN0KT1cIml0ZW1zU2VsZWN0LmVtaXQoJGV2ZW50KVwiXG4gIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gIFthY3Rpb25OYW1lXT1cIlBST0RVQ1RfRVhQRVJJRU5DRS5FVkVOVFwiXG4gIChvblJlbG9hZCk9XCJvblJlbG9hZCgpXCJcbj5cbiAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgIFtpY29uXT1cIidjOHktZ3JvdXAtYWRkJ1wiXG4gICAgW3RpdGxlXT1cInN0YXRzPy5zaXplID4gMCA/IChub1Jlc3VsdHNNZXNzYWdlIHwgdHJhbnNsYXRlKSA6IChub0RhdGFNZXNzYWdlIHwgdHJhbnNsYXRlKVwiXG4gICAgW3N1YnRpdGxlXT1cInN0YXRzPy5zaXplID4gMCA/IChub1Jlc3VsdHNTdWJ0aXRsZSB8IHRyYW5zbGF0ZSkgOiAoZW1wdHlTdGF0ZVRleHQgfCB0cmFuc2xhdGUpXCJcbiAgICAqZW1wdHlTdGF0ZUNvbnRleHQ9XCJsZXQgc3RhdHNcIlxuICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IHRyYWNrQnk6IHRyYWNrQnlOYW1lXCI+XG4gICAgPGM4eS1jb2x1bW4gW25hbWVdPVwiY29sdW1uLm5hbWVcIj48L2M4eS1jb2x1bW4+XG4gIDwvbmctY29udGFpbmVyPlxuPC9jOHktZGF0YS1ncmlkPlxuIl19