cocori-ng
Version:
Cocori-ng is an Angular full of great components & utilites based on Material
142 lines • 24.8 kB
JavaScript
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { WysiwygService, } from 'cocori-ng/src/feature-core';
import { debounceTime, takeUntil, tap } from 'rxjs/operators';
import { DefaultConfigComponent, UploaderService } from '../../../core';
import { ExtendInputsComponent } from '../form/inputs/extend-inputs/extend-inputs.component';
import * as i0 from "@angular/core";
import * as i1 from "cocori-ng/src/feature-core";
import * as i2 from "../../../core";
import * as i3 from "@angular/common";
import * as i4 from "@angular/forms";
import * as i5 from "../error-handler/input-error-handler/cocoring-input-error.component";
import * as i6 from "@tinymce/tinymce-angular";
// Doc composant TinyMCE - Angular
// https://www.tiny.cloud/docs/integrations/angular/#supportedangularversions
// file : https://www.tiny.cloud/docs/demo/file-picker/
export class CocoringWysiwygComponent extends ExtendInputsComponent {
constructor(injector, wysiwygService, uploaderService, cdr) {
super(injector);
this.wysiwygService = wysiwygService;
this.uploaderService = uploaderService;
this.cdr = cdr;
this.fileModel = { fileName: null, description: null };
this.height = 500;
this.inline = false;
this.menubar = true;
this.plugins = DefaultConfigComponent.wysiwyg.plugins;
this.toolbar = DefaultConfigComponent.wysiwyg.toolbar;
this.quickbarsInsert = DefaultConfigComponent.wysiwyg.quickbarsInsert;
}
set config(config) {
if (!config) {
throw new Error(`La config du composant uploader n'est pas correcte... config: ${config}`);
}
this.apiKey = config.apiKey;
this.apisFile = { apiFile: config.apiFile, apiFileDownload: config.apiFileDownload };
this.configInput(config);
this.handleParamsWysiwyg(config.params);
this.addControlForm();
}
handleParamsWysiwyg(params) {
if (!params)
return;
const height = params.height || this.height;
const inline = params.inline || this.inline;
const menubar = params.menubar || this.menubar;
const plugins = params.plugins || this.plugins;
const quickbars = params.quickbars || this.quickbarsInsert;
const toolbar = params.toolbar ? this.wysiwygService.toolbarOptionsToString(params.toolbar) : this.toolbar;
this.initParams = {
placeholder: 'Ecrivez quelque chose',
toolbar_mode: 'scrolling',
language: 'fr_FR',
resize: false,
height: height,
inline: inline,
image_advtab: true,
menubar: 'file edit insert format table tools',
// menubar: false,
toolbar: toolbar,
// toolbar: false,
contextmenu: false,
plugins: plugins,
quickbars_selection_toolbar: 'bold italic underline forecolor backcolor | fontsizeselect | alignleft | aligncenter | alignright | quicklink | removeformat',
quickbars_insert_toolbar: quickbars,
image_title: true,
automatic_uploads: true,
paste_data_images: true,
setup: editor => {
this.editor = editor;
editor.on('OpenWindow', (eventDetails) => {
this.uploadImageDialogInstance = eventDetails.dialog;
});
editor.on('init', () => { });
editor.on('change', () => { });
},
file_picker_types: 'image',
// https://www.tiny.cloud/docs/configure/file-image-upload/
file_picker_callback: (cb, value, meta) => this.filePickerCallback(cb, value, meta)
};
}
ngOnInit() {
this.uploaderService.apisFile = this.apisFile;
this.onFileUploaded();
this.onError();
this.onValueEditorChanged();
}
filePickerCallback(cb, value, meta) {
this.callbackFileUplad = cb;
var input = document.createElement('input');
input.setAttribute('type', 'file');
input.setAttribute('accept', 'image/*');
input.onchange = () => {
this.uploadImageDialogInstance.block('Uploading file...');
this.fileUploaded = input.files[0];
this.fileModel.fileName = this.fileUploaded.name;
this.cdr.detectChanges();
this.uploaderService.uploadFile(this.fileUploaded);
};
input.click();
}
onFileUploaded() {
this.uploaderService.fileUploaded$.pipe(takeUntil(this.destroy$), tap((id) => this.validateFileValue(id)), tap(_ => this.uploadImageDialogInstance.unblock())).subscribe();
}
onError() {
this.uploaderService.fileOnError$.pipe(takeUntil(this.destroy$), tap(_ => this.uploadImageDialogInstance.unblock()), tap(_ => this.uploadImageDialogInstance.close()), tap(_ => {
this.editor.notificationManager.open({
text: 'Une erreur est survenue, veuillez réessayer',
type: 'error'
});
})).subscribe();
}
onValueEditorChanged() {
this.formGroup.get(this.nameControl).valueChanges.pipe(takeUntil(this.destroy$), debounceTime(400), tap(_ => this.cdr.detectChanges())).subscribe();
}
validateFileValue(id) {
this.fileModel.id = id;
this.callbackFileUplad(this.apisFile.apiFile(id), { title: this.fileModel.fileName });
}
}
CocoringWysiwygComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CocoringWysiwygComponent, deps: [{ token: i0.Injector }, { token: i1.WysiwygService }, { token: i2.UploaderService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
CocoringWysiwygComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.1", type: CocoringWysiwygComponent, selector: "cocoring-wysiwyg", inputs: { apiKey: "apiKey", height: "height", inline: "inline", menubar: "menubar", plugins: "plugins", toolbar: "toolbar", quickbarsInsert: "quickbarsInsert", config: "config" }, providers: [WysiwygService, UploaderService], usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\r\n <editor #tinymce [formControlName]=\"nameControl\" [apiKey]=\"apiKey\" [init]=\"initParams\"></editor>\r\n <mat-error *ngIf=\"formGroup.get(nameControl).errors\" error-handler [form]=\"formGroup\" [controlName]=\"nameControl\">\r\n </mat-error>\r\n</div>", styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.CocoringInputErrorComponent, selector: "[error-handler]", inputs: ["form", "controlName"] }, { kind: "component", type: i6.EditorComponent, selector: "editor", inputs: ["cloudChannel", "apiKey", "init", "id", "initialValue", "outputFormat", "inline", "tagName", "plugins", "toolbar", "modelEvents", "allowedEvents", "ignoreEvents", "disabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CocoringWysiwygComponent, decorators: [{
type: Component,
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'cocoring-wysiwyg', providers: [WysiwygService, UploaderService], template: "<div [formGroup]=\"formGroup\">\r\n <editor #tinymce [formControlName]=\"nameControl\" [apiKey]=\"apiKey\" [init]=\"initParams\"></editor>\r\n <mat-error *ngIf=\"formGroup.get(nameControl).errors\" error-handler [form]=\"formGroup\" [controlName]=\"nameControl\">\r\n </mat-error>\r\n</div>", styles: [":host{display:block;width:100%}\n"] }]
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.WysiwygService }, { type: i2.UploaderService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { apiKey: [{
type: Input
}], height: [{
type: Input
}], inline: [{
type: Input
}], menubar: [{
type: Input
}], plugins: [{
type: Input
}], toolbar: [{
type: Input
}], quickbarsInsert: [{
type: Input
}], config: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29jb3Jpbmctd3lzaXd5Zy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Nvcmktbmcvc3JjL2ZlYXR1cmUtZm9ybS9zaGFyZWQvY29tcG9uZW50L3d5c2l3eWcvY29jb3Jpbmctd3lzaXd5Zy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Nvcmktbmcvc3JjL2ZlYXR1cmUtZm9ybS9zaGFyZWQvY29tcG9uZW50L3d5c2l3eWcvY29jb3Jpbmctd3lzaXd5Zy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBWSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxFQU1MLGNBQWMsR0FDZixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0RBQXNELENBQUM7Ozs7Ozs7O0FBRTdGLGtDQUFrQztBQUNsQyw2RUFBNkU7QUFDN0UsdURBQXVEO0FBU3ZELE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxxQkFBcUI7SUFpRmpFLFlBQ0UsUUFBa0IsRUFDVixjQUE4QixFQUMvQixlQUFnQyxFQUMvQixHQUFzQjtRQUM5QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFIUixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBakZoQyxjQUFTLEdBQWMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFdBQVcs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QUMsWUFBWSxDQUFDLElBQUksQ0FDcEQsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQ25DLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDZixDQUFDO0lBRU8saUJBQWlCLENBQUMsRUFBVTtRQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7UUFFdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN4RixDQUFDOztxSEE1SlUsd0JBQXdCO3lHQUF4Qix3QkFBd0IsK05BRnhCLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxpREN2QjlDLHVTQUlNOzJGRHFCTyx3QkFBd0I7a0JBUHBDLFNBQVM7c0NBQ1MsdUJBQXVCLENBQUMsTUFBTSxZQUNyQyxrQkFBa0IsYUFHakIsQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDOzBMQVFuQyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQU9GLE1BQU07c0JBRFQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIENvbmZpZ0FQSXNGaWxlLFxyXG4gIENvbmZpZ1d5c2l3eWdNb2RlbCxcclxuICBGaWxlTW9kZWwsXHJcbiAgSW5pdFd5c2l3eWcsXHJcbiAgUGx1Z2luc0F2YWlsYWJsZSxcclxuICBXeXNpd3lnU2VydmljZSxcclxufSBmcm9tICdjb2Nvcmktbmcvc3JjL2ZlYXR1cmUtY29yZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBEZWZhdWx0Q29uZmlnQ29tcG9uZW50LCBVcGxvYWRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcclxuaW1wb3J0IHsgRXh0ZW5kSW5wdXRzQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9pbnB1dHMvZXh0ZW5kLWlucHV0cy9leHRlbmQtaW5wdXRzLmNvbXBvbmVudCc7XHJcblxyXG4vLyBEb2MgY29tcG9zYW50IFRpbnlNQ0UgLSBBbmd1bGFyXHJcbi8vIGh0dHBzOi8vd3d3LnRpbnkuY2xvdWQvZG9jcy9pbnRlZ3JhdGlvbnMvYW5ndWxhci8jc3VwcG9ydGVkYW5ndWxhcnZlcnNpb25zXHJcbi8vIGZpbGUgOiBodHRwczovL3d3dy50aW55LmNsb3VkL2RvY3MvZGVtby9maWxlLXBpY2tlci9cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHNlbGVjdG9yOiAnY29jb3Jpbmctd3lzaXd5ZycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvY29yaW5nLXd5c2l3eWcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvY29yaW5nLXd5c2l3eWcuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtXeXNpd3lnU2VydmljZSwgVXBsb2FkZXJTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29jb3JpbmdXeXNpd3lnQ29tcG9uZW50IGV4dGVuZHMgRXh0ZW5kSW5wdXRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBpbml0UGFyYW1zOiBhbnlcclxuICBlZGl0b3I6IGFueVxyXG4gIGFwaXNGaWxlOiBDb25maWdBUElzRmlsZVxyXG4gIGZpbGVNb2RlbDogRmlsZU1vZGVsID0geyBmaWxlTmFtZTogbnVsbCwgZGVzY3JpcHRpb246IG51bGwgfVxyXG5cclxuICBASW5wdXQoKSBhcGlLZXk6IHN0cmluZztcclxuICBASW5wdXQoKSBoZWlnaHQ6IG51bWJlciA9IDUwMDtcclxuICBASW5wdXQoKSBpbmxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBtZW51YmFyOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBwbHVnaW5zOiBQbHVnaW5zQXZhaWxhYmxlW10gPSA8UGx1Z2luc0F2YWlsYWJsZVtdPkRlZmF1bHRDb25maWdDb21wb25lbnQud3lzaXd5Zy5wbHVnaW5zO1xyXG4gIEBJbnB1dCgpIHRvb2xiYXI6IHN0cmluZyA9IERlZmF1bHRDb25maWdDb21wb25lbnQud3lzaXd5Zy50b29sYmFyO1xyXG4gIEBJbnB1dCgpIHF1aWNrYmFyc0luc2VydDogc3RyaW5nID0gRGVmYXVsdENvbmZpZ0NvbXBvbmVudC53eXNpd3lnLnF1aWNrYmFyc0luc2VydDtcclxuICBjYWxsYmFja0ZpbGVVcGxhZDogYW55O1xyXG4gIGZpbGVVcGxvYWRlZDogRmlsZTtcclxuICB1cGxvYWRJbWFnZURpYWxvZ0luc3RhbmNlOiBhbnk7XHJcblxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb25maWcoY29uZmlnOiBDb25maWdXeXNpd3lnTW9kZWwpIHtcclxuICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGEgY29uZmlnIGR1IGNvbXBvc2FudCB1cGxvYWRlciBuJ2VzdCBwYXMgY29ycmVjdGUuLi4gY29uZmlnOiAke2NvbmZpZ31gKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFwaUtleSA9IGNvbmZpZy5hcGlLZXlcclxuXHJcbiAgICB0aGlzLmFwaXNGaWxlID0geyBhcGlGaWxlOiBjb25maWcuYXBpRmlsZSwgYXBpRmlsZURvd25sb2FkOiBjb25maWcuYXBpRmlsZURvd25sb2FkIH1cclxuXHJcbiAgICB0aGlzLmNvbmZpZ0lucHV0KGNvbmZpZylcclxuXHJcbiAgICB0aGlzLmhhbmRsZVBhcmFtc1d5c2l3eWcoY29uZmlnLnBhcmFtcylcclxuXHJcbiAgICB0aGlzLmFkZENvbnRyb2xGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVBhcmFtc1d5c2l3eWcocGFyYW1zOiBJbml0V3lzaXd5Zykge1xyXG4gICAgaWYgKCFwYXJhbXMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBoZWlnaHQgPSBwYXJhbXMuaGVpZ2h0IHx8IHRoaXMuaGVpZ2h0XHJcbiAgICBjb25zdCBpbmxpbmUgPSBwYXJhbXMuaW5saW5lIHx8IHRoaXMuaW5saW5lXHJcbiAgICBjb25zdCBtZW51YmFyID0gcGFyYW1zLm1lbnViYXIgfHwgdGhpcy5tZW51YmFyXHJcbiAgICBjb25zdCBwbHVnaW5zID0gcGFyYW1zLnBsdWdpbnMgfHwgdGhpcy5wbHVnaW5zXHJcbiAgICBjb25zdCBxdWlja2JhcnMgPSBwYXJhbXMucXVpY2tiYXJzIHx8IHRoaXMucXVpY2tiYXJzSW5zZXJ0XHJcbiAgICBjb25zdCB0b29sYmFyID0gcGFyYW1zLnRvb2xiYXIgPyB0aGlzLnd5c2l3eWdTZXJ2aWNlLnRvb2xiYXJPcHRpb25zVG9TdHJpbmcocGFyYW1zLnRvb2xiYXIpIDogdGhpcy50b29sYmFyXHJcblxyXG4gICAgdGhpcy5pbml0UGFyYW1zID0ge1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ0Vjcml2ZXogcXVlbHF1ZSBjaG9zZScsXHJcbiAgICAgIHRvb2xiYXJfbW9kZTogJ3Njcm9sbGluZycsIC8vIGh0dHBzOi8vd3d3LnRpbnkuY2xvdWQvZG9jcy9jb25maWd1cmUvZWRpdG9yLWFwcGVhcmFuY2UvI3Rvb2xiYXJfc3RpY2t5XHJcbiAgICAgIGxhbmd1YWdlOiAnZnJfRlInLFxyXG4gICAgICByZXNpemU6IGZhbHNlLFxyXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcclxuICAgICAgaW5saW5lOiBpbmxpbmUsXHJcbiAgICAgIGltYWdlX2FkdnRhYjogdHJ1ZSxcclxuICAgICAgbWVudWJhcjogJ2ZpbGUgZWRpdCBpbnNlcnQgZm9ybWF0IHRhYmxlIHRvb2xzJyxcclxuICAgICAgLy8gbWVudWJhcjogZmFsc2UsXHJcbiAgICAgIHRvb2xiYXI6IHRvb2xiYXIsXHJcbiAgICAgIC8vIHRvb2xiYXI6IGZhbHNlLFxyXG4gICAgICBjb250ZXh0bWVudTogZmFsc2UsXHJcbiAgICAgIHBsdWdpbnM6IHBsdWdpbnMsXHJcbiAgICAgIHF1aWNrYmFyc19zZWxlY3Rpb25fdG9vbGJhcjogJ2JvbGQgaXRhbGljIHVuZGVybGluZSBmb3JlY29sb3IgYmFja2NvbG9yIHwgZm9udHNpemVzZWxlY3QgfCBhbGlnbmxlZnQgfCBhbGlnbmNlbnRlciB8IGFsaWducmlnaHQgfCBxdWlja2xpbmsgfCByZW1vdmVmb3JtYXQnLFxyXG4gICAgICBxdWlja2JhcnNfaW5zZXJ0X3Rvb2xiYXI6IHF1aWNrYmFycyxcclxuICAgICAgaW1hZ2VfdGl0bGU6IHRydWUsXHJcbiAgICAgIGF1dG9tYXRpY191cGxvYWRzOiB0cnVlLFxyXG4gICAgICBwYXN0ZV9kYXRhX2ltYWdlczogdHJ1ZSxcclxuICAgICAgc2V0dXA6IGVkaXRvciA9PiB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XHJcblxyXG4gICAgICAgIGVkaXRvci5vbignT3BlbldpbmRvdycsIChldmVudERldGFpbHMpID0+IHtcclxuICAgICAgICAgIHRoaXMudXBsb2FkSW1hZ2VEaWFsb2dJbnN0YW5jZSA9IGV2ZW50RGV0YWlscy5kaWFsb2c7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVkaXRvci5vbignaW5pdCcsICgpID0+IHsgfSk7XHJcblxyXG4gICAgICAgIGVkaXRvci5vbignY2hhbmdlJywgKCkgPT4geyB9KTtcclxuICAgICAgfSxcclxuICAgICAgZmlsZV9waWNrZXJfdHlwZXM6ICdpbWFnZScsXHJcbiAgICAgIC8vIGh0dHBzOi8vd3d3LnRpbnkuY2xvdWQvZG9jcy9jb25maWd1cmUvZmlsZS1pbWFnZS11cGxvYWQvXHJcbiAgICAgIGZpbGVfcGlja2VyX2NhbGxiYWNrOiAoY2IsIHZhbHVlLCBtZXRhKSA9PiB0aGlzLmZpbGVQaWNrZXJDYWxsYmFjayhjYiwgdmFsdWUsIG1ldGEpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByaXZhdGUgd3lzaXd5Z1NlcnZpY2U6IFd5c2l3eWdTZXJ2aWNlLFxyXG4gICAgcHVibGljIHVwbG9hZGVyU2VydmljZTogVXBsb2FkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLnVwbG9hZGVyU2VydmljZS5hcGlzRmlsZSA9IHRoaXMuYXBpc0ZpbGVcclxuXHJcbiAgICB0aGlzLm9uRmlsZVVwbG9hZGVkKClcclxuXHJcbiAgICB0aGlzLm9uRXJyb3IoKVxyXG5cclxuICAgIHRoaXMub25WYWx1ZUVkaXRvckNoYW5nZWQoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWxlUGlja2VyQ2FsbGJhY2soY2IsIHZhbHVlLCBtZXRhKSB7XHJcbiAgICB0aGlzLmNhbGxiYWNrRmlsZVVwbGFkID0gY2JcclxuXHJcbiAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG5cclxuICAgIGlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsICdmaWxlJyk7XHJcbiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FjY2VwdCcsICdpbWFnZS8qJyk7XHJcblxyXG4gICAgaW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBsb2FkSW1hZ2VEaWFsb2dJbnN0YW5jZS5ibG9jaygnVXBsb2FkaW5nIGZpbGUuLi4nKTtcclxuXHJcbiAgICAgIHRoaXMuZmlsZVVwbG9hZGVkID0gaW5wdXQuZmlsZXNbMF07XHJcblxyXG4gICAgICB0aGlzLmZpbGVNb2RlbC5maWxlTmFtZSA9IHRoaXMuZmlsZVVwbG9hZGVkLm5hbWVcclxuXHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG5cclxuICAgICAgdGhpcy51cGxvYWRlclNlcnZpY2UudXBsb2FkRmlsZSh0aGlzLmZpbGVVcGxvYWRlZClcclxuICAgIH1cclxuXHJcbiAgICBpbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkZpbGVVcGxvYWRlZCgpIHtcclxuICAgIHRoaXMudXBsb2FkZXJTZXJ2aWNlLmZpbGVVcGxvYWRlZCQucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICB0YXAoKGlkOiBzdHJpbmcpID0+IHRoaXMudmFsaWRhdGVGaWxlVmFsdWUoaWQpKSxcclxuICAgICAgdGFwKF8gPT4gdGhpcy51cGxvYWRJbWFnZURpYWxvZ0luc3RhbmNlLnVuYmxvY2soKSksXHJcbiAgICApLnN1YnNjcmliZSgpXHJcbiAgfVxyXG4gIHByaXZhdGUgb25FcnJvcigpIHtcclxuICAgIHRoaXMudXBsb2FkZXJTZXJ2aWNlLmZpbGVPbkVycm9yJC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgIHRhcChfID0+IHRoaXMudXBsb2FkSW1hZ2VEaWFsb2dJbnN0YW5jZS51bmJsb2NrKCkpLFxyXG4gICAgICB0YXAoXyA9PiB0aGlzLnVwbG9hZEltYWdlRGlhbG9nSW5zdGFuY2UuY2xvc2UoKSksXHJcbiAgICAgIHRhcChfID0+IHtcclxuICAgICAgICB0aGlzLmVkaXRvci5ub3RpZmljYXRpb25NYW5hZ2VyLm9wZW4oe1xyXG4gICAgICAgICAgdGV4dDogJ1VuZSBlcnJldXIgZXN0IHN1cnZlbnVlLCB2ZXVpbGxleiByw6llc3NheWVyJyxcclxuICAgICAgICAgIHR5cGU6ICdlcnJvcidcclxuICAgICAgICB9KTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uVmFsdWVFZGl0b3JDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMubmFtZUNvbnRyb2wpLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgIGRlYm91bmNlVGltZSg0MDApLFxyXG4gICAgICB0YXAoXyA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCkpLFxyXG4gICAgKS5zdWJzY3JpYmUoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUZpbGVWYWx1ZShpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZpbGVNb2RlbC5pZCA9IGlkXHJcblxyXG4gICAgdGhpcy5jYWxsYmFja0ZpbGVVcGxhZCh0aGlzLmFwaXNGaWxlLmFwaUZpbGUoaWQpLCB7IHRpdGxlOiB0aGlzLmZpbGVNb2RlbC5maWxlTmFtZSB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxyXG4gIDxlZGl0b3IgI3RpbnltY2UgW2Zvcm1Db250cm9sTmFtZV09XCJuYW1lQ29udHJvbFwiIFthcGlLZXldPVwiYXBpS2V5XCIgW2luaXRdPVwiaW5pdFBhcmFtc1wiPjwvZWRpdG9yPlxyXG4gIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KG5hbWVDb250cm9sKS5lcnJvcnNcIiBlcnJvci1oYW5kbGVyIFtmb3JtXT1cImZvcm1Hcm91cFwiIFtjb250cm9sTmFtZV09XCJuYW1lQ29udHJvbFwiPlxyXG4gIDwvbWF0LWVycm9yPlxyXG48L2Rpdj4iXX0=