@vendasta/store
Version:
Components and data for Store
169 lines • 33.2 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { BillingService } from '@vendasta/billing';
import { FeatureFlagService } from '@vendasta/partner';
import { EditionsService, Release } from '@vendasta/marketplace-apps/v1';
import { SnackbarService } from '@vendasta/galaxy/snackbar-service';
import { AppDataService, GetMultiAppRequest, PartnerApiService, } from '@vendasta/marketplace-apps';
import { Addon, AddonService, CurrenciesCurrency as Currency, ENUM_TO_LMI_ARRAY, FrequenciesFrequency as Frequency, StoreService, } from '@vendasta/marketplace-packages';
import { combineLatest, of } from 'rxjs';
import { catchError, map, shareReplay, switchMap } from 'rxjs/operators';
import { MarketingType } from '../product-details-v2/product-details-v2.interface';
import { Product } from '../shared/product';
import { HeaderActionType } from '../store-item';
import { convertPackageFrequencyToGalaxyFrequency, convertPackagesCurrencyToString } from '../utils/billing-utils';
import * as i0 from "@angular/core";
import * as i1 from "@vendasta/marketplace-apps";
import * as i2 from "@vendasta/marketplace-packages";
import * as i3 from "@vendasta/billing";
import * as i4 from "@vendasta/marketplace-apps/v1";
import * as i5 from "@vendasta/galaxy/snackbar-service";
import * as i6 from "@ngx-translate/core";
import * as i7 from "@vendasta/partner";
import * as i8 from "../product-details-v2/product-details-v2.component";
import * as i9 from "@angular/common";
const SM_HAS_UWM_EDITION = 'sm_has_uwm_edition';
const UWM_ONLY_EDITION_IDS = ['SM:EDITION-WF4L747L'];
export class MarketplaceProductComponent {
constructor(partnerApiService, appDataService, storeService, billingService, editionsService, addonsService, snackbarService, translate, featureFlagService) {
this.partnerApiService = partnerApiService;
this.appDataService = appDataService;
this.storeService = storeService;
this.billingService = billingService;
this.editionsService = editionsService;
this.addonsService = addonsService;
this.snackbarService = snackbarService;
this.translate = translate;
this.featureFlagService = featureFlagService;
this.headerActionClick = new EventEmitter();
this.addonClick = new EventEmitter();
this.editionActionClick = new EventEmitter();
this.marketingType = MarketingType;
this.isEditionActionUsed = false;
}
ngOnInit() {
this.featureFlags$ = this.featureFlagService.batchGetStatus(this.partnerId, this.marketId, [SM_HAS_UWM_EDITION]);
this.isEditionActionUsed = this.editionActionClick.observers.length > 0;
this.app$ = this.partnerApiService
.getMultiApp(new GetMultiAppRequest({
appKeys: [
{
appId: this.productId,
editionId: null,
},
],
projectionFilter: null,
partnerId: this.partnerId,
marketId: this.marketId,
}))
.pipe(catchError((err) => {
this.snackbarService.errorSnack(this.translate.instant('FRONTEND.STORE.ERROR_PRODUCT'));
return of({ apps: [] });
}), map((resp) => {
return resp?.apps[0];
}), shareReplay(1));
const addons$ = this.storeService
.listVisibleAddonsForProduct(this.partnerId, this.marketId, null, 1000, this.productId)
.pipe(map((resp) => (resp?.storeProducts || []).map((sp) => this.convertStoreProductToAddon(this.productId, sp))));
this.product$ = combineLatest([this.app$, addons$]).pipe(map(([app, addons]) => this.convertAppToProduct(app, addons)));
this.appData$ = this.app$.pipe(switchMap((app) => {
return this.appDataService.getMultiAppData('', '', [app.key.appId]);
}), shareReplay(1));
this.pricing$ = combineLatest([this.app$, this.featureFlags$]).pipe(switchMap(([app, features]) => {
const editions = app.editionInformation?.editions || [];
if (editions.length > 0) {
if (!features[SM_HAS_UWM_EDITION]) {
UWM_ONLY_EDITION_IDS.forEach((uoe) => {
const index = editions.findIndex((ed) => ed.billingId === uoe);
if (index !== -1) {
editions.splice(index, 1);
}
});
}
return this.billingService.getMultiRetailPricing(this.partnerId, null, editions.map((ed) => ed.billingId), this.marketId);
}
else {
return this.billingService.getMultiRetailPricing(this.partnerId, null, [app.externalIdentifiers.billingId], this.marketId);
}
}));
this.editionsMarketing$ = this.app$.pipe(switchMap((app) => this.editionsService.listEditionsMarketingForApp(app.key.appId, Release.RELEASE_PUBLISH)));
}
convertAppToProduct(app, addons) {
return new Product({
partnerId: this.partnerId,
productId: this.productId,
editionId: '',
editionName: '',
name: app.sharedMarketingInformation.name,
description: app.endUserMarketingInformation.description,
tagline: app.sharedMarketingInformation.tagline,
iconUrl: app.sharedMarketingInformation.iconUrl,
headerImageUrl: app.sharedMarketingInformation.bannerImageUrl,
entryUrl: app.ssoIntegration.entryUrl,
screenshotUrls: app.endUserMarketingInformation.screenshotUrls,
pdfUploadUrls: app.endUserMarketingInformation.fileUrls,
lmiCategories: app.sharedMarketingInformation.lmiCategories
? app.sharedMarketingInformation.lmiCategories.map((lmi) => ENUM_TO_LMI_ARRAY[lmi.valueOf()].name)
: [],
keySellingPoints: app.endUserMarketingInformation.keySellingPoints,
faqs: app.endUserMarketingInformation.faqs,
needHelp: '',
wholesalePrice: 0,
setupFee: 0,
usesCustomPricing: false,
currency: '',
billingFrequency: 'monthly',
billingId: app.externalIdentifiers.billingId,
isArchived: false,
isSuspended: false,
addons: addons,
files: app.endUserMarketingInformation.fileUrls,
restrictions: { country: app.activationInformation.countryRestrictions },
trialConfiguration: app.trialConfiguration,
videos: app.endUserMarketingInformation.videos,
// current hack to beat the shouldContactSales class method of Pricing
pricing: { prices: [{ price: '1111' }] },
});
}
convertStoreProductToAddon(appId, storeProduct) {
const pricing = storeProduct.pricing?.prices?.length > 0 ? storeProduct.pricing?.prices[0] : null;
return new Addon({
appId: appId,
addonId: storeProduct.appId,
title: storeProduct.name,
icon: storeProduct.iconUrl,
price: pricing?.price || 0,
currency: convertPackagesCurrencyToString(storeProduct.pricing?.currency || Currency.USD),
billingFrequency: convertPackageFrequencyToGalaxyFrequency(pricing?.frequency || Frequency.MONTHLY),
});
}
handleHeaderButtonClick() {
this.headerActionClick.emit();
}
handleAddonClick(addonId) {
this.addonClick.emit(addonId);
}
}
MarketplaceProductComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MarketplaceProductComponent, deps: [{ token: i1.PartnerApiService }, { token: i1.AppDataService }, { token: i2.StoreService }, { token: i3.BillingService }, { token: i4.EditionsService }, { token: i2.AddonService }, { token: i5.SnackbarService }, { token: i6.TranslateService }, { token: i7.FeatureFlagService }], target: i0.ɵɵFactoryTarget.Component });
MarketplaceProductComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: MarketplaceProductComponent, selector: "marketplace-product", inputs: { productId: "productId", partnerId: "partnerId", marketId: "marketId", headerActionType: "headerActionType", productDependenciesFeatureFlag: "productDependenciesFeatureFlag" }, outputs: { headerActionClick: "headerActionClick", addonClick: "addonClick", editionActionClick: "editionActionClick" }, ngImport: i0, template: "<ng-container *ngIf=\"pricing$ | async as pricing\">\n <ng-container *ngIf=\"product$ | async as product\">\n <ng-container *ngIf=\"appData$ | async as appData\">\n <app-product-details-v2\n [product]=\"product\"\n [partnerId]=\"partnerId\"\n [appTags]=\"appData\"\n [marketingType]=\"marketingType.EndUser\"\n [billingPrice]=\"pricing\"\n [editionsMarketing]=\"editionsMarketing$ | async\"\n [headerActionType]=\"headerActionType\"\n [isEditionActionUsed]=\"isEditionActionUsed\"\n [productDependenciesFeatureFlag]=\"productDependenciesFeatureFlag\"\n (headerActionClick)=\"handleHeaderButtonClick()\"\n (addonSelected)=\"handleAddonClick($event)\"\n (editionActionClick)=\"editionActionClick.emit($event)\"\n ></app-product-details-v2>\n </ng-container>\n </ng-container>\n</ng-container>\n", styles: [":host{display:block}\n"], components: [{ type: i8.VaProductDetailsV2Component, selector: "app-product-details-v2", inputs: ["product", "partnerId", "parentProduct", "appTags", "businessCountryCode", "marketingType", "billingPrice", "marketplaceCost", "editionsMarketing", "editionOrder", "headerActionType", "isEditionActionUsed", "productDependenciesFeatureFlag"], outputs: ["headerActionClick", "addonSelected", "contactActionClick", "editionActionClick"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i9.AsyncPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MarketplaceProductComponent, decorators: [{
type: Component,
args: [{ selector: 'marketplace-product', template: "<ng-container *ngIf=\"pricing$ | async as pricing\">\n <ng-container *ngIf=\"product$ | async as product\">\n <ng-container *ngIf=\"appData$ | async as appData\">\n <app-product-details-v2\n [product]=\"product\"\n [partnerId]=\"partnerId\"\n [appTags]=\"appData\"\n [marketingType]=\"marketingType.EndUser\"\n [billingPrice]=\"pricing\"\n [editionsMarketing]=\"editionsMarketing$ | async\"\n [headerActionType]=\"headerActionType\"\n [isEditionActionUsed]=\"isEditionActionUsed\"\n [productDependenciesFeatureFlag]=\"productDependenciesFeatureFlag\"\n (headerActionClick)=\"handleHeaderButtonClick()\"\n (addonSelected)=\"handleAddonClick($event)\"\n (editionActionClick)=\"editionActionClick.emit($event)\"\n ></app-product-details-v2>\n </ng-container>\n </ng-container>\n</ng-container>\n", styles: [":host{display:block}\n"] }]
}], ctorParameters: function () { return [{ type: i1.PartnerApiService }, { type: i1.AppDataService }, { type: i2.StoreService }, { type: i3.BillingService }, { type: i4.EditionsService }, { type: i2.AddonService }, { type: i5.SnackbarService }, { type: i6.TranslateService }, { type: i7.FeatureFlagService }]; }, propDecorators: { productId: [{
type: Input
}], partnerId: [{
type: Input
}], marketId: [{
type: Input
}], headerActionType: [{
type: Input
}], productDependenciesFeatureFlag: [{
type: Input
}], headerActionClick: [{
type: Output
}], addonClick: [{
type: Output
}], editionActionClick: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0cGxhY2UtcHJvZHVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3N0b3JlL3NyYy9saWIvbWFya2V0cGxhY2UtcHJvZHVjdC9tYXJrZXRwbGFjZS1wcm9kdWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9tYXJrZXRwbGFjZS1wcm9kdWN0L21hcmtldHBsYWNlLXByb2R1Y3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFrQixNQUFNLG1CQUFtQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBd0IsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBRUwsY0FBYyxFQUNkLGtCQUFrQixFQUVsQixpQkFBaUIsR0FDbEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsS0FBSyxFQUNMLFlBQVksRUFDWixrQkFBa0IsSUFBSSxRQUFRLEVBQzlCLGlCQUFpQixFQUNqQixvQkFBb0IsSUFBSSxTQUFTLEVBRWpDLFlBQVksR0FDYixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFB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QU8sQ0FBQztTQUNwRyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBZTtRQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDOzt3SEF2S1UsMkJBQTJCOzRHQUEzQiwyQkFBMkIsOFdDeEN4QyxnNEJBb0JBOzJGRG9CYSwyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0UscUJBQXFCO29WQUt0QixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csOEJBQThCO3NCQUF0QyxLQUFLO2dCQUVJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UsIFByb2R1Y3RQcmljaW5nIH0gZnJvbSAnQHZlbmRhc3RhL2JpbGxpbmcnO1xuaW1wb3J0IHsgRmVhdHVyZUZsYWdTZXJ2aWNlIH0gZnJvbSAnQHZlbmRhc3RhL3BhcnRuZXInO1xuaW1wb3J0IHsgQXBwRWRpdGlvbnNNYXJrZXRpbmcsIEVkaXRpb25zU2VydmljZSwgUmVsZWFzZSB9IGZyb20gJ0B2ZW5kYXN0YS9tYXJrZXRwbGFjZS1hcHBzL3YxJztcbmltcG9ydCB7IFNuYWNrYmFyU2VydmljZSB9IGZyb20gJ0B2ZW5kYXN0YS9nYWxheHkvc25hY2tiYXItc2VydmljZSc7XG5pbXBvcnQge1xuICBBcHAsXG4gIEFwcERhdGFTZXJ2aWNlLFxuICBHZXRNdWx0aUFwcFJlcXVlc3QsXG4gIEdldE11bHRpQXBwUmVzcG9uc2UsXG4gIFBhcnRuZXJBcGlTZXJ2aWNlLFxufSBmcm9tICdAdmVuZGFzdGEvbWFya2V0cGxhY2UtYXBwcyc7XG5pbXBvcnQge1xuICBBZGRvbixcbiAgQWRkb25TZXJ2aWNlLFxuICBDdXJyZW5jaWVzQ3VycmVuY3kgYXMgQ3VycmVuY3ksXG4gIEVOVU1fVE9fTE1JX0FSUkFZLFxuICBGcmVxdWVuY2llc0ZyZXF1ZW5jeSBhcyBGcmVxdWVuY3ksXG4gIFN0b3JlUHJvZHVjdCxcbiAgU3RvcmVTZXJ2aWNlLFxufSBmcm9tICdAdmVuZGFzdGEvbWFya2V0cGxhY2UtcGFja2FnZXMnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVkaXRpb25BY3Rpb25DbGlja0V2ZW50IH0gZnJvbSAnLi4vcHJvZHVjdC1kZXRhaWxzLXYyL3Byb2R1Y3QtZGV0YWlscy12Mi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWFya2V0aW5nVHlwZSB9IGZyb20gJy4uL3Byb2R1Y3QtZGV0YWlscy12Mi9wcm9kdWN0LWRldGFpbHMtdjIuaW50ZXJmYWNlJztcbmltcG9ydCB7IE1hcmtldHBsYWNlQXBwRGF0YSB9IGZyb20gJy4uL3NoYXJlZC9tYXJrZXRwbGFjZS1hcHAtZGF0YSc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vc2hhcmVkL3Byb2R1Y3QnO1xuaW1wb3J0IHsgSGVhZGVyQWN0aW9uVHlwZSB9IGZyb20gJy4uL3N0b3JlLWl0ZW0nO1xuaW1wb3J0IHsgY29udmVydFBhY2thZ2VGcmVxdWVuY3lUb0dhbGF4eUZyZXF1ZW5jeSwgY29udmVydFBhY2thZ2VzQ3VycmVuY3lUb1N0cmluZyB9IGZyb20gJy4uL3V0aWxzL2JpbGxpbmctdXRpbHMnO1xuXG5jb25zdCBTTV9IQVNfVVdNX0VESVRJT04gPSAnc21faGFzX3V3bV9lZGl0aW9uJztcbmNvbnN0IFVXTV9PTkxZX0VESVRJT05fSURTID0gWydTTTpFRElUSU9OLVdGNEw3NDdMJ107XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hcmtldHBsYWNlLXByb2R1Y3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2V0cGxhY2UtcHJvZHVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hcmtldHBsYWNlLXByb2R1Y3QuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTWFya2V0cGxhY2VQcm9kdWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcHJvZHVjdElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhcnRuZXJJZDogc3RyaW5nO1xuICBASW5wdXQoKSBtYXJrZXRJZDogc3RyaW5nO1xuICBASW5wdXQoKSBoZWFkZXJBY3Rpb25UeXBlOiBIZWFkZXJBY3Rpb25UeXBlO1xuICBASW5wdXQoKSBwcm9kdWN0RGVwZW5kZW5jaWVzRmVhdHVyZUZsYWc6IHN0cmluZztcblxuICBAT3V0cHV0KCkgaGVhZGVyQWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gIEBPdXRwdXQoKSBhZGRvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBlZGl0aW9uQWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEVkaXRpb25BY3Rpb25DbGlja0V2ZW50PigpO1xuXG4gIGFwcCQ6IE9ic2VydmFibGU8QXBwPjtcbiAgcHJvZHVjdCQ6IE9ic2VydmFibGU8UHJvZHVjdD47XG4gIGFwcERhdGEkOiBPYnNlcnZhYmxlPE1hcmtldHBsYWNlQXBwRGF0YVtdPjtcbiAgcHJpY2luZyQ6IE9ic2VydmFibGU8eyBbc2t1OiBzdHJpbmddOiBQcm9kdWN0UHJpY2luZyB9PjtcbiAgZWRpdGlvbnNNYXJrZXRpbmckOiBPYnNlcnZhYmxlPEFwcEVkaXRpb25zTWFya2V0aW5nW10+O1xuICBmZWF0dXJlRmxhZ3MkOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgbWFya2V0aW5nVHlwZSA9IE1hcmtldGluZ1R5cGU7XG4gIGlzRWRpdGlvbkFjdGlvblVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcnRuZXJBcGlTZXJ2aWNlOiBQYXJ0bmVyQXBpU2VydmljZSxcbiAgICBwcml2YXRlIGFwcERhdGFTZXJ2aWNlOiBBcHBEYXRhU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JlU2VydmljZTogU3RvcmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWRpdGlvbnNTZXJ2aWNlOiBFZGl0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhZGRvbnNTZXJ2aWNlOiBBZGRvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzbmFja2JhclNlcnZpY2U6IFNuYWNrYmFyU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZlYXR1cmVGbGFnU2VydmljZTogRmVhdHVyZUZsYWdTZXJ2aWNlLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mZWF0dXJlRmxhZ3MkID0gdGhpcy5mZWF0dXJlRmxhZ1NlcnZpY2UuYmF0Y2hHZXRTdGF0dXModGhpcy5wYXJ0bmVySWQsIHRoaXMubWFya2V0SWQsIFtTTV9IQVNfVVdNX0VESVRJT05dKTtcbiAgICB0aGlzLmlzRWRpdGlvbkFjdGlvblVzZWQgPSB0aGlzLmVkaXRpb25BY3Rpb25DbGljay5vYnNlcnZlcnMubGVuZ3RoID4gMDtcbiAgICB0aGlzLmFwcCQgPSB0aGlzLnBhcnRuZXJBcGlTZXJ2aWNlXG4gICAgICAuZ2V0TXVsdGlBcHAoXG4gICAgICAgIG5ldyBHZXRNdWx0aUFwcFJlcXVlc3Qoe1xuICAgICAgICAgIGFwcEtleXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXBwSWQ6IHRoaXMucHJvZHVjdElkLFxuICAgICAgICAgICAgICBlZGl0aW9uSWQ6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcHJvamVjdGlvbkZpbHRlcjogbnVsbCxcbiAgICAgICAgICBwYXJ0bmVySWQ6IHRoaXMucGFydG5lcklkLFxuICAgICAgICAgIG1hcmtldElkOiB0aGlzLm1hcmtldElkLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5zbmFja2JhclNlcnZpY2UuZXJyb3JTbmFjayh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdGUk9OVEVORC5TVE9SRS5FUlJPUl9QUk9EVUNUJykpO1xuICAgICAgICAgIHJldHVybiBvZih7IGFwcHM6IFtdIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgbWFwKChyZXNwOiBHZXRNdWx0aUFwcFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc3A/LmFwcHNbMF07XG4gICAgICAgIH0pLFxuICAgICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICAgICk7XG4gICAgY29uc3QgYWRkb25zJCA9IHRoaXMuc3RvcmVTZXJ2aWNlXG4gICAgICAubGlzdFZpc2libGVBZGRvbnNGb3JQcm9kdWN0KHRoaXMucGFydG5lcklkLCB0aGlzLm1hcmtldElkLCBudWxsLCAxMDAwLCB0aGlzLnByb2R1Y3RJZClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3ApID0+IChyZXNwPy5zdG9yZVByb2R1Y3RzIHx8IFtdKS5tYXAoKHNwKSA9PiB0aGlzLmNvbnZlcnRTdG9yZVByb2R1Y3RUb0FkZG9uKHRoaXMucHJvZHVjdElkLCBzcCkpKSxcbiAgICAgICk7XG4gICAgdGhpcy5wcm9kdWN0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuYXBwJCwgYWRkb25zJF0pLnBpcGUoXG4gICAgICBtYXAoKFthcHAsIGFkZG9uc10pID0+IHRoaXMuY29udmVydEFwcFRvUHJvZHVjdChhcHAsIGFkZG9ucykpLFxuICAgICk7XG5cbiAgICB0aGlzLmFwcERhdGEkID0gdGhpcy5hcHAkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGFwcCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBEYXRhU2VydmljZS5nZXRNdWx0aUFwcERhdGEoJycsICcnLCBbYXBwLmtleS5hcHBJZF0pO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICApO1xuXG4gICAgdGhpcy5wcmljaW5nJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuYXBwJCwgdGhpcy5mZWF0dXJlRmxhZ3MkXSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoW2FwcCwgZmVhdHVyZXNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkaXRpb25zID0gYXBwLmVkaXRpb25JbmZvcm1hdGlvbj8uZWRpdGlvbnMgfHwgW107XG4gICAgICAgIGlmIChlZGl0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKCFmZWF0dXJlc1tTTV9IQVNfVVdNX0VESVRJT05dKSB7XG4gICAgICAgICAgICBVV01fT05MWV9FRElUSU9OX0lEUy5mb3JFYWNoKCh1b2UpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBlZGl0aW9ucy5maW5kSW5kZXgoKGVkKSA9PiBlZC5iaWxsaW5nSWQgPT09IHVvZSk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBlZGl0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0TXVsdGlSZXRhaWxQcmljaW5nKFxuICAgICAgICAgICAgdGhpcy5wYXJ0bmVySWQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgZWRpdGlvbnMubWFwKChlZCkgPT4gZWQuYmlsbGluZ0lkKSxcbiAgICAgICAgICAgIHRoaXMubWFya2V0SWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5iaWxsaW5nU2VydmljZS5nZXRNdWx0aVJldGFpbFByaWNpbmcoXG4gICAgICAgICAgICB0aGlzLnBhcnRuZXJJZCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBbYXBwLmV4dGVybmFsSWRlbnRpZmllcnMuYmlsbGluZ0lkXSxcbiAgICAgICAgICAgIHRoaXMubWFya2V0SWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMuZWRpdGlvbnNNYXJrZXRpbmckID0gdGhpcy5hcHAkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGFwcCkgPT4gdGhpcy5lZGl0aW9uc1NlcnZpY2UubGlzdEVkaXRpb25zTWFya2V0aW5nRm9yQXBwKGFwcC5rZXkuYXBwSWQsIFJlbGVhc2UuUkVMRUFTRV9QVUJMSVNIKSksXG4gICAgKTtcbiAgfVxuXG4gIGNvbnZlcnRBcHBUb1Byb2R1Y3QoYXBwOiBBcHAsIGFkZG9uczogQWRkb25bXSk6IFByb2R1Y3Qge1xuICAgIHJldHVybiBuZXcgUHJvZHVjdCh7XG4gICAgICBwYXJ0bmVySWQ6IHRoaXMucGFydG5lcklkLFxuICAgICAgcHJvZHVjdElkOiB0aGlzLnByb2R1Y3RJZCxcbiAgICAgIGVkaXRpb25JZDogJycsXG4gICAgICBlZGl0aW9uTmFtZTogJycsXG4gICAgICBuYW1lOiBhcHAuc2hhcmVkTWFya2V0aW5nSW5mb3JtYXRpb24ubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBhcHAuZW5kVXNlck1hcmtldGluZ0luZm9ybWF0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgdGFnbGluZTogYXBwLnNoYXJlZE1hcmtldGluZ0luZm9ybWF0aW9uLnRhZ2xpbmUsXG4gICAgICBpY29uVXJsOiBhcHAuc2hhcmVkTWFya2V0aW5nSW5mb3JtYXRpb24uaWNvblVybCxcbiAgICAgIGhlYWRlckltYWdlVXJsOiBhcHAuc2hhcmVkTWFya2V0aW5nSW5mb3JtYXRpb24uYmFubmVySW1hZ2VVcmwsXG4gICAgICBlbnRyeVVybDogYXBwLnNzb0ludGVncmF0aW9uLmVudHJ5VXJsLFxuICAgICAgc2NyZWVuc2hvdFVybHM6IGFwcC5lbmRVc2VyTWFya2V0aW5nSW5mb3JtYXRpb24uc2NyZWVuc2hvdFVybHMsXG4gICAgICBwZGZVcGxvYWRVcmxzOiBhcHAuZW5kVXNlck1hcmtldGluZ0luZm9ybWF0aW9uLmZpbGVVcmxzLCAvLz8/XG4gICAgICBsbWlDYXRlZ29yaWVzOiBhcHAuc2hhcmVkTWFya2V0aW5nSW5mb3JtYXRpb24ubG1pQ2F0ZWdvcmllc1xuICAgICAgICA/IGFwcC5zaGFyZWRNYXJrZXRpbmdJbmZvcm1hdGlvbi5sbWlDYXRlZ29yaWVzLm1hcCgobG1pKSA9PiBFTlVNX1RPX0xNSV9BUlJBWVtsbWkudmFsdWVPZigpXS5uYW1lKVxuICAgICAgICA6IFtdLFxuICAgICAga2V5U2VsbGluZ1BvaW50czogYXBwLmVuZFVzZXJNYXJrZXRpbmdJbmZvcm1hdGlvbi5rZXlTZWxsaW5nUG9pbnRzLFxuICAgICAgZmFxczogYXBwLmVuZFVzZXJNYXJrZXRpbmdJbmZvcm1hdGlvbi5mYXFzLFxuICAgICAgbmVlZEhlbHA6ICcnLFxuICAgICAgd2hvbGVzYWxlUHJpY2U6IDAsXG4gICAgICBzZXR1cEZlZTogMCxcbiAgICAgIHVzZXNDdXN0b21QcmljaW5nOiBmYWxzZSxcbiAgICAgIGN1cnJlbmN5OiAnJyxcbiAgICAgIGJpbGxpbmdGcmVxdWVuY3k6ICdtb250aGx5JyxcbiAgICAgIGJpbGxpbmdJZDogYXBwLmV4dGVybmFsSWRlbnRpZmllcnMuYmlsbGluZ0lkLFxuICAgICAgaXNBcmNoaXZlZDogZmFsc2UsXG4gICAgICBpc1N1c3BlbmRlZDogZmFsc2UsXG4gICAgICBhZGRvbnM6IGFkZG9ucyxcbiAgICAgIGZpbGVzOiBhcHAuZW5kVXNlck1hcmtldGluZ0luZm9ybWF0aW9uLmZpbGVVcmxzLCAvLz9cbiAgICAgIHJlc3RyaWN0aW9uczogeyBjb3VudHJ5OiBhcHAuYWN0aXZhdGlvbkluZm9ybWF0aW9uLmNvdW50cnlSZXN0cmljdGlvbnMgfSxcbiAgICAgIHRyaWFsQ29uZmlndXJhdGlvbjogYXBwLnRyaWFsQ29uZmlndXJhdGlvbixcbiAgICAgIHZpZGVvczogYXBwLmVuZFVzZXJNYXJrZXRpbmdJbmZvcm1hdGlvbi52aWRlb3MsXG4gICAgICAvLyBjdXJyZW50IGhhY2sgdG8gYmVhdCB0aGUgc2hvdWxkQ29udGFjdFNhbGVzIGNsYXNzIG1ldGhvZCBvZiBQcmljaW5nXG4gICAgICBwcmljaW5nOiB7IHByaWNlczogW3sgcHJpY2U6ICcxMTExJyB9XSB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29udmVydFN0b3JlUHJvZHVjdFRvQWRkb24oYXBwSWQ6IHN0cmluZywgc3RvcmVQcm9kdWN0OiBTdG9yZVByb2R1Y3QpOiBBZGRvbiB7XG4gICAgY29uc3QgcHJpY2luZyA9IHN0b3JlUHJvZHVjdC5wcmljaW5nPy5wcmljZXM/Lmxlbmd0aCA+IDAgPyBzdG9yZVByb2R1Y3QucHJpY2luZz8ucHJpY2VzWzBdIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IEFkZG9uKHtcbiAgICAgIGFwcElkOiBhcHBJZCxcbiAgICAgIGFkZG9uSWQ6IHN0b3JlUHJvZHVjdC5hcHBJZCxcbiAgICAgIHRpdGxlOiBzdG9yZVByb2R1Y3QubmFtZSxcbiAgICAgIGljb246IHN0b3JlUHJvZHVjdC5pY29uVXJsLFxuICAgICAgcHJpY2U6IHByaWNpbmc/LnByaWNlIHx8IDAsXG4gICAgICBjdXJyZW5jeTogY29udmVydFBhY2thZ2VzQ3VycmVuY3lUb1N0cmluZyhzdG9yZVByb2R1Y3QucHJpY2luZz8uY3VycmVuY3kgfHwgQ3VycmVuY3kuVVNEKSxcbiAgICAgIGJpbGxpbmdGcmVxdWVuY3k6IGNvbnZlcnRQYWNrYWdlRnJlcXVlbmN5VG9HYWxheHlGcmVxdWVuY3kocHJpY2luZz8uZnJlcXVlbmN5IHx8IEZyZXF1ZW5jeS5NT05USExZKSxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUhlYWRlckJ1dHRvbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuaGVhZGVyQWN0aW9uQ2xpY2suZW1pdCgpO1xuICB9XG5cbiAgaGFuZGxlQWRkb25DbGljayhhZGRvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmFkZG9uQ2xpY2suZW1pdChhZGRvbklkKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInByaWNpbmckIHwgYXN5bmMgYXMgcHJpY2luZ1wiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvZHVjdCQgfCBhc3luYyBhcyBwcm9kdWN0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFwcERhdGEkIHwgYXN5bmMgYXMgYXBwRGF0YVwiPlxuICAgICAgPGFwcC1wcm9kdWN0LWRldGFpbHMtdjJcbiAgICAgICAgW3Byb2R1Y3RdPVwicHJvZHVjdFwiXG4gICAgICAgIFtwYXJ0bmVySWRdPVwicGFydG5lcklkXCJcbiAgICAgICAgW2FwcFRhZ3NdPVwiYXBwRGF0YVwiXG4gICAgICAgIFttYXJrZXRpbmdUeXBlXT1cIm1hcmtldGluZ1R5cGUuRW5kVXNlclwiXG4gICAgICAgIFtiaWxsaW5nUHJpY2VdPVwicHJpY2luZ1wiXG4gICAgICAgIFtlZGl0aW9uc01hcmtldGluZ109XCJlZGl0aW9uc01hcmtldGluZyQgfCBhc3luY1wiXG4gICAgICAgIFtoZWFkZXJBY3Rpb25UeXBlXT1cImhlYWRlckFjdGlvblR5cGVcIlxuICAgICAgICBbaXNFZGl0aW9uQWN0aW9uVXNlZF09XCJpc0VkaXRpb25BY3Rpb25Vc2VkXCJcbiAgICAgICAgW3Byb2R1Y3REZXBlbmRlbmNpZXNGZWF0dXJlRmxhZ109XCJwcm9kdWN0RGVwZW5kZW5jaWVzRmVhdHVyZUZsYWdcIlxuICAgICAgICAoaGVhZGVyQWN0aW9uQ2xpY2spPVwiaGFuZGxlSGVhZGVyQnV0dG9uQ2xpY2soKVwiXG4gICAgICAgIChhZGRvblNlbGVjdGVkKT1cImhhbmRsZUFkZG9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChlZGl0aW9uQWN0aW9uQ2xpY2spPVwiZWRpdGlvbkFjdGlvbkNsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICA+PC9hcHAtcHJvZHVjdC1kZXRhaWxzLXYyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19