UNPKG

@spartacus/storefront

Version:

Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.

96 lines 35.2 kB
import { ChangeDetectionStrategy, Component, } from '@angular/core'; import { combineLatest } from 'rxjs'; import { map, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@spartacus/core"; import * as i2 from "../../../shared/components/list-navigation/sorting/sorting.component"; import * as i3 from "../../../shared/components/list-navigation/pagination/pagination.component"; import * as i4 from "../../../shared/components/media/media.component"; import * as i5 from "../../../shared/components/spinner/spinner.component"; import * as i6 from "@angular/common"; import * as i7 from "@angular/router"; export class MyInterestsComponent { constructor(productInterestService, translationService, productService) { this.productInterestService = productInterestService; this.translationService = translationService; this.productService = productService; this.DEFAULT_PAGE_SIZE = 10; this.sortMapping = { byNameAsc: 'name:asc', byNameDesc: 'name:desc', }; this.sort = 'byNameAsc'; this.sortOptions = [ { code: 'byNameAsc', selected: false, }, { code: 'byNameDesc', selected: false, }, ]; } ngOnInit() { this.interests$ = this.productInterestService .getAndLoadProductInterests(this.DEFAULT_PAGE_SIZE) .pipe(tap((interests) => (this.pagination = { currentPage: interests.pagination.page, pageSize: interests.pagination.count, totalPages: interests.pagination.totalPages, totalResults: interests.pagination.totalCount, sort: 'byNameAsc', })), map((interest) => (Object.assign(Object.assign({}, interest), { results: interest.results ? interest.results.map((result) => (Object.assign(Object.assign({}, result), { product$: this.getProduct(result) }))) : interest.results })))); this.getInterestsloading$ = this.productInterestService.getProdutInterestsLoading(); this.isRemoveDisabled$ = combineLatest([ this.getInterestsloading$, this.productInterestService.getRemoveProdutInterestLoading(), ]).pipe(map(([getLoading, removeLoading]) => getLoading || removeLoading)); this.sortLabels = this.getSortLabels(); } getSortLabels() { return combineLatest([ this.translationService.translate('myInterests.sorting.byNameAsc'), this.translationService.translate('myInterests.sorting.byNameDesc'), ]).pipe(map(([asc, desc]) => { return { byNameAsc: asc, byNameDesc: desc, }; })); } getProduct(interest) { return this.productService.get(interest.product.code, "details" /* DETAILS */); } removeInterest(relation) { this.productInterestService.removeProdutInterest({ product: relation.product, productInterestEntry: relation.productInterestEntry, }); } sortChange(sort) { this.sort = sort; this.productInterestService.loadProductInterests(this.DEFAULT_PAGE_SIZE, 0, this.sortMapping[sort]); } pageChange(page) { this.productInterestService.loadProductInterests(this.DEFAULT_PAGE_SIZE, page, this.sortMapping[this.sort]); } ngOnDestroy() { this.productInterestService.clearProductInterests(); this.productInterestService.resetRemoveInterestState(); } } MyInterestsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MyInterestsComponent, deps: [{ token: i1.UserInterestsService }, { token: i1.TranslationService }, { token: i1.ProductService }], target: i0.ɵɵFactoryTarget.Component }); MyInterestsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: MyInterestsComponent, selector: "cx-my-interests", ngImport: i0, template: "<div *ngIf=\"interests$ | async as interests\" class=\"container\">\n <div class=\"cx-product-interests-title h3\">\n <h3>{{ 'myInterests.header' | cxTranslate }}</h3>\n </div>\n <div\n class=\"cx-product-interests-body\"\n *ngIf=\"!(getInterestsloading$ | async); else loading\"\n >\n <ng-container *ngIf=\"interests.pagination.totalCount > 0; else noInterest\">\n <div class=\"cx-product-interests-sort top row\">\n <label\n class=\"\n cx-product-interests-form-group\n form-group\n col-sm-12 col-md-4 col-lg-4\n \"\n ><span>{{ 'myInterests.sortBy' | cxTranslate }}</span>\n <cx-sorting\n [sortOptions]=\"sortOptions\"\n [sortLabels]=\"sortLabels | async\"\n (sortListEvent)=\"sortChange($event)\"\n [selectedOption]=\"sort\"\n placeholder=\"{{ 'myInterests.sortBy' | cxTranslate }}\"\n >\n </cx-sorting>\n </label>\n <div\n class=\"\n cx-product-interests-pagination cx-product-interests-thead-mobile\n \"\n >\n <cx-pagination\n [pagination]=\"pagination\"\n (viewPageEvent)=\"pageChange($event)\"\n ></cx-pagination>\n </div>\n </div>\n <table class=\"table cx-product-interests-table\">\n <thead class=\"cx-product-interests-thead-mobile\">\n <th scope=\"col\">\n {{ 'myInterests.item' | cxTranslate }}\n </th>\n <th scope=\"col\"></th>\n <th scope=\"col\">\n {{ 'myInterests.price' | cxTranslate }}\n </th>\n <th scope=\"col\">\n {{ 'myInterests.notifications' | cxTranslate }}\n </th>\n <th scope=\"col\"></th>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let interest of interests.results\"\n class=\"cx-product-interests-product-item\"\n >\n <ng-container *ngIf=\"interest.product$ | async as product\">\n <td>\n <div class=\"cx-product-interests-label\">\n <a\n class=\"cx-product-interests-product-image-link\"\n tabindex=\"-1\"\n [routerLink]=\"\n { cxRoute: 'product', params: product } | cxUrl\n \"\n >\n <cx-media\n [container]=\"product.images?.PRIMARY\"\n format=\"thumbnail\"\n ></cx-media>\n </a>\n </div>\n </td>\n <td>\n <div class=\"cx-info col-10\">\n <div class=\"cx-info-container row\">\n <div>\n <div *ngIf=\"product.name\" class=\"cx-name\">\n <a\n class=\"cx-link cx-product-interests-product-code-link\"\n [routerLink]=\"\n { cxRoute: 'product', params: product } | cxUrl\n \"\n >\n {{ product.name }}\n </a>\n </div>\n <div *ngIf=\"product.code\" class=\"cx-code\">\n <span>{{\n 'myInterests.productId'\n | cxTranslate: { code: product.code }\n }}</span>\n </div>\n\n <ng-container\n *ngFor=\"let baseOptions of product.baseOptions\"\n >\n <div\n *ngFor=\"\n let variant of baseOptions.selected\n ?.variantOptionQualifiers\n \"\n class=\"cx-property\"\n >\n <div\n class=\"cx-label cx-product-interests-variant-name\"\n >\n {{ variant.name }}\n </div>\n <div\n class=\"cx-value cx-product-interests-variant-value\"\n >\n {{ variant.value }}\n </div>\n </div>\n </ng-container>\n <div\n class=\"cx-property\"\n *ngIf=\"product.stock.stockLevelStatus === 'outOfStock'\"\n >\n <div\n class=\"cx-label cx-product-interests-product-stock\"\n >\n {{ 'myInterests.outOfStock' | cxTranslate }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </td>\n <td>\n <div class=\"cx-product-interests-product-price\">\n <div class=\"d-md-none cx-product-interests-label\">\n {{ 'myInterests.price' | cxTranslate }}\n </div>\n <span>{{ product.price.formattedValue }}</span>\n </div>\n </td>\n <td>\n <div class=\"cx-product-interests-subscriptions\">\n <div class=\"d-md-none cx-product-interests-label\">\n {{ 'myInterests.notifications' | cxTranslate }}\n </div>\n <div\n class=\"cx-product-interests-notification\"\n *ngFor=\"let interestEntry of interest.productInterestEntry\"\n >\n <span class=\"cx-product-interests-type\">\n {{\n 'myInterests.' + interestEntry.interestType\n | cxTranslate\n }}\n </span>\n <span class=\"cx-product-interests-expiration-date\">\n {{\n 'myInterests.expirationDate'\n | cxTranslate\n : {\n expirationDate:\n interestEntry.expirationDate | date\n }\n }}\n </span>\n </div>\n </div>\n </td>\n <td>\n <div class=\"cx-actions cx-product-interests-remove-button\">\n <button\n type=\"button\"\n class=\"link cx-product-interests-remove-btn\"\n [disabled]=\"isRemoveDisabled$ | async\"\n (click)=\"removeInterest(interest)\"\n >\n {{ 'myInterests.remove' | cxTranslate }}\n </button>\n </div>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n <div class=\"cx-product-interests-sort bottom row\">\n <label\n class=\"\n cx-product-interests-form-group cx-product-interests-thead-mobile\n form-group\n col-sm-12 col-md-4 col-lg-4\n \"\n ><span>{{ 'myInterests.sortBy' | cxTranslate }}</span>\n <cx-sorting\n [sortOptions]=\"sortOptions\"\n [sortLabels]=\"sortLabels | async\"\n (sortListEvent)=\"sortChange($event)\"\n [selectedOption]=\"sort\"\n placeholder=\"{{ 'myInterests.sortBy' | cxTranslate }}\"\n >\n </cx-sorting>\n </label>\n <div class=\"cx-product-interests-pagination\">\n <cx-pagination\n [pagination]=\"pagination\"\n (viewPageEvent)=\"pageChange($event)\"\n ></cx-pagination>\n </div>\n </div>\n </ng-container>\n </div>\n</div>\n<ng-template #noInterest>\n <div class=\"cx-product-interests-message\">\n {{ 'myInterests.noInterests' | cxTranslate }}\n </div>\n</ng-template>\n<ng-template #loading>\n <div class=\"cx-spinner\">\n <cx-spinner></cx-spinner>\n </div>\n</ng-template>\n", components: [{ type: i2.SortingComponent, selector: "cx-sorting", inputs: ["sortOptions", "selectedOption", "placeholder", "sortLabels"], outputs: ["sortListEvent"] }, { type: i3.PaginationComponent, selector: "cx-pagination", inputs: ["pageRoute", "queryParam", "defaultPage", "pagination"], outputs: ["viewPageEvent"] }, { type: i4.MediaComponent, selector: "cx-media", inputs: ["container", "format", "alt", "role", "loading"], outputs: ["loaded"] }, { type: i5.SpinnerComponent, selector: "cx-spinner" }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }], pipes: { "async": i6.AsyncPipe, "cxTranslate": i1.TranslatePipe, "cxUrl": i1.UrlPipe, "date": i6.DatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MyInterestsComponent, decorators: [{ type: Component, args: [{ selector: 'cx-my-interests', templateUrl: './my-interests.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i1.UserInterestsService }, { type: i1.TranslationService }, { type: i1.ProductService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktaW50ZXJlc3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvY21zLWNvbXBvbmVudHMvbXlhY2NvdW50L215LWludGVyZXN0cy9teS1pbnRlcmVzdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmVmcm9udGxpYi9jbXMtY29tcG9uZW50cy9teWFjY291bnQvbXktaW50ZXJlc3RzL215LWludGVyZXN0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBV2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQWExQyxNQUFNLE9BQU8sb0JBQW9CO0lBeUIvQixZQUNVLHNCQUE0QyxFQUM1QyxrQkFBc0MsRUFDdEMsY0FBOEI7UUFGOUIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUFzQjtRQUM1Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTNCaEMsc0JBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLGdCQUFXLEdBQUc7WUFDcEIsU0FBUyxFQUFFLFVBQVU7WUFDckIsVUFBVSxFQUFFLFdBQVc7U0FDeEIsQ0FBQztRQUVGLFNBQUksR0FBRyxXQUFXLENBQUM7UUFDbkIsZ0JBQVcsR0FBRztZQUNaO2dCQUNFLElBQUksRUFBRSxXQUFXO2dCQUNqQixRQUFRLEVBQUUsS0FBSzthQUNoQjtZQUNEO2dCQUNFLElBQUksRUFBRSxZQUFZO2dCQUNsQixRQUFRLEVBQUUsS0FBSzthQUNoQjtTQUNGLENBQUM7SUFZQyxDQUFDO0lB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LGlCQUFpQixFQUN0QixJQUFJLEVBQ0osSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3pELENBQUM7O2lIQXhIVSxvQkFBb0I7cUdBQXBCLG9CQUFvQix1REM5QmpDLDZ1UUEyTkE7MkZEN0xhLG9CQUFvQjtrQkFMaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixXQUFXLEVBQUUsK0JBQStCO29CQUM1QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBQYWdpbmF0aW9uTW9kZWwsXG4gIFByb2R1Y3QsXG4gIFByb2R1Y3RJbnRlcmVzdEVudHJ5UmVsYXRpb24sXG4gIFByb2R1Y3RJbnRlcmVzdFNlYXJjaFJlc3VsdCxcbiAgUHJvZHVjdFNjb3BlLFxuICBQcm9kdWN0U2VydmljZSxcbiAgVHJhbnNsYXRpb25TZXJ2aWNlLFxuICBVc2VySW50ZXJlc3RzU2VydmljZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbnRlcmZhY2UgUHJvZHVjdEludGVyZXN0U2VhcmNoUmVzdWx0VUkgZXh0ZW5kcyBQcm9kdWN0SW50ZXJlc3RTZWFyY2hSZXN1bHQge1xuICByZXN1bHRzPzogKFByb2R1Y3RJbnRlcmVzdEVudHJ5UmVsYXRpb24gJiB7XG4gICAgcHJvZHVjdCQ/OiBPYnNlcnZhYmxlPFByb2R1Y3Q+O1xuICB9KVtdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjeC1teS1pbnRlcmVzdHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbXktaW50ZXJlc3RzLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE15SW50ZXJlc3RzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIERFRkFVTFRfUEFHRV9TSVpFID0gMTA7XG4gIHByaXZhdGUgc29ydE1hcHBpbmcgPSB7XG4gICAgYnlOYW1lQXNjOiAnbmFtZTphc2MnLFxuICAgIGJ5TmFtZURlc2M6ICduYW1lOmRlc2MnLFxuICB9O1xuXG4gIHNvcnQgPSAnYnlOYW1lQXNjJztcbiAgc29ydE9wdGlvbnMgPSBbXG4gICAge1xuICAgICAgY29kZTogJ2J5TmFtZUFzYycsXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBjb2RlOiAnYnlOYW1lRGVzYycsXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgfSxcbiAgXTtcbiAgcGFnaW5hdGlvbjogUGFnaW5hdGlvbk1vZGVsO1xuXG4gIGludGVyZXN0cyQ6IE9ic2VydmFibGU8UHJvZHVjdEludGVyZXN0U2VhcmNoUmVzdWx0VUk+O1xuICBpc1JlbW92ZURpc2FibGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgZ2V0SW50ZXJlc3RzbG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHNvcnRMYWJlbHM6IE9ic2VydmFibGU8eyBieU5hbWVBc2M6IHN0cmluZzsgYnlOYW1lRGVzYzogc3RyaW5nIH0+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcHJvZHVjdEludGVyZXN0U2VydmljZTogVXNlckludGVyZXN0c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHByb2R1Y3RTZXJ2aWNlOiBQcm9kdWN0U2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbnRlcmVzdHMkID0gdGhpcy5wcm9kdWN0SW50ZXJlc3RTZXJ2aWNlXG4gICAgICAuZ2V0QW5kTG9hZFByb2R1Y3RJbnRlcmVzdHModGhpcy5ERUZBVUxUX1BBR0VfU0laRSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoXG4gICAgICAgICAgKGludGVyZXN0cykgPT5cbiAgICAgICAgICAgICh0aGlzLnBhZ2luYXRpb24gPSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRQYWdlOiBpbnRlcmVzdHMucGFnaW5hdGlvbi5wYWdlLFxuICAgICAgICAgICAgICBwYWdlU2l6ZTogaW50ZXJlc3RzLnBhZ2luYXRpb24uY291bnQsXG4gICAgICAgICAgICAgIHRvdGFsUGFnZXM6IGludGVyZXN0cy5wYWdpbmF0aW9uLnRvdGFsUGFnZXMsXG4gICAgICAgICAgICAgIHRvdGFsUmVzdWx0czogaW50ZXJlc3RzLnBhZ2luYXRpb24udG90YWxDb3VudCxcbiAgICAgICAgICAgICAgc29ydDogJ2J5TmFtZUFzYycsXG4gICAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICBtYXAoKGludGVyZXN0KSA9PiAoe1xuICAgICAgICAgIC4uLmludGVyZXN0LFxuICAgICAgICAgIHJlc3VsdHM6IGludGVyZXN0LnJlc3VsdHNcbiAgICAgICAgICAgID8gaW50ZXJlc3QucmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICAgICAgcHJvZHVjdCQ6IHRoaXMuZ2V0UHJvZHVjdChyZXN1bHQpLFxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIDogaW50ZXJlc3QucmVzdWx0cyxcbiAgICAgICAgfSkpXG4gICAgICApO1xuXG4gICAgdGhpcy5nZXRJbnRlcmVzdHNsb2FkaW5nJCA9XG4gICAgICB0aGlzLnByb2R1Y3RJbnRlcmVzdFNlcnZpY2UuZ2V0UHJvZHV0SW50ZXJlc3RzTG9hZGluZygpO1xuICAgIHRoaXMuaXNSZW1vdmVEaXNhYmxlZCQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZ2V0SW50ZXJlc3RzbG9hZGluZyQsXG4gICAgICB0aGlzLnByb2R1Y3RJbnRlcmVzdFNlcnZpY2UuZ2V0UmVtb3ZlUHJvZHV0SW50ZXJlc3RMb2FkaW5nKCksXG4gICAgXSkucGlwZShtYXAoKFtnZXRMb2FkaW5nLCByZW1vdmVMb2FkaW5nXSkgPT4gZ2V0TG9hZGluZyB8fCByZW1vdmVMb2FkaW5nKSk7XG5cbiAgICB0aGlzLnNvcnRMYWJlbHMgPSB0aGlzLmdldFNvcnRMYWJlbHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U29ydExhYmVscygpOiBPYnNlcnZhYmxlPHtcbiAgICBieU5hbWVBc2M6IHN0cmluZztcbiAgICBieU5hbWVEZXNjOiBzdHJpbmc7XG4gIH0+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ215SW50ZXJlc3RzLnNvcnRpbmcuYnlOYW1lQXNjJyksXG4gICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ215SW50ZXJlc3RzLnNvcnRpbmcuYnlOYW1lRGVzYycpLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFthc2MsIGRlc2NdKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYnlOYW1lQXNjOiBhc2MsXG4gICAgICAgICAgYnlOYW1lRGVzYzogZGVzYyxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJvZHVjdChcbiAgICBpbnRlcmVzdDogUHJvZHVjdEludGVyZXN0RW50cnlSZWxhdGlvblxuICApOiBPYnNlcnZhYmxlPFByb2R1Y3Q+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9kdWN0U2VydmljZS5nZXQoaW50ZXJlc3QucHJvZHVjdC5jb2RlLCBQcm9kdWN0U2NvcGUuREVUQUlMUyk7XG4gIH1cblxuICByZW1vdmVJbnRlcmVzdChcbiAgICByZWxhdGlvbjogUHJvZHVjdEludGVyZXN0RW50cnlSZWxhdGlvbiAmIHtcbiAgICAgIHByb2R1Y3QkPzogT2JzZXJ2YWJsZTxQcm9kdWN0PjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIHRoaXMucHJvZHVjdEludGVyZXN0U2VydmljZS5yZW1vdmVQcm9kdXRJbnRlcmVzdCh7XG4gICAgICBwcm9kdWN0OiByZWxhdGlvbi5wcm9kdWN0LFxuICAgICAgcHJvZHVjdEludGVyZXN0RW50cnk6IHJlbGF0aW9uLnByb2R1Y3RJbnRlcmVzdEVudHJ5LFxuICAgIH0pO1xuICB9XG5cbiAgc29ydENoYW5nZShzb3J0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNvcnQgPSBzb3J0O1xuICAgIHRoaXMucHJvZHVjdEludGVyZXN0U2VydmljZS5sb2FkUHJvZHVjdEludGVyZXN0cyhcbiAgICAgIHRoaXMuREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICAwLFxuICAgICAgdGhpcy5zb3J0TWFwcGluZ1tzb3J0XVxuICAgICk7XG4gIH1cblxuICBwYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucHJvZHVjdEludGVyZXN0U2VydmljZS5sb2FkUHJvZHVjdEludGVyZXN0cyhcbiAgICAgIHRoaXMuREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICBwYWdlLFxuICAgICAgdGhpcy5zb3J0TWFwcGluZ1t0aGlzLnNvcnRdXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucHJvZHVjdEludGVyZXN0U2VydmljZS5jbGVhclByb2R1Y3RJbnRlcmVzdHMoKTtcbiAgICB0aGlzLnByb2R1Y3RJbnRlcmVzdFNlcnZpY2UucmVzZXRSZW1vdmVJbnRlcmVzdFN0YXRlKCk7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJpbnRlcmVzdHMkIHwgYXN5bmMgYXMgaW50ZXJlc3RzXCIgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cImN4LXByb2R1Y3QtaW50ZXJlc3RzLXRpdGxlIGgzXCI+XG4gICAgPGgzPnt7ICdteUludGVyZXN0cy5oZWFkZXInIHwgY3hUcmFuc2xhdGUgfX08L2gzPlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3gtcHJvZHVjdC1pbnRlcmVzdHMtYm9keVwiXG4gICAgKm5nSWY9XCIhKGdldEludGVyZXN0c2xvYWRpbmckIHwgYXN5bmMpOyBlbHNlIGxvYWRpbmdcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImludGVyZXN0cy5wYWdpbmF0aW9uLnRvdGFsQ291bnQgPiAwOyBlbHNlIG5vSW50ZXJlc3RcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjeC1wcm9kdWN0LWludGVyZXN0cy1zb3J0IHRvcCByb3dcIj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgIGN4LXByb2R1Y3QtaW50ZXJlc3RzLWZvcm0tZ3JvdXBcbiAgICAgICAgICAgIGZvcm0tZ3JvdXBcbiAgICAgICAgICAgIGNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFxuICAgICAgICAgIFwiXG4gICAgICAgICAgPjxzcGFuPnt7ICdteUludGVyZXN0cy5zb3J0QnknIHwgY3hUcmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPGN4LXNvcnRpbmdcbiAgICAgICAgICAgIFtzb3J0T3B0aW9uc109XCJzb3J0T3B0aW9uc1wiXG4gICAgICAgICAgICBbc29ydExhYmVsc109XCJzb3J0TGFiZWxzIHwgYXN5bmNcIlxuICAgICAgICAgICAgKHNvcnRMaXN0RXZlbnQpPVwic29ydENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZE9wdGlvbl09XCJzb3J0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ215SW50ZXJlc3RzLnNvcnRCeScgfCBjeFRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvY3gtc29ydGluZz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICBjeC1wcm9kdWN0LWludGVyZXN0cy1wYWdpbmF0aW9uIGN4LXByb2R1Y3QtaW50ZXJlc3RzLXRoZWFkLW1vYmlsZVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8Y3gtcGFnaW5hdGlvblxuICAgICAgICAgICAgW3BhZ2luYXRpb25dPVwicGFnaW5hdGlvblwiXG4gICAgICAgICAgICAodmlld1BhZ2VFdmVudCk9XCJwYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID48L2N4LXBhZ2luYXRpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBjeC1wcm9kdWN0LWludGVyZXN0cy10YWJsZVwiPlxuICAgICAgICA8dGhlYWQgY2xhc3M9XCJjeC1wcm9kdWN0LWludGVyZXN0cy10aGVhZC1tb2JpbGVcIj5cbiAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5cbiAgICAgICAgICAgIHt7ICdteUludGVyZXN0cy5pdGVtJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlxuICAgICAgICAgICAge3sgJ215SW50ZXJlc3RzLnByaWNlJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5cbiAgICAgICAgICAgIHt7ICdteUludGVyZXN0cy5ub3RpZmljYXRpb25zJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW50ZXJlc3Qgb2YgaW50ZXJlc3RzLnJlc3VsdHNcIlxuICAgICAgICAgICAgY2xhc3M9XCJjeC1wcm9kdWN0LWludGVyZXN0cy1wcm9kdWN0LWl0ZW1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbnRlcmVzdC5wcm9kdWN0JCB8IGFzeW5jIGFzIHByb2R1Y3RcIj5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjeC1wcm9kdWN0LWludGVyZXN0cy1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjeC1wcm9kdWN0LWludGVyZXN0cy1wcm9kdWN0LWltYWdlLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgeyBjeFJvdXRlOiAncHJvZHVjdCcsIHBhcmFtczogcHJvZHVjdCB9IHwgY3hVcmxcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGN4LW1lZGlhXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbnRhaW5lcl09XCJwcm9kdWN0LmltYWdlcz8uUFJJTUFSWVwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PVwidGh1bWJuYWlsXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvY3gtbWVkaWE+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3gtaW5mbyBjb2wtMTBcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjeC1pbmZvLWNvbnRhaW5lciByb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvZHVjdC5uYW1lXCIgY2xhc3M9XCJjeC1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN4LWxpbmsgY3gtcHJvZHVjdC1pbnRlcmVzdHMtcHJvZHVjdC1jb2RlLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGN4Um91dGU6ICdwcm9kdWN0JywgcGFyYW1zOiBwcm9kdWN0IH0gfCBjeFVybFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwcm9kdWN0Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvZHVjdC5jb2RlXCIgY2xhc3M9XCJjeC1jb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnbXlJbnRlcmVzdHMucHJvZHVjdElkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY3hUcmFuc2xhdGU6IHsgY29kZTogcHJvZHVjdC5jb2RlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGJhc2VPcHRpb25zIG9mIHByb2R1Y3QuYmFzZU9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhcmlhbnQgb2YgYmFzZU9wdGlvbnMuc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8udmFyaWFudE9wdGlvblF1YWxpZmllcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjeC1wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN4LWxhYmVsIGN4LXByb2R1Y3QtaW50ZXJlc3RzLXZhcmlhbnQtbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YXJpYW50Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN4LXZhbHVlIGN4LXByb2R1Y3QtaW50ZXJlc3RzLXZhcmlhbnQtdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdmFyaWFudC52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3gtcHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9kdWN0LnN0b2NrLnN0b2NrTGV2ZWxTdGF0dXMgPT09ICdvdXRPZlN0b2NrJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN4LWxhYmVsIGN4LXByb2R1Y3QtaW50ZXJlc3RzLXByb2R1Y3Qtc3RvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnbXlJbnRlcmVzdHMub3V0T2ZTdG9jaycgfCBjeFRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3gtcHJvZHVjdC1pbnRlcmVzdHMtcHJvZHVjdC1wcmljZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtbWQtbm9uZSBjeC1wcm9kdWN0LWludGVyZXN0cy1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnbXlJbnRlcmVzdHMucHJpY2UnIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC5wcmljZS5mb3JtYXR0ZWRWYWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjeC1wcm9kdWN0LWludGVyZXN0cy1zdWJzY3JpcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1tZC1ub25lIGN4LXByb2R1Y3QtaW50ZXJlc3RzLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdteUludGVyZXN0cy5ub3RpZmljYXRpb25zJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjeC1wcm9kdWN0LWludGVyZXN0cy1ub3RpZmljYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW50ZXJlc3RFbnRyeSBvZiBpbnRlcmVzdC5wcm9kdWN0SW50ZXJlc3RFbnRyeVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3gtcHJvZHVjdC1pbnRlcmVzdHMtdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAnbXlJbnRlcmVzdHMuJyArIGludGVyZXN0RW50cnkuaW50ZXJlc3RUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgY3hUcmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3gtcHJvZHVjdC1pbnRlcmVzdHMtZXhwaXJhdGlvbi1kYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdteUludGVyZXN0cy5leHBpcmF0aW9uRGF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjeFRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uRGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdEVudHJ5LmV4cGlyYXRpb25EYXRlIHwgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN4LWFjdGlvbnMgY3gtcHJvZHVjdC1pbnRlcmVzdHMtcmVtb3ZlLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaW5rIGN4LXByb2R1Y3QtaW50ZXJlc3RzLXJlbW92ZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZW1vdmVEaXNhYmxlZCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVJbnRlcmVzdChpbnRlcmVzdClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyAnbXlJbnRlcmVzdHMucmVtb3ZlJyB8IGN4VHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPGRpdiBjbGFzcz1cImN4LXByb2R1Y3QtaW50ZXJlc3RzLXNvcnQgYm90dG9tIHJvd1wiPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICAgY3gtcHJvZHVjdC1pbnRlcmVzdHMtZm9ybS1ncm91cCBjeC1wcm9kdWN0LWludGVyZXN0cy10aGVhZC1tb2JpbGVcbiAgICAgICAgICAgIGZvcm0tZ3JvdXBcbiAgICAgICAgICAgIGNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNFxuICAgICAgICAgIFwiXG4gICAgICAgICAgPjxzcGFuPnt7ICdteUludGVyZXN0cy5zb3J0QnknIHwgY3hUcmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPGN4LXNvcnRpbmdcbiAgICAgICAgICAgIFtzb3J0T3B0aW9uc109XCJzb3J0T3B0aW9uc1wiXG4gICAgICAgICAgICBbc29ydExhYmVsc109XCJzb3J0TGFiZWxzIHwgYXN5bmNcIlxuICAgICAgICAgICAgKHNvcnRMaXN0RXZlbnQpPVwic29ydENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZE9wdGlvbl09XCJzb3J0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ215SW50ZXJlc3RzLnNvcnRCeScgfCBjeFRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvY3gtc29ydGluZz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN4LXByb2R1Y3QtaW50ZXJlc3RzLXBhZ2luYXRpb25cIj5cbiAgICAgICAgICA8Y3gtcGFnaW5hdGlvblxuICAgICAgICAgICAgW3BhZ2luYXRpb25dPVwicGFnaW5hdGlvblwiXG4gICAgICAgICAgICAodmlld1BhZ2VFdmVudCk9XCJwYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID48L2N4LXBhZ2luYXRpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG48bmctdGVtcGxhdGUgI25vSW50ZXJlc3Q+XG4gIDxkaXYgY2xhc3M9XCJjeC1wcm9kdWN0LWludGVyZXN0cy1tZXNzYWdlXCI+XG4gICAge3sgJ215SW50ZXJlc3RzLm5vSW50ZXJlc3RzJyB8IGN4VHJhbnNsYXRlIH19XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGRpdiBjbGFzcz1cImN4LXNwaW5uZXJcIj5cbiAgICA8Y3gtc3Bpbm5lcj48L2N4LXNwaW5uZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==