UNPKG

@vendasta/store

Version:

Components and data for Store

300 lines 33.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input } from '@angular/core'; import { trigger, transition, animate, style, state } from '@angular/animations'; import { BehaviorSubject, ReplaySubject, combineLatest, zip } from 'rxjs'; import { filter, map, startWith } from 'rxjs/operators'; import { buildSalesPackages, buildSalesProductFromProduct, addStatusesToSalesPackages, addStatusesToSalesProduct, } from './sales-package'; import { ListIndent } from './package-dropdown-item/package-dropdown-item.component'; var VaPackageDropdownComponent = /** @class */ (function () { function VaPackageDropdownComponent() { this.singularDropdown = false; this.packageProductIndent = ListIndent.INDENT_ONE; this.packageAddonWithoutProductIndent = ListIndent.INDENT_ONE; this.packageAddonWithProductIndent = ListIndent.INDENT_TWO; this.productAddonIndent = ListIndent.INDENT_ONE; this.packages$$ = new ReplaySubject(1); this.products$$ = new ReplaySubject(1); this.standAloneProducts$$ = new ReplaySubject(1); this.statuses$$ = new BehaviorSubject([]); this.addons$$ = new ReplaySubject(1); this.packageToggles = []; this.productToggles = []; } Object.defineProperty(VaPackageDropdownComponent.prototype, "packages", { // packages in dropdown set: // packages in dropdown /** * @param {?} packages * @return {?} */ function (packages) { this.packages$$.next(packages); }, enumerable: true, configurable: true }); Object.defineProperty(VaPackageDropdownComponent.prototype, "products", { // products within given packages set: // products within given packages /** * @param {?} products * @return {?} */ function (products) { this.products$$.next(products); }, enumerable: true, configurable: true }); Object.defineProperty(VaPackageDropdownComponent.prototype, "standAloneProducts", { // products not associated with a package set: // products not associated with a package /** * @param {?} standAloneProducts * @return {?} */ function (standAloneProducts) { this.standAloneProducts$$.next(standAloneProducts); }, enumerable: true, configurable: true }); Object.defineProperty(VaPackageDropdownComponent.prototype, "statuses", { // statuses for all products and addons set: // statuses for all products and addons /** * @param {?} statuses * @return {?} */ function (statuses) { this.statuses$$.next(statuses); }, enumerable: true, configurable: true }); Object.defineProperty(VaPackageDropdownComponent.prototype, "addons", { // addons within given packages set: // addons within given packages /** * @param {?} addons * @return {?} */ function (addons) { this.addons$$.next(addons); }, enumerable: true, configurable: true }); /** * @return {?} */ VaPackageDropdownComponent.prototype.ngOnInit = /** * @return {?} */ function () { /** @type {?} */ var packages$ = this.packages$$.pipe(filter(function (packages) { return packages !== null; })); /** @type {?} */ var products$ = this.products$$.pipe(filter(function (products) { return products !== null; })); /** @type {?} */ var addons$ = this.addons$$.pipe(filter(function (addons) { return addons !== null; })); /** @type {?} */ var salesPackage$ = zip(packages$, products$, addons$).pipe(map(function (_a) { var _b = tslib_1.__read(_a, 3), packages = _b[0], products = _b[1], addons = _b[2]; return buildSalesPackages(packages, products, addons); })); this.salesPackages$ = combineLatest(salesPackage$, this.statuses$$).pipe(map(function (_a) { var _b = tslib_1.__read(_a, 2), salesPackages = _b[0], statuses = _b[1]; return addStatusesToSalesPackages(salesPackages, statuses); }), startWith([])); this.salesProducts$ = combineLatest(this.standAloneProducts$$, this.statuses$$).pipe(filter(function (_a) { var _b = tslib_1.__read(_a, 2), products = _b[0], _ = _b[1]; return products !== null; }), map(function (_a) { var _b = tslib_1.__read(_a, 2), products = _b[0], statuses = _b[1]; return products.map(function (p) { /** @type {?} */ var addons = p.addons || null; /** @type {?} */ var salesProducts = buildSalesProductFromProduct(p, addons); return addStatusesToSalesProduct(salesProducts, statuses); }); }), startWith([])); this.templateData$ = combineLatest(this.salesPackages$, this.salesProducts$).pipe(map(function (_a) { var _b = tslib_1.__read(_a, 2), packages = _b[0], products = _b[1]; return ({ packages: packages, products: products }); })); }; /** * @param {?} indexToToggle * @return {?} */ VaPackageDropdownComponent.prototype.togglePackage = /** * @param {?} indexToToggle * @return {?} */ function (indexToToggle) { if (this.singularDropdown) { /** @type {?} */ var openedIndex = this.packageToggles.findIndex(function (value) { return value === true; }); if (openedIndex !== indexToToggle) { this.packageToggles[openedIndex] = false; } /** @type {?} */ var productOpenedIndex = this.productToggles.findIndex(function (value) { return value === true; }); if (productOpenedIndex > -1) { this.productToggles[productOpenedIndex] = false; } } this.packageToggles[indexToToggle] = !this.packageToggles[indexToToggle]; }; /** * @param {?} indexToToggle * @return {?} */ VaPackageDropdownComponent.prototype.toggleProduct = /** * @param {?} indexToToggle * @return {?} */ function (indexToToggle) { if (this.singularDropdown) { /** @type {?} */ var openedIndex = this.productToggles.findIndex(function (value) { return value === true; }); if (openedIndex !== indexToToggle) { this.productToggles[openedIndex] = false; } /** @type {?} */ var packageOpenedIndex = this.packageToggles.findIndex(function (value) { return value === true; }); if (packageOpenedIndex > -1) { this.packageToggles[packageOpenedIndex] = false; } } this.productToggles[indexToToggle] = !this.productToggles[indexToToggle]; }; /** * @param {?} product * @return {?} */ VaPackageDropdownComponent.prototype.formatProductEditionName = /** * @param {?} product * @return {?} */ function (product) { return product.editionName ? product.name + " " + product.editionName : product.name; }; /** * @param {?} product * @return {?} */ VaPackageDropdownComponent.prototype.standAloneProductDescription = /** * @param {?} product * @return {?} */ function (product) { if (product.addons && product.addons.length > 0) { /** @type {?} */ var description = "Contains " + product.addons.length; description = product.addons.length === 1 ? description + " Addon" : description + " Addons"; return description; } return ''; }; /** * @param {?} pkg * @return {?} */ VaPackageDropdownComponent.prototype.packageDescription = /** * @param {?} pkg * @return {?} */ function (pkg) { /** @type {?} */ var hasProducts = pkg.products && pkg.products.length > 0; if (!hasProducts && pkg.totalAddons === 0) { return 'No Items in Package'; } /** @type {?} */ var description = ''; /** @type {?} */ var hasOneProduct = pkg.products && pkg.products.length === 1; if (hasProducts || pkg.totalAddons > 0) { description = 'Contains '; } if (hasProducts) { description = description + " " + pkg.products.length; description = hasOneProduct ? description + " Product" : description + " Products"; } if (hasProducts && pkg.totalAddons > 0) { description = description + " & " + pkg.totalAddons; description = pkg.totalAddons === 1 ? description + " Addon" : description + " Addons"; } return description; }; VaPackageDropdownComponent.decorators = [ { type: Component, args: [{ selector: 'va-package-dropdown', animations: [ trigger('listAnimationStart', [ state('void', style({ height: '0px' })), state('*', style({ height: '*' })), transition('void => *', [animate('0.25s ease')]), transition('* => void', [animate('0.25s ease')]) ]) ], template: "<ng-container *ngIf=\"templateData$ | async as data\">\n <mat-card class=\"package-list-container\" *ngIf=\"data.products?.length > 0 || data.packages?.length > 0 else loading\">\n <mat-list>\n <div class=\"package-list\" *ngFor=\"let package of data.packages; let packageIndex = index\">\n\n <va-package-dropdown-item\n [title]=\"package.name\"\n [iconUrl]=\"package.icon\"\n [subtitle]=\"package.formattedPrices\"\n [statusItem]=\"package.activationStatus\"\n [description]=\"packageDescription(package)\"\n [enableDropdown]=\"package.products?.length > 0 || package.addonsWithNoParent?.length > 0\"\n [toggleValue]=\"packageToggles[packageIndex]\"\n (itemToggled)=\"togglePackage(packageIndex)\"\n ></va-package-dropdown-item>\n\n <mat-list class=\"product-or-addon-list package-dropdown-font\" *ngIf=\"packageToggles[packageIndex]\"\n [@listAnimationStart]>\n <div *ngFor=\"let product of package.products\">\n <va-package-dropdown-item\n [title]=\"product.name\"\n [subtitle]=\"product.tagline\"\n [iconUrl]=\"product.icon\"\n [statusItem]=\"product.activationStatus\"\n [indent]=\"packageProductIndent\"\n ></va-package-dropdown-item>\n\n <va-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithProductIndent\"\n ></va-package-dropdown-item>\n </div>\n\n <va-package-dropdown-item\n *ngFor=\"let addon of package.addonsWithNoParent\"\n [title]=\"addon.name\"\n titleDescriptor=\"(Requires {{ addon.parentName || ''}})\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [secondaryIconUrl]=\"addon.parentIcon\"\n [secondaryIconName]=\"addon.parentName\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"packageAddonWithoutProductIndent\"\n ></va-package-dropdown-item>\n </mat-list>\n </div>\n\n <div class=\"product-list\" *ngFor=\"let product of data.products; let productIndex = index\">\n <va-package-dropdown-item\n [title]=\"formatProductEditionName(product)\"\n [iconUrl]=\"product.icon\"\n [subtitle]=\"product.formattedPrices\"\n [statusItem]=\"product.activationStatus\"\n [description]=\"standAloneProductDescription(product)\"\n [enableDropdown]=\"product.addons?.length > 0\"\n [toggleValue]=\"productToggles[productIndex]\"\n (itemToggled)=\"toggleProduct(productIndex)\"\n ></va-package-dropdown-item>\n\n <mat-list class=\"product-or-addon-list product-dropdown-font\" *ngIf=\"productToggles[productIndex]\"\n [@listAnimationStart]>\n <va-package-dropdown-item\n *ngFor=\"let addon of product.addons\"\n [title]=\"addon.name\"\n [subtitle]=\"addon.tagline\"\n [iconUrl]=\"addon.icon\"\n [statusItem]=\"addon.activationStatus\"\n [indent]=\"productAddonIndent\"\n ></va-package-dropdown-item>\n </mat-list>\n </div>\n\n </mat-list>\n </mat-card>\n</ng-container>\n\n<ng-template #loading>\n <mat-card>\n <div class=\"package-dropdown-stencil-display\">\n <va-icon [iconUrl]=\"\"></va-icon>\n <div class=\"stencil-text\">\n <h1 class=\"stencil-title stencil-shimmer\"></h1>\n <span class=\"stencil-tagline stencil-shimmer\"></span>\n </div>\n </div>\n </mat-card>\n</ng-template>\n", styles: [".package-dropdown-font,.product-dropdown-font{color:rgba(0,0,0,.54);font-size:14px;font-weight:400}.package-list-container{border-top:1px solid rgba(0,0,0,.12);padding:0}.package-list-container mat-list{padding:0}.package-dropdown-stencil-display{display:flex;width:100%;flex-grow:1}.package-dropdown-stencil-display va-icon{margin-right:20px}.package-dropdown-stencil-display .stencil-text{width:inherit;display:flex;flex-direction:column;justify-content:center}.package-dropdown-stencil-display .stencil-text .stencil-title{height:32px;width:40%;margin-bottom:5px!important;margin-top:0!important}.package-dropdown-stencil-display .stencil-text .stencil-tagline{height:32px;width:inherit}.product-or-addon-list{background-color:rgba(0,0,0,.04);overflow:hidden}"] }] } ]; VaPackageDropdownComponent.propDecorators = { packages: [{ type: Input }], products: [{ type: Input }], standAloneProducts: [{ type: Input }], statuses: [{ type: Input }], addons: [{ type: Input }], singularDropdown: [{ type: Input }] }; return VaPackageDropdownComponent; }()); export { VaPackageDropdownComponent }; if (false) { /** @type {?} */ VaPackageDropdownComponent.prototype.singularDropdown; /** @type {?} */ VaPackageDropdownComponent.prototype.packageProductIndent; /** @type {?} */ VaPackageDropdownComponent.prototype.packageAddonWithoutProductIndent; /** @type {?} */ VaPackageDropdownComponent.prototype.packageAddonWithProductIndent; /** @type {?} */ VaPackageDropdownComponent.prototype.productAddonIndent; /** @type {?} */ VaPackageDropdownComponent.prototype.packages$$; /** @type {?} */ VaPackageDropdownComponent.prototype.products$$; /** @type {?} */ VaPackageDropdownComponent.prototype.standAloneProducts$$; /** @type {?} */ VaPackageDropdownComponent.prototype.statuses$$; /** @type {?} */ VaPackageDropdownComponent.prototype.addons$$; /** @type {?} */ VaPackageDropdownComponent.prototype.templateData$; /** @type {?} */ VaPackageDropdownComponent.prototype.salesPackages$; /** @type {?} */ VaPackageDropdownComponent.prototype.salesProducts$; /** @type {?} */ VaPackageDropdownComponent.prototype.packageToggles; /** @type {?} */ VaPackageDropdownComponent.prototype.productToggles; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1kcm9wZG93bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdmVuZGFzdGEvc3RvcmUvIiwic291cmNlcyI6WyJsaWIvcGFja2FnZS1kcm9wZG93bi9wYWNrYWdlLWRyb3Bkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFjLGVBQWUsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4RCxPQUFPLEVBR0wsa0JBQWtCLEVBQ2xCLDRCQUE0QixFQUM1QiwwQkFBMEIsRUFDMUIseUJBQXlCLEdBRTFCLE1BQU0saUJBQWlCLENBQUM7QUFHekIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBRXJGO0lBQUE7UUF1Q1cscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRWxDLHlCQUFvQixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDN0MscUNBQWdDLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUN6RCxrQ0FBNkIsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3RELHVCQUFrQixHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFFM0MsZUFBVSxHQUE2QixJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxlQUFVLEdBQTZCLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELHlCQUFvQixHQUE2QixJQUFJLGFBQWEsQ0FBQyxDQUFD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K0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIGFuaW1hdGUsIHN0eWxlLCBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCB6aXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFkZG9uIH0gZnJvbSAnQHZlbmRhc3RhL2NvcmUvbWFya2V0cGxhY2UtcGFja2FnZXMnO1xuaW1wb3J0IHtcbiAgU2FsZXNQYWNrYWdlLFxuICBTYWxlc1Byb2R1Y3QsXG4gIGJ1aWxkU2FsZXNQYWNrYWdlcyxcbiAgYnVpbGRTYWxlc1Byb2R1Y3RGcm9tUHJvZHVjdCxcbiAgYWRkU3RhdHVzZXNUb1NhbGVzUGFja2FnZXMsXG4gIGFkZFN0YXR1c2VzVG9TYWxlc1Byb2R1Y3QsXG4gIFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1cyxcbn0gZnJvbSAnLi9zYWxlcy1wYWNrYWdlJztcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi9zaGFyZWQvcHJvZHVjdCc7XG5pbXBvcnQgeyBQYWNrYWdlIH0gZnJvbSAnLi4vcGFja2FnZS1kZXRhaWxzL3BhY2thZ2UnO1xuaW1wb3J0IHsgTGlzdEluZGVudCB9IGZyb20gJy4vcGFja2FnZS1kcm9wZG93bi1pdGVtL3BhY2thZ2UtZHJvcGRvd24taXRlbS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YS1wYWNrYWdlLWRyb3Bkb3duJyxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2xpc3RBbmltYXRpb25TdGFydCcsIFtcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnIH0pKSxcbiAgICAgIHN0YXRlKCcqJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IConLCBbYW5pbWF0ZSgnMC4yNXMgZWFzZScpXSksXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbYW5pbWF0ZSgnMC4yNXMgZWFzZScpXSlcbiAgICBdKVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJ3BhY2thZ2UtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWNrYWdlLWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVmFQYWNrYWdlRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyBwYWNrYWdlcyBpbiBkcm9wZG93blxuICBASW5wdXQoKVxuICBzZXQgcGFja2FnZXMocGFja2FnZXM6IFBhY2thZ2VbXSkge1xuICAgIHRoaXMucGFja2FnZXMkJC5uZXh0KHBhY2thZ2VzKTtcbiAgfVxuICAvLyBwcm9kdWN0cyB3aXRoaW4gZ2l2ZW4gcGFja2FnZXNcbiAgQElucHV0KClcbiAgc2V0IHByb2R1Y3RzKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcbiAgICB0aGlzLnByb2R1Y3RzJCQubmV4dChwcm9kdWN0cyk7XG4gIH1cbiAgLy8gcHJvZHVjdHMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHBhY2thZ2VcbiAgQElucHV0KClcbiAgc2V0IHN0YW5kQWxvbmVQcm9kdWN0cyhzdGFuZEFsb25lUHJvZHVjdHM6IFByb2R1Y3RbXSkge1xuICAgIHRoaXMuc3RhbmRBbG9uZVByb2R1Y3RzJCQubmV4dChzdGFuZEFsb25lUHJvZHVjdHMpO1xuICB9XG4gIC8vIHN0YXR1c2VzIGZvciBhbGwgcHJvZHVjdHMgYW5kIGFkZG9uc1xuICBASW5wdXQoKVxuICBzZXQgc3RhdHVzZXMoc3RhdHVzZXM6IFBhY2thZ2VJdGVtQWN0aXZhdGlvblN0YXR1c1tdKSB7XG4gICAgdGhpcy5zdGF0dXNlcyQkLm5leHQoc3RhdHVzZXMpO1xuICB9XG4gIC8vIGFkZG9ucyB3aXRoaW4gZ2l2ZW4gcGFja2FnZXNcbiAgQElucHV0KClcbiAgc2V0IGFkZG9ucyhhZGRvbnM6IEFkZG9uW10pIHtcbiAgICB0aGlzLmFkZG9ucyQkLm5leHQoYWRkb25zKTtcbiAgfVxuICBASW5wdXQoKSBzaW5ndWxhckRyb3Bkb3duID0gZmFsc2U7XG5cbiAgcGFja2FnZVByb2R1Y3RJbmRlbnQgPSBMaXN0SW5kZW50LklOREVOVF9PTkU7XG4gIHBhY2thZ2VBZGRvbldpdGhvdXRQcm9kdWN0SW5kZW50ID0gTGlzdEluZGVudC5JTkRFTlRfT05FO1xuICBwYWNrYWdlQWRkb25XaXRoUHJvZHVjdEluZGVudCA9IExpc3RJbmRlbnQuSU5ERU5UX1RXTztcbiAgcHJvZHVjdEFkZG9uSW5kZW50ID0gTGlzdEluZGVudC5JTkRFTlRfT05FO1xuXG4gIHBhY2thZ2VzJCQ6IFJlcGxheVN1YmplY3Q8UGFja2FnZVtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBwcm9kdWN0cyQkOiBSZXBsYXlTdWJqZWN0PFByb2R1Y3RbXT4gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgc3RhbmRBbG9uZVByb2R1Y3RzJCQ6IFJlcGxheVN1YmplY3Q8UHJvZHVjdFtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBzdGF0dXNlcyQkOiBCZWhhdmlvclN1YmplY3Q8UGFja2FnZUl0ZW1BY3RpdmF0aW9uU3RhdHVzW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gIGFkZG9ucyQkOiBSZXBsYXlTdWJqZWN0PEFkZG9uW10+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgdGVtcGxhdGVEYXRhJDogT2JzZXJ2YWJsZTx7cGFja2FnZXM6IFNhbGVzUGFja2FnZVtdOyBwcm9kdWN0czogU2FsZXNQcm9kdWN0W119PjtcbiAgc2FsZXNQYWNrYWdlcyQ6IE9ic2VydmFibGU8U2FsZXNQYWNrYWdlW10+O1xuICBzYWxlc1Byb2R1Y3RzJDogT2JzZXJ2YWJsZTxTYWxlc1Byb2R1Y3RbXT47XG4gIHBhY2thZ2VUb2dnbGVzOiBib29sZWFuW10gPSBbXTtcbiAgcHJvZHVjdFRvZ2dsZXM6IGJvb2xlYW5bXSA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhY2thZ2VzJDogT2JzZXJ2YWJsZTxQYWNrYWdlW10+ID0gdGhpcy5wYWNrYWdlcyQkLnBpcGUoZmlsdGVyKHBhY2thZ2VzID0+IHBhY2thZ2VzICE9PSBudWxsKSk7XG4gICAgY29uc3QgcHJvZHVjdHMkOiBPYnNlcnZhYmxlPFByb2R1Y3RbXT4gPSB0aGlzLnByb2R1Y3RzJCQucGlwZShmaWx0ZXIocHJvZHVjdHMgPT4gcHJvZHVjdHMgIT09IG51bGwpKTtcbiAgICBjb25zdCBhZGRvbnMkOiBPYnNlcnZhYmxlPEFkZG9uW10+ID0gdGhpcy5hZGRvbnMkJC5waXBlKGZpbHRlcihhZGRvbnMgPT4gYWRkb25zICE9PSBudWxsKSk7XG5cbiAgICBjb25zdCBzYWxlc1BhY2thZ2UkID0gemlwKHBhY2thZ2VzJCwgcHJvZHVjdHMkLCBhZGRvbnMkKS5waXBlKFxuICAgICAgbWFwKChbcGFja2FnZXMsIHByb2R1Y3RzLCBhZGRvbnNdKSA9PiBidWlsZFNhbGVzUGFja2FnZXMocGFja2FnZXMsIHByb2R1Y3RzLCBhZGRvbnMpKSxcbiAgICApO1xuXG4gICAgdGhpcy5zYWxlc1BhY2thZ2VzJCA9IGNvbWJpbmVMYXRlc3Qoc2FsZXNQYWNrYWdlJCwgdGhpcy5zdGF0dXNlcyQkKS5waXBlKFxuICAgICAgbWFwKChbc2FsZXNQYWNrYWdlcywgc3RhdHVzZXNdKSA9PiBhZGRTdGF0dXNlc1RvU2FsZXNQYWNrYWdlcyhzYWxlc1BhY2thZ2VzLCBzdGF0dXNlcykpLFxuICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICApO1xuXG4gICAgdGhpcy5zYWxlc1Byb2R1Y3RzJCA9IGNvbWJpbmVMYXRlc3QodGhpcy5zdGFuZEFsb25lUHJvZHVjdHMkJCwgdGhpcy5zdGF0dXNlcyQkKS5waXBlKFxuICAgICAgZmlsdGVyKChbcHJvZHVjdHMsIF9dKSA9PiBwcm9kdWN0cyAhPT0gbnVsbCksXG4gICAgICBtYXAoKFtwcm9kdWN0cywgc3RhdHVzZXNdOiBbUHJvZHVjdFtdLCBQYWNrYWdlSXRlbUFjdGl2YXRpb25TdGF0dXNbXV0pOiBTYWxlc1Byb2R1Y3RbXSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9kdWN0cy5tYXAocCA9PiB7XG4gICAgICAgICAgY29uc3QgYWRkb25zID0gcC5hZGRvbnMgfHwgbnVsbDtcbiAgICAgICAgICBjb25zdCBzYWxlc1Byb2R1Y3RzID0gYnVpbGRTYWxlc1Byb2R1Y3RGcm9tUHJvZHVjdChwLCBhZGRvbnMpO1xuICAgICAgICAgIHJldHVybiBhZGRTdGF0dXNlc1RvU2FsZXNQcm9kdWN0KHNhbGVzUHJvZHVjdHMsIHN0YXR1c2VzKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIHN0YXJ0V2l0aChbXSksXG4gICAgKTtcbiAgICB0aGlzLnRlbXBsYXRlRGF0YSQgPSBjb21iaW5lTGF0ZXN0KHRoaXMuc2FsZXNQYWNrYWdlcyQsIHRoaXMuc2FsZXNQcm9kdWN0cyQpLnBpcGUoXG4gICAgICBtYXAoKFtwYWNrYWdlcywgcHJvZHVjdHNdKSA9PiAoe3BhY2thZ2VzOiBwYWNrYWdlcywgcHJvZHVjdHM6IHByb2R1Y3RzfSkpXG4gICAgKVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZVBhY2thZ2UoaW5kZXhUb1RvZ2dsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2luZ3VsYXJEcm9wZG93bikge1xuICAgICAgY29uc3Qgb3BlbmVkSW5kZXggPSB0aGlzLnBhY2thZ2VUb2dnbGVzLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgICBpZiAob3BlbmVkSW5kZXggIT09IGluZGV4VG9Ub2dnbGUpIHtcbiAgICAgICAgdGhpcy5wYWNrYWdlVG9nZ2xlc1tvcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb2R1Y3RPcGVuZWRJbmRleCA9IHRoaXMucHJvZHVjdFRvZ2dsZXMuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlID09PSB0cnVlKTtcbiAgICAgIGlmIChwcm9kdWN0T3BlbmVkSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnByb2R1Y3RUb2dnbGVzW3Byb2R1Y3RPcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wYWNrYWdlVG9nZ2xlc1tpbmRleFRvVG9nZ2xlXSA9ICF0aGlzLnBhY2thZ2VUb2dnbGVzW2luZGV4VG9Ub2dnbGVdO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVByb2R1Y3QoaW5kZXhUb1RvZ2dsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2luZ3VsYXJEcm9wZG93bikge1xuICAgICAgY29uc3Qgb3BlbmVkSW5kZXggPSB0aGlzLnByb2R1Y3RUb2dnbGVzLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgICBpZiAob3BlbmVkSW5kZXggIT09IGluZGV4VG9Ub2dnbGUpIHtcbiAgICAgICAgdGhpcy5wcm9kdWN0VG9nZ2xlc1tvcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhY2thZ2VPcGVuZWRJbmRleCA9IHRoaXMucGFja2FnZVRvZ2dsZXMuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlID09PSB0cnVlKTtcbiAgICAgIGlmIChwYWNrYWdlT3BlbmVkSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLnBhY2thZ2VUb2dnbGVzW3BhY2thZ2VPcGVuZWRJbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wcm9kdWN0VG9nZ2xlc1tpbmRleFRvVG9nZ2xlXSA9ICF0aGlzLnByb2R1Y3RUb2dnbGVzW2luZGV4VG9Ub2dnbGVdO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdFByb2R1Y3RFZGl0aW9uTmFtZShwcm9kdWN0OiBTYWxlc1Byb2R1Y3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9kdWN0LmVkaXRpb25OYW1lID8gYCR7cHJvZHVjdC5uYW1lfSAke3Byb2R1Y3QuZWRpdGlvbk5hbWV9YCA6IHByb2R1Y3QubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFuZEFsb25lUHJvZHVjdERlc2NyaXB0aW9uKHByb2R1Y3Q6IFNhbGVzUHJvZHVjdCk6IHN0cmluZyB7XG4gICAgaWYgKHByb2R1Y3QuYWRkb25zICYmIHByb2R1Y3QuYWRkb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBkZXNjcmlwdGlvbiA9IGBDb250YWlucyAke3Byb2R1Y3QuYWRkb25zLmxlbmd0aH1gO1xuICAgICAgZGVzY3JpcHRpb24gPSBwcm9kdWN0LmFkZG9ucy5sZW5ndGggPT09IDEgPyBgJHtkZXNjcmlwdGlvbn0gQWRkb25gIDogYCR7ZGVzY3JpcHRpb259IEFkZG9uc2A7XG4gICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBwYWNrYWdlRGVzY3JpcHRpb24ocGtnOiBTYWxlc1BhY2thZ2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc1Byb2R1Y3RzID0gcGtnLnByb2R1Y3RzICYmIHBrZy5wcm9kdWN0cy5sZW5ndGggPiAwO1xuICAgIGlmICghaGFzUHJvZHVjdHMgJiYgcGtnLnRvdGFsQWRkb25zID09PSAwKSB7XG4gICAgICByZXR1cm4gJ05vIEl0ZW1zIGluIFBhY2thZ2UnO1xuICAgIH1cblxuICAgIGxldCBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGNvbnN0IGhhc09uZVByb2R1Y3QgPSBwa2cucHJvZHVjdHMgJiYgcGtnLnByb2R1Y3RzLmxlbmd0aCA9PT0gMTtcbiAgICBpZiAoaGFzUHJvZHVjdHMgfHwgcGtnLnRvdGFsQWRkb25zID4gMCkge1xuICAgICAgZGVzY3JpcHRpb24gPSAnQ29udGFpbnMgJztcbiAgICB9XG4gICAgaWYgKGhhc1Byb2R1Y3RzKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IGAke2Rlc2NyaXB0aW9ufSAke3BrZy5wcm9kdWN0cy5sZW5ndGh9YDtcbiAgICAgIGRlc2NyaXB0aW9uID0gaGFzT25lUHJvZHVjdCA/IGAke2Rlc2NyaXB0aW9ufSBQcm9kdWN0YCA6IGAke2Rlc2NyaXB0aW9ufSBQcm9kdWN0c2A7XG4gICAgfVxuICAgIGlmIChoYXNQcm9kdWN0cyAmJiBwa2cudG90YWxBZGRvbnMgPiAwKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IGAke2Rlc2NyaXB0aW9ufSAmICR7cGtnLnRvdGFsQWRkb25zfWA7XG4gICAgICBkZXNjcmlwdGlvbiA9IHBrZy50b3RhbEFkZG9ucyA9PT0gMSA/IGAke2Rlc2NyaXB0aW9ufSBBZGRvbmAgOiBgJHtkZXNjcmlwdGlvbn0gQWRkb25zYDtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICB9XG59XG4iXX0=