UNPKG

@vendasta/store

Version:

Components and data for Store

98 lines 31.8 kB
import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { BillingService } from '@vendasta/billing'; import { ProductAnalyticsService } from '@vendasta/product-analytics'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { map, shareReplay } from 'rxjs/operators'; import { convertBillingFrequencyToGalaxyFrequency } from '../../utils/billing-utils'; import { ResponseType } from './edition-selector.types'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/dialog"; import * as i2 from "@vendasta/billing"; import * as i3 from "@vendasta/product-analytics"; import * as i4 from "@angular/material/button"; import * as i5 from "@angular/material/icon"; import * as i6 from "@vendasta/galaxy/frequency"; import * as i7 from "@angular/material/divider"; import * as i8 from "@angular/common"; import * as i9 from "@angular/flex-layout/extended"; import * as i10 from "@vendasta/uikit"; import * as i11 from "@ngx-translate/core"; import * as i12 from "@vendasta/galaxy/pipes"; export const windowSize = 4; export class EditionSelectorComponent { constructor(dialogRef, billingService, data, snowplowService) { this.dialogRef = dialogRef; this.billingService = billingService; this.data = data; this.snowplowService = snowplowService; this.window$$ = new BehaviorSubject({ leftIndex: 0, rightIndex: windowSize - 1 }); this.windowSize = windowSize; const pricing$ = this.billingService .getMultiRetailPricing(this.data.partnerId, null, this.data.editionsMarketing.map((e) => e.billingId), this.data.marketId) .pipe(shareReplay(1)); this.state$ = combineLatest([pricing$, this.window$$]).pipe(map(([resp, window]) => { const allEditions = []; this.data.editionsMarketing.forEach((e) => { const pricing = resp[e.billingId]; allEditions.push({ editionId: e.editionId, name: e.name, price: pricing?.pricingRules?.length > 0 ? pricing.pricingRules[0].price : 0, currency: pricing?.currency, frequency: convertBillingFrequencyToGalaxyFrequency(pricing?.frequency), }); }); return { editions: allEditions, window: window, }; })); } shiftCarousel(window, direction) { let scrollTo; let block; const leftIndex = window.leftIndex + direction; const rightIndex = window.rightIndex + direction; if (direction < 0) { scrollTo = leftIndex; block = 'start'; } else if (direction > 0) { scrollTo = rightIndex; block = 'end'; } if (leftIndex < 0 || rightIndex > this.data.editionsMarketing.length - 1) { return; } document.getElementById(`carousel-col-${scrollTo}`).scrollIntoView({ behavior: 'smooth', block: block, }); this.window$$.next({ leftIndex: leftIndex, rightIndex: rightIndex }); } selectEdition(editionId) { const property = `${this.data.productId}:${editionId}`; this.snowplowService.trackClick('store:edition-selector', `add-editioned-product`, property); this.dialogRef.close({ productId: this.data.productId, editionId: editionId, type: ResponseType.EditionSelected, }); } compareEditions() { this.dialogRef.close({ type: ResponseType.CompareEditions, }); } } EditionSelectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: EditionSelectorComponent, deps: [{ token: i1.MatDialogRef }, { token: i2.BillingService }, { token: MAT_DIALOG_DATA }, { token: i3.ProductAnalyticsService }], target: i0.ɵɵFactoryTarget.Component }); EditionSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: EditionSelectorComponent, selector: "ng-component", ngImport: i0, template: "<div class=\"selector-header\">\n <h3 class=\"selector-title\" mat-dialog-title>\n {{ data.translationKeys.title | translate: data.translationArgs }}\n <button class=\"close-button\" mat-icon-button mat-dialog-close>\n <mat-icon class=\"close-icon\">close</mat-icon>\n </button>\n </h3>\n</div>\n<mat-dialog-content class=\"editions-carousel\">\n <ng-container *ngIf=\"state$ | async as state\">\n <div *ngIf=\"data.translationKeys.explanation\" class=\"selector-explanation\">\n {{ data.translationKeys.explanation | translate: data.translationArgs }}\n </div>\n <div class=\"carousel-row\">\n <div\n *ngIf=\"state.editions.length > windowSize\"\n class=\"button-placeholder left-placeholder\"\n >\n <button\n *ngIf=\"state.window.leftIndex > 0\"\n class=\"window-button\"\n mat-button\n (click)=\"shiftCarousel(state.window, -1)\"\n >\n <mat-icon class=\"shift-icon\" inline>keyboard_arrow_left</mat-icon>\n </button>\n </div>\n <div\n class=\"carousel\"\n [ngClass]=\"{\n 'scrollable-carousel': state.editions.length > windowSize\n }\"\n >\n <ng-container\n *ngFor=\"\n let edition of state.editions;\n let index = index;\n let last = last\n \"\n >\n <div\n class=\"carousel-col scrollable-carousel-col\"\n [id]=\"'carousel-col-' + index.toString()\"\n >\n <span class=\"edition-title\">\n {{ edition.name }}\n </span>\n <glxy-frequency\n class=\"edition-price\"\n [value]=\"edition.price / 100 | glxyCurrency: edition.currency\"\n [frequency]=\"edition.frequency\"\n align=\"start\"\n ></glxy-frequency>\n <div class=\"edition-button\">\n <button\n class=\"add-to-cart\"\n mat-flat-button\n color=\"primary\"\n (click)=\"selectEdition(edition.editionId)\"\n >\n {{ 'FRONTEND.STORE.ADD_TO_CART' | translate }}\n </button>\n </div>\n </div>\n <mat-divider *ngIf=\"!last\" vertical></mat-divider>\n </ng-container>\n </div>\n <div\n *ngIf=\"state.editions.length > windowSize\"\n class=\"button-placeholder right-placeholder\"\n >\n <button\n *ngIf=\"state.window.rightIndex < state.editions.length - 1\"\n class=\"window-button\"\n mat-button\n (click)=\"shiftCarousel(state.window, 1)\"\n >\n <mat-icon class=\"shift-icon\" inline>keyboard_arrow_right</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"compare-row\">\n <button mat-button color=\"primary\" (click)=\"compareEditions()\">\n {{ 'FRONTEND.STORE.EDITION_SELECTOR.COMPARE_BUTTON_LABEL' | translate }}\n </button>\n </div>\n </ng-container>\n</mat-dialog-content>\n", styles: ["::ng-deep #edition-selector-dialog.mat-dialog-container{display:flex;justify-content:center;padding:0;overflow:hidden}.selector-header{position:relative}.selector-header h3.selector-title{display:flex;flex-direction:row;padding:8px 12px;font-weight:400;font-size:16px;line-height:40px;border-bottom:1px solid #e0e0e0}.selector-header h3.selector-title button.close-button{margin-left:auto}.selector-header h3.selector-title button.close-button mat-icon.close-icon{color:#212121!important}mat-dialog-content.editions-carousel{padding:0 36px;overflow:hidden}mat-dialog-content.editions-carousel .selector-explanation{margin:0 4px 12px}mat-dialog-content.editions-carousel .edition-title{font-size:18px;vertical-align:text-top}mat-dialog-content.editions-carousel .carousel-row{display:flex;flex-direction:row;justify-content:center}mat-dialog-content.editions-carousel .carousel-row .carousel{display:flex;flex-direction:row;overflow:hidden;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col{display:flex;flex-direction:column;flex:1;padding:16px 24px}mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-title,mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-price,mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-button{padding:8px 0}mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-title{display:flex;flex-direction:column;flex:1}mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-button{width:100%;margin:0 auto}mat-dialog-content.editions-carousel .carousel-row .scrollable-carousel{min-width:50vw;max-width:50vw}mat-dialog-content.editions-carousel .carousel-row .scrollable-carousel-col{min-width:12.5vw;max-width:12.5vw}mat-dialog-content.editions-carousel button.add-to-cart{display:inline-block;width:100%;padding:0 32px;align-self:flex-end}mat-dialog-content.editions-carousel .button-placeholder{min-width:36px;max-width:36px}mat-dialog-content.editions-carousel .button-placeholder.left-placeholder{border-right:1px solid #e0e0e0}mat-dialog-content.editions-carousel .button-placeholder.right-placeholder{border-left:1px solid #e0e0e0}mat-dialog-content.editions-carousel .button-placeholder button.window-button{display:inline-block;height:100%;min-width:36px;max-width:36px;padding:0;font-size:36px}mat-dialog-content.editions-carousel .button-placeholder button.window-button mat-icon.shift-icon{color:#212121!important}mat-dialog-content.editions-carousel .compare-row{display:flex;flex-direction:row;width:100%;margin:12px;justify-content:center}\n"], components: [{ type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.GalaxyFrequencyComponent, selector: "glxy-frequency", inputs: ["value", "frequency", "form", "size", "align"] }, { type: i7.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }], directives: [{ type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.VerticalLayoutDirective, selector: "[vertical]" }], pipes: { "translate": i11.TranslatePipe, "async": i8.AsyncPipe, "glxyCurrency": i12.GalaxyCurrencyPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: EditionSelectorComponent, decorators: [{ type: Component, args: [{ template: "<div class=\"selector-header\">\n <h3 class=\"selector-title\" mat-dialog-title>\n {{ data.translationKeys.title | translate: data.translationArgs }}\n <button class=\"close-button\" mat-icon-button mat-dialog-close>\n <mat-icon class=\"close-icon\">close</mat-icon>\n </button>\n </h3>\n</div>\n<mat-dialog-content class=\"editions-carousel\">\n <ng-container *ngIf=\"state$ | async as state\">\n <div *ngIf=\"data.translationKeys.explanation\" class=\"selector-explanation\">\n {{ data.translationKeys.explanation | translate: data.translationArgs }}\n </div>\n <div class=\"carousel-row\">\n <div\n *ngIf=\"state.editions.length > windowSize\"\n class=\"button-placeholder left-placeholder\"\n >\n <button\n *ngIf=\"state.window.leftIndex > 0\"\n class=\"window-button\"\n mat-button\n (click)=\"shiftCarousel(state.window, -1)\"\n >\n <mat-icon class=\"shift-icon\" inline>keyboard_arrow_left</mat-icon>\n </button>\n </div>\n <div\n class=\"carousel\"\n [ngClass]=\"{\n 'scrollable-carousel': state.editions.length > windowSize\n }\"\n >\n <ng-container\n *ngFor=\"\n let edition of state.editions;\n let index = index;\n let last = last\n \"\n >\n <div\n class=\"carousel-col scrollable-carousel-col\"\n [id]=\"'carousel-col-' + index.toString()\"\n >\n <span class=\"edition-title\">\n {{ edition.name }}\n </span>\n <glxy-frequency\n class=\"edition-price\"\n [value]=\"edition.price / 100 | glxyCurrency: edition.currency\"\n [frequency]=\"edition.frequency\"\n align=\"start\"\n ></glxy-frequency>\n <div class=\"edition-button\">\n <button\n class=\"add-to-cart\"\n mat-flat-button\n color=\"primary\"\n (click)=\"selectEdition(edition.editionId)\"\n >\n {{ 'FRONTEND.STORE.ADD_TO_CART' | translate }}\n </button>\n </div>\n </div>\n <mat-divider *ngIf=\"!last\" vertical></mat-divider>\n </ng-container>\n </div>\n <div\n *ngIf=\"state.editions.length > windowSize\"\n class=\"button-placeholder right-placeholder\"\n >\n <button\n *ngIf=\"state.window.rightIndex < state.editions.length - 1\"\n class=\"window-button\"\n mat-button\n (click)=\"shiftCarousel(state.window, 1)\"\n >\n <mat-icon class=\"shift-icon\" inline>keyboard_arrow_right</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"compare-row\">\n <button mat-button color=\"primary\" (click)=\"compareEditions()\">\n {{ 'FRONTEND.STORE.EDITION_SELECTOR.COMPARE_BUTTON_LABEL' | translate }}\n </button>\n </div>\n </ng-container>\n</mat-dialog-content>\n", styles: ["::ng-deep #edition-selector-dialog.mat-dialog-container{display:flex;justify-content:center;padding:0;overflow:hidden}.selector-header{position:relative}.selector-header h3.selector-title{display:flex;flex-direction:row;padding:8px 12px;font-weight:400;font-size:16px;line-height:40px;border-bottom:1px solid #e0e0e0}.selector-header h3.selector-title button.close-button{margin-left:auto}.selector-header h3.selector-title button.close-button mat-icon.close-icon{color:#212121!important}mat-dialog-content.editions-carousel{padding:0 36px;overflow:hidden}mat-dialog-content.editions-carousel .selector-explanation{margin:0 4px 12px}mat-dialog-content.editions-carousel .edition-title{font-size:18px;vertical-align:text-top}mat-dialog-content.editions-carousel .carousel-row{display:flex;flex-direction:row;justify-content:center}mat-dialog-content.editions-carousel .carousel-row .carousel{display:flex;flex-direction:row;overflow:hidden;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col{display:flex;flex-direction:column;flex:1;padding:16px 24px}mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-title,mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-price,mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-button{padding:8px 0}mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-title{display:flex;flex-direction:column;flex:1}mat-dialog-content.editions-carousel .carousel-row .carousel .carousel-col .edition-button{width:100%;margin:0 auto}mat-dialog-content.editions-carousel .carousel-row .scrollable-carousel{min-width:50vw;max-width:50vw}mat-dialog-content.editions-carousel .carousel-row .scrollable-carousel-col{min-width:12.5vw;max-width:12.5vw}mat-dialog-content.editions-carousel button.add-to-cart{display:inline-block;width:100%;padding:0 32px;align-self:flex-end}mat-dialog-content.editions-carousel .button-placeholder{min-width:36px;max-width:36px}mat-dialog-content.editions-carousel .button-placeholder.left-placeholder{border-right:1px solid #e0e0e0}mat-dialog-content.editions-carousel .button-placeholder.right-placeholder{border-left:1px solid #e0e0e0}mat-dialog-content.editions-carousel .button-placeholder button.window-button{display:inline-block;height:100%;min-width:36px;max-width:36px;padding:0;font-size:36px}mat-dialog-content.editions-carousel .button-placeholder button.window-button mat-icon.shift-icon{color:#212121!important}mat-dialog-content.editions-carousel .compare-row{display:flex;flex-direction:row;width:100%;margin:12px;justify-content:center}\n"] }] }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i2.BillingService }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA] }] }, { type: i3.ProductAnalyticsService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGlvbi1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3N0b3JlL3NyYy9saWIvcHJvZHVjdC1kZXRhaWxzLXYyL2VkaXRpb24tc2VsZWN0b3IvZWRpdGlvbi1zZWxlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3N0b3JlL3NyYy9saWIvcHJvZHVjdC1kZXRhaWxzLXYyL2VkaXRpb24tc2VsZWN0b3IvZWRpdGlvbi1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JGLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFvQnBFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFNNUIsTUFBTSxPQUFPLHdCQUF3QjtJQU1uQyxZQUNtQixTQUFpRCxFQUNqRCxjQUE4QixFQUNOLElBQWdCLEVBQ3hDLGVBQXdDO1FBSHhDLGNBQVMsR0FBVCxTQUFTLENBQXdDO1FBQ2pELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNOLFNBQUks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VUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELGFBQWEsQ0FBQyxTQUFpQjtRQUM3QixNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFDOUIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsSUFBSSxFQUFFLFlBQVksQ0FBQyxlQUFlO1NBQ25DLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDbkIsSUFBSSxFQUFFLFlBQVksQ0FBQyxlQUFlO1NBQ25DLENBQUMsQ0FBQztJQUNMLENBQUM7O3FIQTdFVSx3QkFBd0IsNEVBU3pCLGVBQWU7eUdBVGQsd0JBQXdCLG9EQ2xDckMsZ2lHQXdGQTsyRkR0RGEsd0JBQXdCO2tCQUpwQyxTQUFTOzs7MEJBYUwsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnQHZlbmRhc3RhL2JpbGxpbmcnO1xuaW1wb3J0IHsgRnJlcXVlbmN5IH0gZnJvbSAnQHZlbmRhc3RhL2dhbGF4eS9mcmVxdWVuY3knO1xuaW1wb3J0IHsgUHJvZHVjdEFuYWx5dGljc1NlcnZpY2UgfSBmcm9tICdAdmVuZGFzdGEvcHJvZHVjdC1hbmFseXRpY3MnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgY29udmVydEJpbGxpbmdGcmVxdWVuY3lUb0dhbGF4eUZyZXF1ZW5jeSB9IGZyb20gJy4uLy4uL3V0aWxzL2JpbGxpbmctdXRpbHMnO1xuaW1wb3J0IHsgRGlhbG9nRGF0YSwgUmVzcG9uc2VUeXBlIH0gZnJvbSAnLi9lZGl0aW9uLXNlbGVjdG9yLnR5cGVzJztcblxuaW50ZXJmYWNlIFN0YXRlIHtcbiAgZWRpdGlvbnM6IEVkaXRpb25bXTtcbiAgd2luZG93OiBXaW5kb3c7XG59XG5cbmludGVyZmFjZSBFZGl0aW9uIHtcbiAgZWRpdGlvbklkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlcjtcbiAgY3VycmVuY3k6IHN0cmluZztcbiAgZnJlcXVlbmN5OiBGcmVxdWVuY3k7XG59XG5cbmludGVyZmFjZSBXaW5kb3cge1xuICBsZWZ0SW5kZXg6IG51bWJlcjtcbiAgcmlnaHRJbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3Qgd2luZG93U2l6ZSA9IDQ7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJ2VkaXRpb24tc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZWRpdGlvbi1zZWxlY3Rvci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBFZGl0aW9uU2VsZWN0b3JDb21wb25lbnQge1xuICBzdGF0ZSQ6IE9ic2VydmFibGU8U3RhdGU+O1xuICB3aW5kb3ckJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8V2luZG93Pih7IGxlZnRJbmRleDogMCwgcmlnaHRJbmRleDogd2luZG93U2l6ZSAtIDEgfSk7XG5cbiAgd2luZG93U2l6ZSA9IHdpbmRvd1NpemU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxFZGl0aW9uU2VsZWN0b3JDb21wb25lbnQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgcmVhZG9ubHkgZGF0YTogRGlhbG9nRGF0YSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNub3dwbG93U2VydmljZTogUHJvZHVjdEFuYWx5dGljc1NlcnZpY2UsXG4gICkge1xuICAgIGNvbnN0IHByaWNpbmckID0gdGhpcy5iaWxsaW5nU2VydmljZVxuICAgICAgLmdldE11bHRpUmV0YWlsUHJpY2luZyhcbiAgICAgICAgdGhpcy5kYXRhLnBhcnRuZXJJZCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5kYXRhLmVkaXRpb25zTWFya2V0aW5nLm1hcCgoZSkgPT4gZS5iaWxsaW5nSWQpLFxuICAgICAgICB0aGlzLmRhdGEubWFya2V0SWQsXG4gICAgICApXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5zdGF0ZSQgPSBjb21iaW5lTGF0ZXN0KFtwcmljaW5nJCwgdGhpcy53aW5kb3ckJF0pLnBpcGUoXG4gICAgICBtYXAoKFtyZXNwLCB3aW5kb3ddKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbEVkaXRpb25zOiBFZGl0aW9uW10gPSBbXTtcbiAgICAgICAgdGhpcy5kYXRhLmVkaXRpb25zTWFya2V0aW5nLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICBjb25zdCBwcmljaW5nID0gcmVzcFtlLmJpbGxpbmdJZF07XG4gICAgICAgICAgYWxsRWRpdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBlZGl0aW9uSWQ6IGUuZWRpdGlvbklkLFxuICAgICAgICAgICAgbmFtZTogZS5uYW1lLFxuICAgICAgICAgICAgcHJpY2U6IHByaWNpbmc/LnByaWNpbmdSdWxlcz8ubGVuZ3RoID4gMCA/IHByaWNpbmcucHJpY2luZ1J1bGVzWzBdLnByaWNlIDogMCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBwcmljaW5nPy5jdXJyZW5jeSxcbiAgICAgICAgICAgIGZyZXF1ZW5jeTogY29udmVydEJpbGxpbmdGcmVxdWVuY3lUb0dhbGF4eUZyZXF1ZW5jeShwcmljaW5nPy5mcmVxdWVuY3kpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlZGl0aW9uczogYWxsRWRpdGlvbnMsXG4gICAgICAgICAgd2luZG93OiB3aW5kb3csXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgc2hpZnRDYXJvdXNlbCh3aW5kb3c6IFdpbmRvdywgZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgc2Nyb2xsVG86IG51bWJlcjtcbiAgICBsZXQgYmxvY2s6IFNjcm9sbExvZ2ljYWxQb3NpdGlvbjtcbiAgICBjb25zdCBsZWZ0SW5kZXggPSB3aW5kb3cubGVmdEluZGV4ICsgZGlyZWN0aW9uO1xuICAgIGNvbnN0IHJpZ2h0SW5kZXggPSB3aW5kb3cucmlnaHRJbmRleCArIGRpcmVjdGlvbjtcbiAgICBpZiAoZGlyZWN0aW9uIDwgMCkge1xuICAgICAgc2Nyb2xsVG8gPSBsZWZ0SW5kZXg7XG4gICAgICBibG9jayA9ICdzdGFydCc7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPiAwKSB7XG4gICAgICBzY3JvbGxUbyA9IHJpZ2h0SW5kZXg7XG4gICAgICBibG9jayA9ICdlbmQnO1xuICAgIH1cbiAgICBpZiAobGVmdEluZGV4IDwgMCB8fCByaWdodEluZGV4ID4gdGhpcy5kYXRhLmVkaXRpb25zTWFya2V0aW5nLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNhcm91c2VsLWNvbC0ke3Njcm9sbFRvfWApLnNjcm9sbEludG9WaWV3KHtcbiAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgIGJsb2NrOiBibG9jayxcbiAgICB9KTtcbiAgICB0aGlzLndpbmRvdyQkLm5leHQoeyBsZWZ0SW5kZXg6IGxlZnRJbmRleCwgcmlnaHRJbmRleDogcmlnaHRJbmRleCB9KTtcbiAgfVxuXG4gIHNlbGVjdEVkaXRpb24oZWRpdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IGAke3RoaXMuZGF0YS5wcm9kdWN0SWR9OiR7ZWRpdGlvbklkfWA7XG4gICAgdGhpcy5zbm93cGxvd1NlcnZpY2UudHJhY2tDbGljaygnc3RvcmU6ZWRpdGlvbi1zZWxlY3RvcicsIGBhZGQtZWRpdGlvbmVkLXByb2R1Y3RgLCBwcm9wZXJ0eSk7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xuICAgICAgcHJvZHVjdElkOiB0aGlzLmRhdGEucHJvZHVjdElkLFxuICAgICAgZWRpdGlvbklkOiBlZGl0aW9uSWQsXG4gICAgICB0eXBlOiBSZXNwb25zZVR5cGUuRWRpdGlvblNlbGVjdGVkLFxuICAgIH0pO1xuICB9XG5cbiAgY29tcGFyZUVkaXRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHtcbiAgICAgIHR5cGU6IFJlc3BvbnNlVHlwZS5Db21wYXJlRWRpdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZWxlY3Rvci1oZWFkZXJcIj5cbiAgPGgzIGNsYXNzPVwic2VsZWN0b3ItdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPlxuICAgIHt7IGRhdGEudHJhbnNsYXRpb25LZXlzLnRpdGxlIHwgdHJhbnNsYXRlOiBkYXRhLnRyYW5zbGF0aW9uQXJncyB9fVxuICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0LWRpYWxvZy1jbG9zZT5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNsb3NlLWljb25cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvaDM+XG48L2Rpdj5cbjxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJlZGl0aW9ucy1jYXJvdXNlbFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhdGUkIHwgYXN5bmMgYXMgc3RhdGVcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiZGF0YS50cmFuc2xhdGlvbktleXMuZXhwbGFuYXRpb25cIiBjbGFzcz1cInNlbGVjdG9yLWV4cGxhbmF0aW9uXCI+XG4gICAgICB7eyBkYXRhLnRyYW5zbGF0aW9uS2V5cy5leHBsYW5hdGlvbiB8IHRyYW5zbGF0ZTogZGF0YS50cmFuc2xhdGlvbkFyZ3MgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtcm93XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwic3RhdGUuZWRpdGlvbnMubGVuZ3RoID4gd2luZG93U2l6ZVwiXG4gICAgICAgIGNsYXNzPVwiYnV0dG9uLXBsYWNlaG9sZGVyIGxlZnQtcGxhY2Vob2xkZXJcIlxuICAgICAgPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzdGF0ZS53aW5kb3cubGVmdEluZGV4ID4gMFwiXG4gICAgICAgICAgY2xhc3M9XCJ3aW5kb3ctYnV0dG9uXCJcbiAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInNoaWZ0Q2Fyb3VzZWwoc3RhdGUud2luZG93LCAtMSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwic2hpZnQtaWNvblwiIGlubGluZT5rZXlib2FyZF9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjYXJvdXNlbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnc2Nyb2xsYWJsZS1jYXJvdXNlbCc6IHN0YXRlLmVkaXRpb25zLmxlbmd0aCA+IHdpbmRvd1NpemVcbiAgICAgICAgfVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCBlZGl0aW9uIG9mIHN0YXRlLmVkaXRpb25zO1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3RcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjYXJvdXNlbC1jb2wgc2Nyb2xsYWJsZS1jYXJvdXNlbC1jb2xcIlxuICAgICAgICAgICAgW2lkXT1cIidjYXJvdXNlbC1jb2wtJyArIGluZGV4LnRvU3RyaW5nKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWRpdGlvbi10aXRsZVwiPlxuICAgICAgICAgICAgICB7eyBlZGl0aW9uLm5hbWUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxnbHh5LWZyZXF1ZW5jeVxuICAgICAgICAgICAgICBjbGFzcz1cImVkaXRpb24tcHJpY2VcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZWRpdGlvbi5wcmljZSAvIDEwMCB8IGdseHlDdXJyZW5jeTogZWRpdGlvbi5jdXJyZW5jeVwiXG4gICAgICAgICAgICAgIFtmcmVxdWVuY3ldPVwiZWRpdGlvbi5mcmVxdWVuY3lcIlxuICAgICAgICAgICAgICBhbGlnbj1cInN0YXJ0XCJcbiAgICAgICAgICAgID48L2dseHktZnJlcXVlbmN5PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXRpb24tYnV0dG9uXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImFkZC10by1jYXJ0XCJcbiAgICAgICAgICAgICAgICBtYXQtZmxhdC1idXR0b25cbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RFZGl0aW9uKGVkaXRpb24uZWRpdGlvbklkKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyAnRlJPTlRFTkQuU1RPUkUuQUREX1RPX0NBUlQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG1hdC1kaXZpZGVyICpuZ0lmPVwiIWxhc3RcIiB2ZXJ0aWNhbD48L21hdC1kaXZpZGVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInN0YXRlLmVkaXRpb25zLmxlbmd0aCA+IHdpbmRvd1NpemVcIlxuICAgICAgICBjbGFzcz1cImJ1dHRvbi1wbGFjZWhvbGRlciByaWdodC1wbGFjZWhvbGRlclwiXG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInN0YXRlLndpbmRvdy5yaWdodEluZGV4IDwgc3RhdGUuZWRpdGlvbnMubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgY2xhc3M9XCJ3aW5kb3ctYnV0dG9uXCJcbiAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInNoaWZ0Q2Fyb3VzZWwoc3RhdGUud2luZG93LCAxKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzaGlmdC1pY29uXCIgaW5saW5lPmtleWJvYXJkX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29tcGFyZS1yb3dcIj5cbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY29tcGFyZUVkaXRpb25zKClcIj5cbiAgICAgICAge3sgJ0ZST05URU5ELlNUT1JFLkVESVRJT05fU0VMRUNUT1IuQ09NUEFSRV9CVVRUT05fTEFCRUwnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L21hdC1kaWFsb2ctY29udGVudD5cbiJdfQ==