@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
62 lines • 24.9 kB
JavaScript
import { ChangeDetectorRef, Component, ViewChild } from '@angular/core';
import { WizardModalService } from '@c8y/ngx-components';
import { BehaviorSubject } from 'rxjs';
import { shareReplay, switchMap, tap } from 'rxjs/operators';
import { APP_STATE, EcosystemService, EcosystemWizards, ListFiltersComponent } from '@c8y/ngx-components/ecosystem/shared';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components/ecosystem/shared";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@angular/common";
export class MicroserviceListComponent {
constructor(ecosystemService, wizardModalService, cd) {
this.ecosystemService = ecosystemService;
this.wizardModalService = wizardModalService;
this.cd = cd;
this.reloading = false;
this.reload$ = new BehaviorSubject(null);
this.microservices$ = this.reload$.pipe(tap(() => (this.reloading = true)), switchMap(() => this.ecosystemService.getMicroservices()), tap(microservices => {
microservices.forEach(microservice => {
microservice.filterProps = this.ecosystemService.getAppFilterProps(microservice);
});
}), tap(() => (this.reloading = false)), shareReplay());
this.isMicroserviceHostingAllowed$ = this.reload$.pipe(switchMap(() => this.ecosystemService.isMicroserviceHostingAllowed()), shareReplay());
this.packageAvailabilities = [
APP_STATE.SUBSCRIBED.label,
APP_STATE.CUSTOM.label
];
}
ngOnInit() {
this.loadMicroservices();
// manually trigger detection to not have ExpressionChangedAfterItHasBeenChecked error in spec file
this.cd.detectChanges();
}
loadMicroservices() {
this.reload$.next();
}
addMicroservice() {
const initialState = {
id: EcosystemWizards.MICROSERVICE_UPLOAD
};
const modalOptions = { initialState };
const modalRef = this.wizardModalService.show(modalOptions);
modalRef.content.onClose.subscribe(() => {
this.loadMicroservices();
});
}
setFilterPipe(pipe) {
this.filteredMicroservices$ = this.microservices$.pipe(src => pipe(src));
}
resetFilters() {
this.filtersComponent?.resetAllFilters();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MicroserviceListComponent, deps: [{ token: i1.EcosystemService }, { token: i2.WizardModalService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MicroserviceListComponent, selector: "c8y-microservice-list", viewQueries: [{ propertyName: "filtersComponent", first: true, predicate: ListFiltersComponent, descendants: true }], ngImport: i0, template: "<c8y-title>{{ 'Microservices' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-atom'\"\n [label]=\"'Ecosystem' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'microchip'\"\n [label]=\"'Microservices' | translate\"\n [path]=\"'ecosystem/microservice/microservices'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<ng-container *c8yIfAllowed=\"['ROLE_APPLICATION_MANAGEMENT_ADMIN']\">\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n *ngIf=\"isMicroserviceHostingAllowed$ | async\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add microservice' | translate }}\"\n (click)=\"addMicroservice()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add microservice' | translate }}\n </button>\n </c8y-action-bar-item>\n</ng-container>\n\n<c8y-help src=\"/docs/standard-tenant/ecosystem/#managing-microservices\"></c8y-help>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload$.next()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\">\n <c8y-list-filters\n *ngIf=\"microservices$ | async\"\n (filterPipeChange)=\"setFilterPipe($event)\"\n [packageAvailabilities]=\"packageAvailabilities\"\n ></c8y-list-filters>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form hidden-xs\"\n>\n <c8y-list-display-switch\n (onListClassChange)=\"listClass = $event\"\n [listLength]=\"(microservices$ | async)?.length\"\n ></c8y-list-display-switch>\n</c8y-action-bar-item>\n\n<div\n class=\"c8y-empty-state text-center\"\n *ngIf=\"(microservices$ | async)?.length === 0\"\n>\n <h1 class=\"c8y-icon c8y-icon-modules c8y-icon-duocolor\"></h1>\n <h3 translate>No microservices to display.</h3>\n <p translate>Add your first microservice by clicking below.</p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add microservice' | translate }}\"\n (click)=\"addMicroservice()\"\n >\n {{ 'Add microservice' | translate }}\n </button>\n </p>\n</div>\n\n<div\n class=\"card-group\"\n [ngClass]=\"listClass\"\n>\n <div\n class=\"page-sticky-header hidden-xs d-flex\"\n *ngIf=\"(microservices$ | async)?.length > 0\"\n >\n <div class=\"card-block card-column-40\">\n <div class=\"card-appicon p-l-32 p-r-16 m-r-0 m-l-4\"></div>\n {{ 'Microservice' | translate }}\n </div>\n <div class=\"card-block p-0 card-column-80 m-r-40\">\n <div class=\"card-block card-column-80\">{{ 'Description' | translate }}</div>\n <div class=\"card-block card-column-20\">{{ 'Type' | translate }}</div>\n <div class=\"card-block card-column-20\"></div>\n </div>\n </div>\n <div\n class=\"col-xs-12 col-sm-4 col-md-3\"\n *ngFor=\"let microservice of filteredMicroservices$ | async\"\n >\n <c8y-application-card\n class=\"d-contents\"\n (onAppDeleted)=\"loadMicroservices()\"\n [app]=\"microservice\"\n ></c8y-application-card>\n </div>\n</div>\n\n<c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No matching microservices.' | translate\"\n [subtitle]=\"'Refine your search terms and/or the filters' | translate\"\n *ngIf=\"(microservices$ | async)?.length > 0 && (filteredMicroservices$ | async)?.length === 0\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Reset filters' | translate }}\"\n type=\"button\"\n (click)=\"resetFilters()\"\n >\n {{ 'Reset filters' | translate }}\n </button>\n</c8y-ui-empty-state>\n", dependencies: [{ kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i2.ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: ["listKey", "listLength", "filterPipe"], outputs: ["onListClassChange"] }, { kind: "component", type: i1.ApplicationCardComponent, selector: "c8y-application-card", inputs: ["app", "canEdit"], outputs: ["onAppDeleted", "onAppCloned"] }, { kind: "component", type: i1.ListFiltersComponent, selector: "c8y-list-filters", inputs: ["packageTypes", "packageAvailabilities", "packageContents"], outputs: ["filterPipeChange"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MicroserviceListComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-microservice-list', template: "<c8y-title>{{ 'Microservices' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-atom'\"\n [label]=\"'Ecosystem' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'microchip'\"\n [label]=\"'Microservices' | translate\"\n [path]=\"'ecosystem/microservice/microservices'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<ng-container *c8yIfAllowed=\"['ROLE_APPLICATION_MANAGEMENT_ADMIN']\">\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n *ngIf=\"isMicroserviceHostingAllowed$ | async\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add microservice' | translate }}\"\n (click)=\"addMicroservice()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add microservice' | translate }}\n </button>\n </c8y-action-bar-item>\n</ng-container>\n\n<c8y-help src=\"/docs/standard-tenant/ecosystem/#managing-microservices\"></c8y-help>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload$.next()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\">\n <c8y-list-filters\n *ngIf=\"microservices$ | async\"\n (filterPipeChange)=\"setFilterPipe($event)\"\n [packageAvailabilities]=\"packageAvailabilities\"\n ></c8y-list-filters>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form hidden-xs\"\n>\n <c8y-list-display-switch\n (onListClassChange)=\"listClass = $event\"\n [listLength]=\"(microservices$ | async)?.length\"\n ></c8y-list-display-switch>\n</c8y-action-bar-item>\n\n<div\n class=\"c8y-empty-state text-center\"\n *ngIf=\"(microservices$ | async)?.length === 0\"\n>\n <h1 class=\"c8y-icon c8y-icon-modules c8y-icon-duocolor\"></h1>\n <h3 translate>No microservices to display.</h3>\n <p translate>Add your first microservice by clicking below.</p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add microservice' | translate }}\"\n (click)=\"addMicroservice()\"\n >\n {{ 'Add microservice' | translate }}\n </button>\n </p>\n</div>\n\n<div\n class=\"card-group\"\n [ngClass]=\"listClass\"\n>\n <div\n class=\"page-sticky-header hidden-xs d-flex\"\n *ngIf=\"(microservices$ | async)?.length > 0\"\n >\n <div class=\"card-block card-column-40\">\n <div class=\"card-appicon p-l-32 p-r-16 m-r-0 m-l-4\"></div>\n {{ 'Microservice' | translate }}\n </div>\n <div class=\"card-block p-0 card-column-80 m-r-40\">\n <div class=\"card-block card-column-80\">{{ 'Description' | translate }}</div>\n <div class=\"card-block card-column-20\">{{ 'Type' | translate }}</div>\n <div class=\"card-block card-column-20\"></div>\n </div>\n </div>\n <div\n class=\"col-xs-12 col-sm-4 col-md-3\"\n *ngFor=\"let microservice of filteredMicroservices$ | async\"\n >\n <c8y-application-card\n class=\"d-contents\"\n (onAppDeleted)=\"loadMicroservices()\"\n [app]=\"microservice\"\n ></c8y-application-card>\n </div>\n</div>\n\n<c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No matching microservices.' | translate\"\n [subtitle]=\"'Refine your search terms and/or the filters' | translate\"\n *ngIf=\"(microservices$ | async)?.length > 0 && (filteredMicroservices$ | async)?.length === 0\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Reset filters' | translate }}\"\n type=\"button\"\n (click)=\"resetFilters()\"\n >\n {{ 'Reset filters' | translate }}\n </button>\n</c8y-ui-empty-state>\n" }]
}], ctorParameters: () => [{ type: i1.EcosystemService }, { type: i2.WizardModalService }, { type: i0.ChangeDetectorRef }], propDecorators: { filtersComponent: [{
type: ViewChild,
args: [ListFiltersComponent]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZWNvc3lzdGVtL21pY3Jvc2VydmljZXMvbWljcm9zZXJ2aWNlLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZWNvc3lzdGVtL21pY3Jvc2VydmljZXMvbWljcm9zZXJ2aWNlLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsU0FBUyxFQUNULGdCQUFnQixFQUNoQixnQkFBZ0IsRUFHaEIsb0JBQW9CLEVBRXJCLE1BQU0sc0NBQXNDLENBQUM7Ozs7O0FBTTlDLE1BQU0sT0FBTyx5QkFBeUI7SUEwQnBDLFlBQ1UsZ0JBQWtDLEVBQ2xDLGtCQUFzQyxFQUN0QyxFQUFxQjtRQUZyQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUE1Qi9CLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsWUFBTyxHQUEwQixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxtQkFBYyxHQUErQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDNUQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUNsQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFDekQsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ2xCLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ25DLFlBQVksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25GLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUNuQyxXQUFXLEVBQUUsQ0FDZCxDQUFDO1FBRUYsa0NBQTZCLEdBQXdCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNwRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixFQUFFLENBQUMsRUFDckUsV0FBVyxFQUFFLENBQ2QsQ0FBQztRQUVGLDBCQUFxQixHQUE2QztZQUNoRSxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUs7WUFDMUIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1NBQ3ZCLENBQUM7SUFPQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLG1HQUFtRztRQUNuRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxZQUFZLEdBQTRCO1lBQzVDLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFBbUI7U0FDekMsQ0FBQztRQUNGLE1BQU0sWUFBWSxHQUFpQixFQUFFLFlBQVksRUFBRSxDQUFDO1FBRXBELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN0QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBZ0I7UUFDNUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLENBQUM7SUFDM0MsQ0FBQzsrR0E1RFUseUJBQXlCO21HQUF6Qix5QkFBeUIsK0dBd0J6QixvQkFBb0IsZ0RDNUNqQyxvdUhBZ0lBOzs0RkQ1R2EseUJBQXlCO2tCQUpyQyxTQUFTOytCQUNFLHVCQUF1QjtzSkEyQkEsZ0JBQWdCO3NCQUFoRCxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQXBwbGljYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBXaXphcmRNb2RhbFNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IE1vZGFsT3B0aW9ucyB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBBUFBfU1RBVEUsXG4gIEVjb3N5c3RlbVNlcnZpY2UsXG4gIEVjb3N5c3RlbVdpemFyZHMsXG4gIEZpbHRlclBpcGUsXG4gIFBhY2thZ2VGaWx0ZXJzLFxuICBMaXN0RmlsdGVyc0NvbXBvbmVudCxcbiAgRmlsdGVyYWJsZUFwcE9yUGx1Z2luXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZWNvc3lzdGVtL3NoYXJlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1taWNyb3NlcnZpY2UtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9taWNyb3NlcnZpY2UtbGlzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTWljcm9zZXJ2aWNlTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHJlbG9hZGluZyA9IGZhbHNlO1xuICByZWxvYWQkOiBCZWhhdmlvclN1YmplY3Q8dm9pZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICBtaWNyb3NlcnZpY2VzJDogT2JzZXJ2YWJsZTxJQXBwbGljYXRpb25bXT4gPSB0aGlzLnJlbG9hZCQucGlwZShcbiAgICB0YXAoKCkgPT4gKHRoaXMucmVsb2FkaW5nID0gdHJ1ZSkpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuZ2V0TWljcm9zZXJ2aWNlcygpKSxcbiAgICB0YXAobWljcm9zZXJ2aWNlcyA9PiB7XG4gICAgICBtaWNyb3NlcnZpY2VzLmZvckVhY2gobWljcm9zZXJ2aWNlID0+IHtcbiAgICAgICAgbWljcm9zZXJ2aWNlLmZpbHRlclByb3BzID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmdldEFwcEZpbHRlclByb3BzKG1pY3Jvc2VydmljZSk7XG4gICAgICB9KTtcbiAgICB9KSxcbiAgICB0YXAoKCkgPT4gKHRoaXMucmVsb2FkaW5nID0gZmFsc2UpKSxcbiAgICBzaGFyZVJlcGxheSgpXG4gICk7XG4gIGZpbHRlcmVkTWljcm9zZXJ2aWNlcyQ6IE9ic2VydmFibGU8RmlsdGVyYWJsZUFwcE9yUGx1Z2luW10+O1xuICBpc01pY3Jvc2VydmljZUhvc3RpbmdBbGxvd2VkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMucmVsb2FkJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuaXNNaWNyb3NlcnZpY2VIb3N0aW5nQWxsb3dlZCgpKSxcbiAgICBzaGFyZVJlcGxheSgpXG4gICk7XG4gIGxpc3RDbGFzczogc3RyaW5nO1xuICBwYWNrYWdlQXZhaWxhYmlsaXRpZXM6IChrZXlvZiBQYWNrYWdlRmlsdGVyc1snYXZhaWxhYmlsaXR5J10pW10gPSBbXG4gICAgQVBQX1NUQVRFLlNVQlNDUklCRUQubGFiZWwsXG4gICAgQVBQX1NUQVRFLkNVU1RPTS5sYWJlbFxuICBdO1xuICBAVmlld0NoaWxkKExpc3RGaWx0ZXJzQ29tcG9uZW50KSBmaWx0ZXJzQ29tcG9uZW50OiBMaXN0RmlsdGVyc0NvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVjb3N5c3RlbVNlcnZpY2U6IEVjb3N5c3RlbVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB3aXphcmRNb2RhbFNlcnZpY2U6IFdpemFyZE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2FkTWljcm9zZXJ2aWNlcygpO1xuICAgIC8vIG1hbnVhbGx5IHRyaWdnZXIgZGV0ZWN0aW9uIHRvIG5vdCBoYXZlIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkIGVycm9yIGluIHNwZWMgZmlsZVxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbG9hZE1pY3Jvc2VydmljZXMoKSB7XG4gICAgdGhpcy5yZWxvYWQkLm5leHQoKTtcbiAgfVxuXG4gIGFkZE1pY3Jvc2VydmljZSgpIHtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgaWQ6IEVjb3N5c3RlbVdpemFyZHMuTUlDUk9TRVJWSUNFX1VQTE9BRFxuICAgIH07XG4gICAgY29uc3QgbW9kYWxPcHRpb25zOiBNb2RhbE9wdGlvbnMgPSB7IGluaXRpYWxTdGF0ZSB9O1xuXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLndpemFyZE1vZGFsU2VydmljZS5zaG93KG1vZGFsT3B0aW9ucyk7XG4gICAgbW9kYWxSZWYuY29udGVudC5vbkNsb3NlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRNaWNyb3NlcnZpY2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRGaWx0ZXJQaXBlKHBpcGU6IEZpbHRlclBpcGUpIHtcbiAgICB0aGlzLmZpbHRlcmVkTWljcm9zZXJ2aWNlcyQgPSB0aGlzLm1pY3Jvc2VydmljZXMkLnBpcGUoc3JjID0+IHBpcGUoc3JjKSk7XG4gIH1cblxuICByZXNldEZpbHRlcnMoKSB7XG4gICAgdGhpcy5maWx0ZXJzQ29tcG9uZW50Py5yZXNldEFsbEZpbHRlcnMoKTtcbiAgfVxufVxuIiwiPGM4eS10aXRsZT57eyAnTWljcm9zZXJ2aWNlcycgfCB0cmFuc2xhdGUgfX08L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtpY29uXT1cIidjOHktYXRvbSdcIlxuICAgIFtsYWJlbF09XCInRWNvc3lzdGVtJyB8IHRyYW5zbGF0ZVwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiJ21pY3JvY2hpcCdcIlxuICAgIFtsYWJlbF09XCInTWljcm9zZXJ2aWNlcycgfCB0cmFuc2xhdGVcIlxuICAgIFtwYXRoXT1cIidlY29zeXN0ZW0vbWljcm9zZXJ2aWNlL21pY3Jvc2VydmljZXMnXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxuZy1jb250YWluZXIgKmM4eUlmQWxsb3dlZD1cIlsnUk9MRV9BUFBMSUNBVElPTl9NQU5BR0VNRU5UX0FETUlOJ11cIj5cbiAgPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgICBbcGxhY2VtZW50XT1cIidyaWdodCdcIlxuICAgIFtwcmlvcml0eV09XCIxMDBcIlxuICAgICpuZ0lmPVwiaXNNaWNyb3NlcnZpY2VIb3N0aW5nQWxsb3dlZCQgfCBhc3luY1wiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgICB0aXRsZT1cInt7ICdBZGQgbWljcm9zZXJ2aWNlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAoY2xpY2spPVwiYWRkTWljcm9zZXJ2aWNlKClcIlxuICAgID5cbiAgICAgIDxpIGM4eUljb249XCJwbHVzLWNpcmNsZVwiPjwvaT5cbiAgICAgIHt7ICdBZGQgbWljcm9zZXJ2aWNlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG48L25nLWNvbnRhaW5lcj5cblxuPGM4eS1oZWxwIHNyYz1cIi9kb2NzL3N0YW5kYXJkLXRlbmFudC9lY29zeXN0ZW0vI21hbmFnaW5nLW1pY3Jvc2VydmljZXNcIj48L2M4eS1oZWxwPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAoY2xpY2spPVwicmVsb2FkJC5uZXh0KClcIlxuICA+XG4gICAgPGlcbiAgICAgIGM4eUljb249XCJyZWZyZXNoXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2ljb24tc3Bpbic6IHJlbG9hZGluZyB9XCJcbiAgICA+PC9pPlxuICAgIHt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidsZWZ0J1wiPlxuICA8Yzh5LWxpc3QtZmlsdGVyc1xuICAgICpuZ0lmPVwibWljcm9zZXJ2aWNlcyQgfCBhc3luY1wiXG4gICAgKGZpbHRlclBpcGVDaGFuZ2UpPVwic2V0RmlsdGVyUGlwZSgkZXZlbnQpXCJcbiAgICBbcGFja2FnZUF2YWlsYWJpbGl0aWVzXT1cInBhY2thZ2VBdmFpbGFiaWxpdGllc1wiXG4gID48L2M4eS1saXN0LWZpbHRlcnM+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbiAgaXRlbUNsYXNzPVwibmF2YmFyLWZvcm0gaGlkZGVuLXhzXCJcbj5cbiAgPGM4eS1saXN0LWRpc3BsYXktc3dpdGNoXG4gICAgKG9uTGlzdENsYXNzQ2hhbmdlKT1cImxpc3RDbGFzcyA9ICRldmVudFwiXG4gICAgW2xpc3RMZW5ndGhdPVwiKG1pY3Jvc2VydmljZXMkIHwgYXN5bmMpPy5sZW5ndGhcIlxuICA+PC9jOHktbGlzdC1kaXNwbGF5LXN3aXRjaD5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdlxuICBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSB0ZXh0LWNlbnRlclwiXG4gICpuZ0lmPVwiKG1pY3Jvc2VydmljZXMkIHwgYXN5bmMpPy5sZW5ndGggPT09IDBcIlxuPlxuICA8aDEgY2xhc3M9XCJjOHktaWNvbiBjOHktaWNvbi1tb2R1bGVzIGM4eS1pY29uLWR1b2NvbG9yXCI+PC9oMT5cbiAgPGgzIHRyYW5zbGF0ZT5ObyBtaWNyb3NlcnZpY2VzIHRvIGRpc3BsYXkuPC9oMz5cbiAgPHAgdHJhbnNsYXRlPkFkZCB5b3VyIGZpcnN0IG1pY3Jvc2VydmljZSBieSBjbGlja2luZyBiZWxvdy48L3A+XG4gIDxwPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIHRpdGxlPVwie3sgJ0FkZCBtaWNyb3NlcnZpY2UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIChjbGljayk9XCJhZGRNaWNyb3NlcnZpY2UoKVwiXG4gICAgPlxuICAgICAge3sgJ0FkZCBtaWNyb3NlcnZpY2UnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gIDwvcD5cbjwvZGl2PlxuXG48ZGl2XG4gIGNsYXNzPVwiY2FyZC1ncm91cFwiXG4gIFtuZ0NsYXNzXT1cImxpc3RDbGFzc1wiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cInBhZ2Utc3RpY2t5LWhlYWRlciBoaWRkZW4teHMgZC1mbGV4XCJcbiAgICAqbmdJZj1cIihtaWNyb3NlcnZpY2VzJCB8IGFzeW5jKT8ubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBjYXJkLWNvbHVtbi00MFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYXBwaWNvbiBwLWwtMzIgcC1yLTE2IG0tci0wIG0tbC00XCI+PC9kaXY+XG4gICAgICB7eyAnTWljcm9zZXJ2aWNlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHAtMCBjYXJkLWNvbHVtbi04MCBtLXItNDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTgwXCI+e3sgJ0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgY2FyZC1jb2x1bW4tMjBcIj57eyAnVHlwZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTIwXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjb2wteHMtMTIgY29sLXNtLTQgY29sLW1kLTNcIlxuICAgICpuZ0Zvcj1cImxldCBtaWNyb3NlcnZpY2Ugb2YgZmlsdGVyZWRNaWNyb3NlcnZpY2VzJCB8IGFzeW5jXCJcbiAgPlxuICAgIDxjOHktYXBwbGljYXRpb24tY2FyZFxuICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgIChvbkFwcERlbGV0ZWQpPVwibG9hZE1pY3Jvc2VydmljZXMoKVwiXG4gICAgICBbYXBwXT1cIm1pY3Jvc2VydmljZVwiXG4gICAgPjwvYzh5LWFwcGxpY2F0aW9uLWNhcmQ+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxjOHktdWktZW1wdHktc3RhdGVcbiAgW2ljb25dPVwiJ3NlYXJjaCdcIlxuICBbdGl0bGVdPVwiJ05vIG1hdGNoaW5nIG1pY3Jvc2VydmljZXMuJyB8IHRyYW5zbGF0ZVwiXG4gIFtzdWJ0aXRsZV09XCInUmVmaW5lIHlvdXIgc2VhcmNoIHRlcm1zIGFuZC9vciB0aGUgZmlsdGVycycgfCB0cmFuc2xhdGVcIlxuICAqbmdJZj1cIihtaWNyb3NlcnZpY2VzJCB8IGFzeW5jKT8ubGVuZ3RoID4gMCAmJiAoZmlsdGVyZWRNaWNyb3NlcnZpY2VzJCB8IGFzeW5jKT8ubGVuZ3RoID09PSAwXCJcbj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICB0aXRsZT1cInt7ICdSZXNldCBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cInJlc2V0RmlsdGVycygpXCJcbiAgPlxuICAgIHt7ICdSZXNldCBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuIl19