UNPKG

cocori-ng

Version:

Cocori-ng is an Angular full of great components & utilites based on Material

160 lines 28.8 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core'; import { UntypedFormBuilder, UntypedFormControl } from '@angular/forms'; import { MatBottomSheet } from '@angular/material/bottom-sheet'; import { FormHelperService, InjectComponentService, } from 'cocori-ng/src/feature-core'; import { CocoringWysiwygComponent } from 'cocori-ng/src/feature-form'; import { debounceTime, filter, takeUntil, tap } from 'rxjs/operators'; import { CmsService } from '../../../core/service/cms.service'; import { ExtendPreviewActionsComponent } from '../../extend-preview-actions.component'; import { CocoringCmsImageUploadComponent } from '../cocoring-cms-image-upload/cocoring-cms-image-upload.component'; import { CocoringCmsSectionActionsComponent } from '../cocoring-cms-section-actions/cocoring-cms-section-actions.component'; import * as i0 from "@angular/core"; export class ExtendSectionTplComponent extends ExtendPreviewActionsComponent { constructor(injector) { super(injector); this.nameControl = 'editor'; this.backgroundImageControl = 'backgroundImage'; this.isUploading = false; this.readOnly = false; this.injectComponentService = injector.get(InjectComponentService); this.fb = injector.get(UntypedFormBuilder); this._bottomSheet = injector.get(MatBottomSheet); this.cdr = injector.get(ChangeDetectorRef); this.cmsService = injector.get(CmsService); this.formHelper = injector.get(FormHelperService); } init(nbEditorView, nbBackgroundImage = 0) { this.nbEditorView = nbEditorView; this.nbBackgroundImage = nbBackgroundImage; this.buildForm(); this.catalogBlocksOpenedEvent(); this.onBackgroundColorEvent(); } buildForm() { this.formulaire = this.fb.group({}); this.configsWysiwyg = []; for (let i = 1; i <= this.nbEditorView; i++) { const nameControl = `${this.nameControl}${i}`; this.formulaire.addControl(nameControl, new UntypedFormControl(this.initSectionValue(nameControl))); this.configsWysiwyg[nameControl] = this.configComponent(nameControl); } for (let i = 1; i <= this.nbBackgroundImage; i++) { const nameControl = `${this.backgroundImageControl}${i}`; this.formulaire.addControl(nameControl, new UntypedFormControl(this.initSectionValue(nameControl))); } this.saveSectionValues(); this.onSectionValuesChanged(); } onBackgroundFileUploadedCallback(nameControl, apiFileUploaded) { this.formulaire.get(nameControl).setValue(apiFileUploaded); } removeBackgroundFileCallback(nameControl) { this.formulaire.get(nameControl).reset(); this.saveSectionValues(); this.cdr.detectChanges(); } /** ex valeur du formulaire : {editor1: "<h1>coucou</h1>", editor2: "<h1>hello</h1>"} */ onSectionValuesChanged() { this.formulaire.valueChanges.pipe(takeUntil(this.destroy$), debounceTime(500), tap((values) => { this.section.values = values; this.cdr.detectChanges(); })).subscribe(); } saveSectionValues() { this.section.values = this.formulaire.value; } initSectionValue(nameControl) { const blockContent = this.section.values; const blockValue = blockContent?.hasOwnProperty(nameControl) ? blockContent[nameControl] : null; const sectionValue = this.section.values?.hasOwnProperty(nameControl) ? this.section.values[nameControl] : null; return sectionValue || blockValue; } configComponent(nameControl) { let config = { apiFile: this.apisConfig.apiFile, apiFileDownload: this.apisConfig.apiFileDownload, apiKey: this.apisConfig.apiKey, params: { inline: true }, nameLabel: '', formGroup: this.formulaire, nameControl: nameControl, validators: [] }; return config; } catalogBlocksOpenedEvent() { this.cmsService.catalogBlocksOpened$.pipe(takeUntil(this.destroy$), tap((isOpened) => { this.readOnly = isOpened; if (isOpened && this.formHelper.countControlsForm(this.formulaire) > 0) { this.value = this.formulaire.value; } }), tap(_ => this.cdr.detectChanges())).subscribe(); } /** @param : tableau des références où seront ajouter le composant Wysiwyg */ addWysiwygComponentToViewEvent(refs) { for (let i = 1; i <= refs.length; i++) { const nameControl = `${this.nameControl}${i}`; this.injectComponentService.loadAndAddComponentToContainer(CocoringWysiwygComponent, refs[i - 1], { config: this.configsWysiwyg[nameControl] }, null); } } addImageUploadComponentToViewEvent(refs) { for (let i = 1; i <= refs.length; i++) { const nameControl = `${this.backgroundImageControl}${i}`; this.injectComponentService.loadAndAddComponentToContainer(CocoringCmsImageUploadComponent, refs[i - 1], { section: this.section, apisConfig: this.apisConfig, nameBackgroundImage: nameControl }, { apiFileUploaded: (apiFile) => this.onBackgroundFileUploadedCallback(nameControl, apiFile), removeBackgroundImage: () => this.removeBackgroundFileCallback(nameControl) }); } } onBackgroundColorEvent() { this.cmsService.backgroundColor$.pipe(takeUntil(this.destroy$), filter((idSection) => idSection === this.section.id), tap(_ => this.cdr.detectChanges())).subscribe(); } openBottomSheet() { if (!this.readOnly) return; const bottomSheet = this._bottomSheet.open(CocoringCmsSectionActionsComponent, { panelClass: 'bottom-sheet-container', data: { section: this.section, } }); bottomSheet.afterDismissed().pipe(takeUntil(this.destroy$)).subscribe((datas) => { if (!datas) return; switch (datas.action) { case 'remove': this.cmsService.removeSection(this.section.id); break; case 'duplicate': this.cmsService.duplicateSection(this.section); break; case 'backgroundColor': this.saveSectionBackgroundColor(datas.value); break; default: break; } }); } saveSectionBackgroundColor(color) { this.section.backgroundColor = color; } } ExtendSectionTplComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: ExtendSectionTplComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); ExtendSectionTplComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.1", type: ExtendSectionTplComponent, selector: "extend-section-tpl", inputs: { section: "section", apisConfig: "apisConfig" }, host: { classAttribute: "input-form" }, usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: ExtendSectionTplComponent, decorators: [{ type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'extend-section-tpl', template: '', host: { 'class': 'input-form' }, }] }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { section: [{ type: Input }], apisConfig: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5kLXNlY3Rpb24tdHBsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvY29yaS1uZy9zcmMvZmVhdHVyZS1jbXMvc2hhcmVkL2NvbXBvbmVudC1jbXMtZWRpdG9yL2NvY29yaW5nLWNtcy1zZWN0aW9uL2V4dGVuZC1zZWN0aW9uLXRwbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUVULEtBQUssR0FHUixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFFSCxpQkFBaUIsRUFFakIsc0JBQXNCLEdBRXpCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUXRFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUNuSCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3RUFBd0UsQ0FBQzs7QUFTNUgsTUFBTSxPQUFnQix5QkFBMEIsU0FBUSw2QkFBNkI7SUF5QmpGLFlBQVksUUFBa0I7UUFDMUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBYnBCLGdCQUFXLEdBQVcsUUFBUSxDQUFBO1FBQzlCLDJC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QUFRLEVBQUUsRUFBRTtvQkFDWixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFO2lCQUNsQzsrRkFHWSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCb3R0b21TaGVldCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JvdHRvbS1zaGVldCc7XHJcbmltcG9ydCB7XHJcbiAgICBGaWxlTW9kZWwsXHJcbiAgICBGb3JtSGVscGVyU2VydmljZSxcclxuICAgIEluaXRXeXNpd3lnLFxyXG4gICAgSW5qZWN0Q29tcG9uZW50U2VydmljZSxcclxuICAgIFd5c2l3eWdDb25maWdTZWN0aW9uLFxyXG59IGZyb20gJ2NvY29yaS1uZy9zcmMvZmVhdHVyZS1jb3JlJztcclxuaW1wb3J0IHsgQ29jb3JpbmdXeXNpd3lnQ29tcG9uZW50IH0gZnJvbSAnY29jb3JpLW5nL3NyYy9mZWF0dXJlLWZvcm0nO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgQXBpc0NvbmZpZ0Ntc01vZGVsLFxyXG4gICAgQm90dG9tU2hlZXRTZWN0aW9uUmV0dXJuQWN0aW9uLFxyXG4gICAgRWRpdG9yVmFsdWVzLFxyXG4gICAgU2VjdGlvbk1vZGVsLFxyXG59IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvY21zLm1vZGVsJztcclxuaW1wb3J0IHsgQ21zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9jbXMuc2VydmljZSc7XHJcbmltcG9ydCB7IEV4dGVuZFByZXZpZXdBY3Rpb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZXh0ZW5kLXByZXZpZXctYWN0aW9ucy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb2NvcmluZ0Ntc0ltYWdlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi4vY29jb3JpbmctY21zLWltYWdlLXVwbG9hZC9jb2NvcmluZy1jbXMtaW1hZ2UtdXBsb2FkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvY29yaW5nQ21zU2VjdGlvbkFjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuLi9jb2NvcmluZy1jbXMtc2VjdGlvbi1hY3Rpb25zL2NvY29yaW5nLWNtcy1zZWN0aW9uLWFjdGlvbnMuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBzZWxlY3RvcjogJ2V4dGVuZC1zZWN0aW9uLXRwbCcsXHJcbiAgICB0ZW1wbGF0ZTogJycsXHJcbiAgICBob3N0OiB7ICdjbGFzcyc6ICdpbnB1dC1mb3JtJyB9LFxyXG59KVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEV4dGVuZFNlY3Rpb25UcGxDb21wb25lbnQgZXh0ZW5kcyBFeHRlbmRQcmV2aWV3QWN0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgICBASW5wdXQoKSBzZWN0aW9uOiBTZWN0aW9uTW9kZWxcclxuICAgIEBJbnB1dCgpIGFwaXNDb25maWc6IEFwaXNDb25maWdDbXNNb2RlbFxyXG5cclxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcjtcclxuICAgIHByaXZhdGUgX2JvdHRvbVNoZWV0OiBNYXRCb3R0b21TaGVldDtcclxuICAgIHB1YmxpYyBjZHI6IGFueTtcclxuICAgIHB1YmxpYyBjbXNTZXJ2aWNlOiBDbXNTZXJ2aWNlO1xyXG5cclxuICAgIGZvcm11bGFpcmU6IFVudHlwZWRGb3JtR3JvdXBcclxuICAgIG5iRWRpdG9yVmlldzogbnVtYmVyXHJcbiAgICBuYkJhY2tncm91bmRJbWFnZTogbnVtYmVyO1xyXG5cclxuICAgIG5hbWVDb250cm9sOiBzdHJpbmcgPSAnZWRpdG9yJ1xyXG4gICAgYmFja2dyb3VuZEltYWdlQ29udHJvbDogc3RyaW5nID0gJ2JhY2tncm91bmRJbWFnZSdcclxuICAgIGJhY2tncm91bmRJbWFnZVVwbG9hZDogRmlsZU1vZGVsXHJcbiAgICB1cGxvYWRQcm9ncmVzczogbnVtYmVyO1xyXG4gICAgaXNVcGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25maWdzV3lzaXd5ZzogV3lzaXd5Z0NvbmZpZ1NlY3Rpb25bXTtcclxuICAgIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICB2YWx1ZTogYW55O1xyXG4gICAgZm9ybUhlbHBlcjogRm9ybUhlbHBlclNlcnZpY2U7XHJcbiAgICBpbmplY3RDb21wb25lbnRTZXJ2aWNlOiBJbmplY3RDb21wb25lbnRTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbmplY3RDb21wb25lbnRTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KEluamVjdENvbXBvbmVudFNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuZmIgPSBpbmplY3Rvci5nZXQoVW50eXBlZEZvcm1CdWlsZGVyKTtcclxuICAgICAgICB0aGlzLl9ib3R0b21TaGVldCA9IGluamVjdG9yLmdldChNYXRCb3R0b21TaGVldCk7XHJcbiAgICAgICAgdGhpcy5jZHIgPSBpbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gICAgICAgIHRoaXMuY21zU2VydmljZSA9IGluamVjdG9yLmdldChDbXNTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmZvcm1IZWxwZXIgPSBpbmplY3Rvci5nZXQoRm9ybUhlbHBlclNlcnZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQobmJFZGl0b3JWaWV3OiBudW1iZXIsIG5iQmFja2dyb3VuZEltYWdlOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgdGhpcy5uYkVkaXRvclZpZXcgPSBuYkVkaXRvclZpZXdcclxuICAgICAgICB0aGlzLm5iQmFja2dyb3VuZEltYWdlID0gbmJCYWNrZ3JvdW5kSW1hZ2VcclxuXHJcbiAgICAgICAgdGhpcy5idWlsZEZvcm0oKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYXRhbG9nQmxvY2tzT3BlbmVkRXZlbnQoKVxyXG5cclxuICAgICAgICB0aGlzLm9uQmFja2dyb3VuZENvbG9yRXZlbnQoKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRGb3JtKCkge1xyXG4gICAgICAgIHRoaXMuZm9ybXVsYWlyZSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xyXG4gICAgICAgIHRoaXMuY29uZmlnc1d5c2l3eWcgPSBbXVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLm5iRWRpdG9yVmlldzsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWVDb250cm9sOiBzdHJpbmcgPSBgJHt0aGlzLm5hbWVDb250cm9sfSR7aX1gXHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvcm11bGFpcmUuYWRkQ29udHJvbChuYW1lQ29udHJvbCwgbmV3IFVudHlwZWRGb3JtQ29udHJvbCh0aGlzLmluaXRTZWN0aW9uVmFsdWUobmFtZUNvbnRyb2wpKSlcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnc1d5c2l3eWdbbmFtZUNvbnRyb2xdID0gdGhpcy5jb25maWdDb21wb25lbnQobmFtZUNvbnRyb2wpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLm5iQmFja2dyb3VuZEltYWdlOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZUNvbnRyb2w6IHN0cmluZyA9IGAke3RoaXMuYmFja2dyb3VuZEltYWdlQ29udHJvbH0ke2l9YFxyXG5cclxuICAgICAgICAgICAgdGhpcy5mb3JtdWxhaXJlLmFkZENvbnRyb2wobmFtZUNvbnRyb2wsIG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodGhpcy5pbml0U2VjdGlvblZhbHVlKG5hbWVDb250cm9sKSkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZWN0aW9uVmFsdWVzKClcclxuXHJcbiAgICAgICAgdGhpcy5vblNlY3Rpb25WYWx1ZXNDaGFuZ2VkKClcclxuICAgIH1cclxuXHJcbiAgICBvbkJhY2tncm91bmRGaWxlVXBsb2FkZWRDYWxsYmFjayhuYW1lQ29udHJvbDogc3RyaW5nLCBhcGlGaWxlVXBsb2FkZWQ6IHN0cmluZywpIHtcclxuICAgICAgICB0aGlzLmZvcm11bGFpcmUuZ2V0KG5hbWVDb250cm9sKS5zZXRWYWx1ZShhcGlGaWxlVXBsb2FkZWQpXHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQmFja2dyb3VuZEZpbGVDYWxsYmFjayhuYW1lQ29udHJvbDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtdWxhaXJlLmdldChuYW1lQ29udHJvbCkucmVzZXQoKVxyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZWN0aW9uVmFsdWVzKClcclxuXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIGV4IHZhbGV1ciBkdSBmb3JtdWxhaXJlIDoge2VkaXRvcjE6IFwiPGgxPmNvdWNvdTwvaDE+XCIsIGVkaXRvcjI6IFwiPGgxPmhlbGxvPC9oMT5cIn0gKi9cclxuICAgIHByaXZhdGUgb25TZWN0aW9uVmFsdWVzQ2hhbmdlZCgpIHtcclxuICAgICAgICB0aGlzLmZvcm11bGFpcmUudmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXHJcbiAgICAgICAgICAgIHRhcCgodmFsdWVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VjdGlvbi52YWx1ZXMgPSB2YWx1ZXNcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApLnN1YnNjcmliZSgpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlU2VjdGlvblZhbHVlcygpIHtcclxuICAgICAgICB0aGlzLnNlY3Rpb24udmFsdWVzID0gdGhpcy5mb3JtdWxhaXJlLnZhbHVlXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0U2VjdGlvblZhbHVlKG5hbWVDb250cm9sOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBibG9ja0NvbnRlbnQ6IEVkaXRvclZhbHVlcyA9IHRoaXMuc2VjdGlvbi52YWx1ZXNcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tWYWx1ZTogc3RyaW5nID0gYmxvY2tDb250ZW50Py5oYXNPd25Qcm9wZXJ0eShuYW1lQ29udHJvbCkgPyBibG9ja0NvbnRlbnRbbmFtZUNvbnRyb2xdIDogbnVsbFxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25WYWx1ZTogc3RyaW5nID0gdGhpcy5zZWN0aW9uLnZhbHVlcz8uaGFzT3duUHJvcGVydHkobmFtZUNvbnRyb2wpID8gdGhpcy5zZWN0aW9uLnZhbHVlc1tuYW1lQ29udHJvbF0gOiBudWxsXHJcblxyXG4gICAgICAgIHJldHVybiBzZWN0aW9uVmFsdWUgfHwgYmxvY2tWYWx1ZVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29uZmlnQ29tcG9uZW50KG5hbWVDb250cm9sOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY29uZmlnID0ge1xyXG4gICAgICAgICAgICBhcGlGaWxlOiB0aGlzLmFwaXNDb25maWcuYXBpRmlsZSxcclxuICAgICAgICAgICAgYXBpRmlsZURvd25sb2FkOiB0aGlzLmFwaXNDb25maWcuYXBpRmlsZURvd25sb2FkLFxyXG4gICAgICAgICAgICBhcGlLZXk6IHRoaXMuYXBpc0NvbmZpZy5hcGlLZXksXHJcbiAgICAgICAgICAgIHBhcmFtczogPEluaXRXeXNpd3lnPntcclxuICAgICAgICAgICAgICAgIGlubGluZTogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lTGFiZWw6ICcnLFxyXG4gICAgICAgICAgICBmb3JtR3JvdXA6IHRoaXMuZm9ybXVsYWlyZSxcclxuICAgICAgICAgICAgbmFtZUNvbnRyb2w6IG5hbWVDb250cm9sLFxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzOiBbXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZ1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2F0YWxvZ0Jsb2Nrc09wZW5lZEV2ZW50KCkge1xyXG4gICAgICAgIHRoaXMuY21zU2VydmljZS5jYXRhbG9nQmxvY2tzT3BlbmVkJC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgICAgIHRhcCgoaXNPcGVuZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVhZE9ubHkgPSBpc09wZW5lZFxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc09wZW5lZCAmJiB0aGlzLmZvcm1IZWxwZXIuY291bnRDb250cm9sc0Zvcm0odGhpcy5mb3JtdWxhaXJlKSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5mb3JtdWxhaXJlLnZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0YXAoXyA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCkpXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0gOiB0YWJsZWF1IGRlcyByw6lmw6lyZW5jZXMgb8O5IHNlcm9udCBham91dGVyIGxlIGNvbXBvc2FudCBXeXNpd3lnICovXHJcbiAgICBwdWJsaWMgYWRkV3lzaXd5Z0NvbXBvbmVudFRvVmlld0V2ZW50KHJlZnM6IFZpZXdDb250YWluZXJSZWZbXSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHJlZnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZUNvbnRyb2w6IHN0cmluZyA9IGAke3RoaXMubmFtZUNvbnRyb2x9JHtpfWBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0Q29tcG9uZW50U2VydmljZS5sb2FkQW5kQWRkQ29tcG9uZW50VG9Db250YWluZXIoQ29jb3JpbmdXeXNpd3lnQ29tcG9uZW50LCByZWZzW2kgLSAxXSxcclxuICAgICAgICAgICAgICAgIHsgY29uZmlnOiB0aGlzLmNvbmZpZ3NXeXNpd3lnW25hbWVDb250cm9sXSB9LCBudWxsKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkSW1hZ2VVcGxvYWRDb21wb25lbnRUb1ZpZXdFdmVudChyZWZzOiBWaWV3Q29udGFpbmVyUmVmW10pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSByZWZzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWVDb250cm9sOiBzdHJpbmcgPSBgJHt0aGlzLmJhY2tncm91bmRJbWFnZUNvbnRyb2x9JHtpfWBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0Q29tcG9uZW50U2VydmljZS5sb2FkQW5kQWRkQ29tcG9uZW50VG9Db250YWluZXIoQ29jb3JpbmdDbXNJbWFnZVVwbG9hZENvbXBvbmVudCwgcmVmc1tpIC0gMV0sXHJcbiAgICAgICAgICAgICAgICB7IHNlY3Rpb246IHRoaXMuc2VjdGlvbiwgYXBpc0NvbmZpZzogdGhpcy5hcGlzQ29uZmlnLCBuYW1lQmFja2dyb3VuZEltYWdlOiBuYW1lQ29udHJvbCB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUZpbGVVcGxvYWRlZDogKGFwaUZpbGU6IHN0cmluZykgPT4gdGhpcy5vbkJhY2tncm91bmRGaWxlVXBsb2FkZWRDYWxsYmFjayhuYW1lQ29udHJvbCwgYXBpRmlsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmFja2dyb3VuZEltYWdlOiAoKSA9PiB0aGlzLnJlbW92ZUJhY2tncm91bmRGaWxlQ2FsbGJhY2sobmFtZUNvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQmFja2dyb3VuZENvbG9yRXZlbnQoKSB7XHJcbiAgICAgICAgdGhpcy5jbXNTZXJ2aWNlLmJhY2tncm91bmRDb2xvciQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgICAgICBmaWx0ZXIoKGlkU2VjdGlvbjogc3RyaW5nKSA9PiBpZFNlY3Rpb24gPT09IHRoaXMuc2VjdGlvbi5pZCksXHJcbiAgICAgICAgICAgIHRhcChfID0+IHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Cb3R0b21TaGVldCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVhZE9ubHkpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgYm90dG9tU2hlZXQgPSB0aGlzLl9ib3R0b21TaGVldC5vcGVuKENvY29yaW5nQ21zU2VjdGlvbkFjdGlvbnNDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgcGFuZWxDbGFzczogJ2JvdHRvbS1zaGVldC1jb250YWluZXInLFxyXG4gICAgICAgICAgICBkYXRhOiA8YW55PntcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IHRoaXMuc2VjdGlvbixcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBib3R0b21TaGVldC5hZnRlckRpc21pc3NlZCgpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgICAgICkuc3Vic2NyaWJlKChkYXRhczogQm90dG9tU2hlZXRTZWN0aW9uUmV0dXJuQWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZGF0YXMpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoZGF0YXMuYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdmUnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY21zU2VydmljZS5yZW1vdmVTZWN0aW9uKHRoaXMuc2VjdGlvbi5pZClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnZHVwbGljYXRlJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNtc1NlcnZpY2UuZHVwbGljYXRlU2VjdGlvbih0aGlzLnNlY3Rpb24pXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2JhY2tncm91bmRDb2xvcic6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlU2VjdGlvbkJhY2tncm91bmRDb2xvcihkYXRhcy52YWx1ZSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlU2VjdGlvbkJhY2tncm91bmRDb2xvcihjb2xvcjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZWN0aW9uLmJhY2tncm91bmRDb2xvciA9IGNvbG9yXHJcbiAgICB9XHJcbn1cclxuIl19