UNPKG

ngx-tinymce

Version:
174 lines 19.9 kB
import { Component, forwardRef, Input, ChangeDetectionStrategy, ChangeDetectorRef, TemplateRef, ViewEncapsulation, Output, EventEmitter, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { ScriptService } from './tinymce.script.service'; import { TinymceOptions } from './tinymce.options'; export class TinymceComponent { constructor(defConfig, ss, cd) { this.defConfig = defConfig; this.ss = ss; this.cd = cd; this.load = true; this.id = `_tinymce-${Math.random().toString(36).substring(2)}`; this._disabled = false; /** 延迟初始化 */ this.delay = 0; this.ready = new EventEmitter(); } set disabled(value) { this._disabled = value; this.setDisabled(); } set loading(value) { if (value instanceof TemplateRef) { this._loading = null; this._loadingTpl = value; } else { this._loading = value; } } get instance() { return this._instance; } initDelay() { if (this.delay > 0) { setTimeout(() => this.init(), this.delay); } else { this.init(); } } init() { if (!window.tinymce) throw new Error('tinymce js文件加载失败'); const { defConfig, config, id } = this; if (this._instance) return; if (defConfig.baseURL) { let url = '' + defConfig.baseURL; if (url.endsWith('/')) url = url.substr(0, url.length - 1); tinymce.baseURL = url; } const userOptions = Object.assign({}, defConfig.config, config); const options = Object.assign({ selector: `#` + id, }, defConfig.config, config, { setup: (editor) => { this._instance = editor; editor.on('change keyup', () => { this.value = editor.getContent(); this.onChange(this.value); this.cd.detectChanges(); }); if (typeof userOptions.setup === 'function') { userOptions.setup(editor); } }, init_instance_callback: (editor) => { if (editor && this.value) editor.setContent(this.value); this.setDisabled(); if (typeof userOptions.init_instance_callback === 'function') { userOptions.init_instance_callback(editor); } this.ready.emit(this._instance); }, }); if (userOptions.auto_focus) { options.auto_focus = id; } tinymce.init(options); this.load = false; this.cd.detectChanges(); } destroy() { if (!this._instance) { return; } this._instance.off(); this._instance.remove('#' + this.id); this._instance = null; } setDisabled() { if (!this._instance) return; this._instance.setMode(this._disabled ? 'readonly' : 'design'); } ngAfterViewInit() { // 已经存在对象无须进入懒加载模式 if (window.tinymce) { this.initDelay(); return; } const { defConfig } = this; const baseURL = defConfig && defConfig.baseURL; const fileName = defConfig && defConfig.fileName; this.ss .load((baseURL || './assets/tinymce/') + (fileName || 'tinymce.min.js')) .getChangeEmitter() .subscribe(() => this.initDelay()); } ngOnChanges(changes) { if (this._instance && changes.config) { this.destroy(); this.initDelay(); } } ngOnDestroy() { this.destroy(); } // reuse-tab: http://ng-alain.com/components/reuse-tab#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F _onReuseInit() { this.destroy(); this.initDelay(); } writeValue(value) { // value should be NOT NULL this.value = value || ''; if (this._instance) { this._instance.setContent(this.value); } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; this.setDisabled(); } } TinymceComponent.decorators = [ { type: Component, args: [{ selector: 'tinymce', template: "<textarea id=\"{{id}}\" [placeholder]=\"placeholder\" class=\"tinymce-selector\"></textarea>\n<div class=\"loading\" *ngIf=\"load\">\n <ng-container *ngIf=\"_loading; else _loadingTpl\">{{_loading}}</ng-container>\n</div>\n", encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TinymceComponent), multi: true, }, ], changeDetection: ChangeDetectionStrategy.OnPush, styles: [`tinymce .tinymce-selector { display: none; }`] }] } ]; /** @nocollapse */ TinymceComponent.ctorParameters = () => [ { type: TinymceOptions }, { type: ScriptService }, { type: ChangeDetectorRef } ]; TinymceComponent.propDecorators = { config: [{ type: Input }], placeholder: [{ type: Input }], disabled: [{ type: Input }], loading: [{ type: Input }], delay: [{ type: Input }], ready: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlueW1jZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtdGlueW1jZS8iLCJzb3VyY2VzIjpbInNyYy90aW55bWNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFHVixLQUFLLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixXQUFXLEVBRVgsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFtQm5ELE1BQU0sT0FBTyxnQkFBZ0I7SUFxQzNCLFlBQ1UsU0FBeUIsRUFDekIsRUFBaUIsRUFDakIsRUFBcUI7UUFGckIsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDekIsT0FBRSxHQUFGLEVBQUUsQ0FBZTtRQUNqQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQXJDL0IsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLE9BQUUsR0FBRyxZQUFZLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFZbkQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQWExQixZQUFZO1FBQ0gsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNULFVBQUssR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBVXZDLENBQUM7SUE5QkosSUFDSSxRQUFRLENBQUMsS0FBYztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUtELElBQ0ksT0FBTyxD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Z0JBQ3JDLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDO3dCQUMvQyxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTt5QkFUckMsOENBQThDO2FBVXpEOzs7O1lBbEJRLGNBQWM7WUFEZCxhQUFhO1lBUnBCLGlCQUFpQjs7O3FCQXFDaEIsS0FBSzswQkFDTCxLQUFLO3VCQUNMLEtBQUs7c0JBU0wsS0FBSztvQkFVTCxLQUFLO29CQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBmb3J3YXJkUmVmLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgSW5wdXQsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBUZW1wbGF0ZVJlZixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU2NyaXB0U2VydmljZSB9IGZyb20gJy4vdGlueW1jZS5zY3JpcHQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRpbnltY2VPcHRpb25zIH0gZnJvbSAnLi90aW55bWNlLm9wdGlvbnMnO1xyXG5cclxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcclxuZGVjbGFyZSBjb25zdCB0aW55bWNlOiBhbnk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RpbnltY2UnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90aW55bWNlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZXM6IFsgYHRpbnltY2UgLnRpbnltY2Utc2VsZWN0b3IgeyBkaXNwbGF5OiBub25lOyB9YCBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaW55bWNlQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaW55bWNlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBwcml2YXRlIF9pbnN0YW5jZTogYW55O1xyXG4gIHByaXZhdGUgdmFsdWU6IHN0cmluZztcclxuICBsb2FkID0gdHJ1ZTtcclxuICBpZCA9IGBfdGlueW1jZS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKX1gO1xyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcclxuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZDtcclxuXHJcbiAgQElucHV0KCkgY29uZmlnOiBhbnk7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcclxuICAgIHRoaXMuc2V0RGlzYWJsZWQoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgX2xvYWRpbmc6IHN0cmluZztcclxuICBfbG9hZGluZ1RwbDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKVxyXG4gIHNldCBsb2FkaW5nKHZhbHVlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+KSB7XHJcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xyXG4gICAgICB0aGlzLl9sb2FkaW5nID0gbnVsbDtcclxuICAgICAgdGhpcy5fbG9hZGluZ1RwbCA9IHZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fbG9hZGluZyA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKiog5bu26L+f5Yid5aeL5YyWICovXHJcbiAgQElucHV0KCkgZGVsYXkgPSAwO1xyXG4gIEBPdXRwdXQoKSByZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBnZXQgaW5zdGFuY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZGVmQ29uZmlnOiBUaW55bWNlT3B0aW9ucyxcclxuICAgIHByaXZhdGUgc3M6IFNjcmlwdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHt9XHJcblxyXG4gIHByaXZhdGUgaW5pdERlbGF5KCkge1xyXG4gICAgaWYgKHRoaXMuZGVsYXkgPiAwKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbml0KCksIHRoaXMuZGVsYXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQoKSB7XHJcbiAgICBpZiAoIXdpbmRvdy50aW55bWNlKSB0aHJvdyBuZXcgRXJyb3IoJ3RpbnltY2UganPmlofku7bliqDovb3lpLHotKUnKTtcclxuXHJcbiAgICBjb25zdCB7IGRlZkNvbmZpZywgY29uZmlnLCBpZCB9ID0gdGhpcztcclxuICAgIGlmICh0aGlzLl9pbnN0YW5jZSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChkZWZDb25maWcuYmFzZVVSTCkge1xyXG4gICAgICBsZXQgdXJsID0gJycgKyBkZWZDb25maWcuYmFzZVVSTDtcclxuICAgICAgaWYgKHVybC5lbmRzV2l0aCgnLycpKSB1cmwgPSB1cmwuc3Vic3RyKDAsIHVybC5sZW5ndGggLSAxKTtcclxuICAgICAgdGlueW1jZS5iYXNlVVJMID0gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVzZXJPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmQ29uZmlnLmNvbmZpZywgY29uZmlnKTtcclxuXHJcbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAge1xyXG4gICAgICAgIHNlbGVjdG9yOiBgI2AgKyBpZCxcclxuICAgICAgfSxcclxuICAgICAgZGVmQ29uZmlnLmNvbmZpZyxcclxuICAgICAgY29uZmlnLFxyXG4gICAgICB7XHJcbiAgICAgICAgc2V0dXA6IChlZGl0b3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBlZGl0b3I7XHJcbiAgICAgICAgICBlZGl0b3Iub24oJ2NoYW5nZSBrZXl1cCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGVkaXRvci5nZXRDb250ZW50KCk7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHVzZXJPcHRpb25zLnNldHVwID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHVzZXJPcHRpb25zLnNldHVwKGVkaXRvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpbml0X2luc3RhbmNlX2NhbGxiYWNrOiAoZWRpdG9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChlZGl0b3IgJiYgdGhpcy52YWx1ZSkgZWRpdG9yLnNldENvbnRlbnQodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLnNldERpc2FibGVkKCk7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHVzZXJPcHRpb25zLmluaXRfaW5zdGFuY2VfY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdXNlck9wdGlvbnMuaW5pdF9pbnN0YW5jZV9jYWxsYmFjayhlZGl0b3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZWFkeS5lbWl0KHRoaXMuX2luc3RhbmNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuICAgIGlmICh1c2VyT3B0aW9ucy5hdXRvX2ZvY3VzKSB7XHJcbiAgICAgIG9wdGlvbnMuYXV0b19mb2N1cyA9IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIHRpbnltY2UuaW5pdChvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLmxvYWQgPSBmYWxzZTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95KCkge1xyXG4gICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pbnN0YW5jZS5vZmYoKTtcclxuICAgIHRoaXMuX2luc3RhbmNlLnJlbW92ZSgnIycgKyB0aGlzLmlkKTtcclxuICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RGlzYWJsZWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSByZXR1cm47XHJcbiAgICB0aGlzLl9pbnN0YW5jZS5zZXRNb2RlKHRoaXMuX2Rpc2FibGVkID8gJ3JlYWRvbmx5JyA6ICdkZXNpZ24nKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIOW3sue7j+WtmOWcqOWvueixoeaXoOmhu+i/m+WFpeaHkuWKoOi9veaooeW8j1xyXG4gICAgaWYgKHdpbmRvdy50aW55bWNlKSB7XHJcbiAgICAgIHRoaXMuaW5pdERlbGF5KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IGRlZkNvbmZpZyB9ID0gdGhpcztcclxuICAgIGNvbnN0IGJhc2VVUkwgPSBkZWZDb25maWcgJiYgZGVmQ29uZmlnLmJhc2VVUkw7XHJcbiAgICBjb25zdCBmaWxlTmFtZSA9IGRlZkNvbmZpZyAmJiBkZWZDb25maWcuZmlsZU5hbWU7XHJcbiAgICB0aGlzLnNzXHJcbiAgICAgIC5sb2FkKChiYXNlVVJMIHx8ICcuL2Fzc2V0cy90aW55bWNlLycpICsgKGZpbGVOYW1lIHx8ICd0aW55bWNlLm1pbi5qcycpKVxyXG4gICAgICAuZ2V0Q2hhbmdlRW1pdHRlcigpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5pbml0RGVsYXkoKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faW5zdGFuY2UgJiYgY2hhbmdlcy5jb25maWcpIHtcclxuICAgICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMuaW5pdERlbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gcmV1c2UtdGFiOiBodHRwOi8vbmctYWxhaW4uY29tL2NvbXBvbmVudHMvcmV1c2UtdGFiIyVFNyU5NCU5RiVFNSU5MSVCRCVFNSU5MSVBOCVFNiU5QyU5RlxyXG4gIF9vblJldXNlSW5pdCgpIHtcclxuICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgdGhpcy5pbml0RGVsYXkoKTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gdmFsdWUgc2hvdWxkIGJlIE5PVCBOVUxMXHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUgfHwgJyc7XHJcbiAgICBpZiAodGhpcy5faW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5faW5zdGFuY2Uuc2V0Q29udGVudCh0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBhbnkpID0+IHt9KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB7fSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB0aGlzLnNldERpc2FibGVkKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==