UNPKG

ngx-firebase-cms

Version:

Angular Content Management System using Google Firebase (Authentication, Storage & Firestore)

335 lines 31.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, ViewChild, EventEmitter, Renderer2, Inject, forwardRef } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { EditorService } from '../../service/editor.service'; import { EditorToolbarComponent } from '../editor-toolbar/editor-toolbar.component'; import { angularEditorConfig } from '../../interface/editor'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; export class EditorComponent { /** * @param {?} _renderer * @param {?} editorService * @param {?} _document */ constructor(_renderer, editorService, _document) { this._renderer = _renderer; this.editorService = editorService; this._document = _document; this.modeVisual = true; this.showPlaceholder = false; this.id = ''; this.config = angularEditorConfig; this.viewMode = new EventEmitter(); this.blur = new EventEmitter(); this.focus = new EventEmitter(); } /** * @return {?} */ ngOnInit() { this.editorToolbar.id = this.id; this.editorToolbar.fonts = this.config.fonts ? this.config.fonts : angularEditorConfig.fonts; this.editorToolbar.customClasses = this.config.customClasses; this.editorService.uploadUrl = this.config.uploadUrl; if (this.config.showToolbar !== undefined) { this.editorToolbar.showToolbar = this.config.showToolbar; } if (this.config.defaultParagraphSeparator) { this.editorService.setDefaultParagraphSeparator(this.config.defaultParagraphSeparator); } } /** * @return {?} */ ngAfterContentInit() { if (this.config.defaultFontName) { this.editorToolbar.defaultFontId = this.config.defaultFontName ? this.editorToolbar.fonts.findIndex((/** * @param {?} x * @return {?} */ x => { return x.name === this.config.defaultFontName; })) : 0; this.editorToolbar.fontId = this.editorToolbar.defaultFontId; this.onEditorFocus(); this.editorService.setFontName(this.config.defaultFontName); } else { this.editorToolbar.defaultFontId = 0; this.editorToolbar.fontId = 0; } if (this.config.defaultFontSize) { this.editorToolbar.fontSize = this.config.defaultFontSize; this.onEditorFocus(); this.editorService.setFontSize(this.config.defaultFontSize); } } /** * @param {?} command * @return {?} */ executeCommand(command) { if (command === 'toggleEditorMode') { this.toggleEditorMode(this.modeVisual); } else if (command !== '') { this.editorService.executeCommand(command); this.exec(); } this.onEditorFocus(); } /** * @return {?} */ onTextAreaFocus() { this.focus.emit('focus'); } /** * @param {?} event * @return {?} */ onTextAreaBlur(event) { this.editorService.saveSelection(); if (typeof this.onTouched === 'function') { this.onTouched(); } if (event.relatedTarget != null && ((/** @type {?} */ (event.relatedTarget))).parentElement.className !== 'angular-editor-toolbar-set') { this.blur.emit('blur'); } } /** * @return {?} */ onEditorFocus() { this.textArea.nativeElement.focus(); } /** * @param {?} html * @return {?} */ onContentChange(html) { if (typeof this.onChange === 'function') { this.onChange(html); if ((!html || html === '<br>' || html === '') !== this.showPlaceholder) { this.togglePlaceholder(this.showPlaceholder); } } } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @param {?} value * @return {?} */ writeValue(value) { if ((!value || value === '<br>' || value === '') !== this.showPlaceholder) { this.togglePlaceholder(this.showPlaceholder); } if (value === null || value === undefined || value === '' || value === '<br>') { value = null; } this.refreshView(value); } /** * @param {?} value * @return {?} */ refreshView(value) { /** @type {?} */ const normalizedValue = value === null ? '' : value; this._renderer.setProperty(this.textArea.nativeElement, 'innerHTML', normalizedValue); return; } /** * @param {?} value * @return {?} */ togglePlaceholder(value) { if (!value) { this._renderer.addClass(this.editorWrapper.nativeElement, 'show-placeholder'); this.showPlaceholder = true; } else { this._renderer.removeClass(this.editorWrapper.nativeElement, 'show-placeholder'); this.showPlaceholder = false; } } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { /** @type {?} */ const div = this.textArea.nativeElement; /** @type {?} */ const action = isDisabled ? 'addClass' : 'removeClass'; this._renderer[action](div, 'disabled'); } /** * @param {?} bToSource * @return {?} */ toggleEditorMode(bToSource) { /** @type {?} */ let oContent; /** @type {?} */ const editableElement = this.textArea.nativeElement; if (bToSource) { oContent = this._document.createTextNode(editableElement.innerHTML); editableElement.innerHTML = ''; /** @type {?} */ const oPre = this._document.createElement('pre'); oPre.setAttribute("style", "margin: 0; outline: none;"); /** @type {?} */ const oCode = this._document.createElement('code'); editableElement.contentEditable = false; oCode.id = "sourceText"; oCode.setAttribute("style", "white-space: pre-wrap; word-break: keep-all; margin: 0; outline: none; background-color: #fff5b9;"); oCode.contentEditable = 'true'; oCode.appendChild(oContent); oPre.appendChild(oCode); editableElement.appendChild(oPre); this._document.execCommand("defaultParagraphSeparator", false, "div"); this.modeVisual = false; this.viewMode.emit(false); oCode.focus(); } else { if (this._document.all) { editableElement.innerHTML = editableElement.innerText; } else { oContent = this._document.createRange(); oContent.selectNodeContents(editableElement.firstChild); editableElement.innerHTML = oContent.toString(); } editableElement.contentEditable = true; this.modeVisual = true; this.viewMode.emit(true); this.onContentChange(editableElement.innerHTML); editableElement.focus(); } this.editorToolbar.setEditorMode(!this.modeVisual); } /** * @return {?} */ exec() { this.editorToolbar.triggerButtons(); /** @type {?} */ let userSelection; if (window.getSelection) { userSelection = window.getSelection(); } /** @type {?} */ let a = userSelection.focusNode; /** @type {?} */ const els = []; while (a && a.id !== 'editor') { els.unshift(a); a = a.parentNode; } this.editorToolbar.triggerBlocks(els); } } EditorComponent.decorators = [ { type: Component, args: [{ selector: 'aq-editor', template: "<div (focus)=\"onEditorFocus()\" class=\"angular-editor\" id=\"angularEditor\" [style.width]=\"config.width\" [style.minWidth]=\"config.minWidth\">\n <aq-editor-toolbar #editorToolbar (execute)=\"executeCommand($event)\"></aq-editor-toolbar>\n <div class=\"angular-editor-wrapper\" #editorWrapper>\n <div #editor id=\"editor\" class=\"angular-editor-textarea\" [attr.contenteditable]=\"config.editable\"\n [attr.translate]=\"config.translate\" [attr.spellcheck]=\"config.spellcheck\" [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\" [style.maxHeight]=\"config.maxHeight\"\n (input)=\"onContentChange($event.target.innerHTML)\" (focus)=\"onTextAreaFocus()\" (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\" (keyup)=\"exec()\">\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n</div>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => EditorComponent)), multi: true } ], styles: [".angular-editor{position:relative}.angular-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);color:#868e96;opacity:1}.angular-editor .angular-editor-wrapper{position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border:1px solid #ddd;background-color:transparent;overflow-x:hidden;overflow-y:auto;z-index:2;position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea.focus,.angular-editor .angular-editor-wrapper .angular-editor-textarea:focus{outline:0}.angular-editor .angular-editor-wrapper .angular-editor-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.angular-editor .angular-editor-wrapper ::ng-deep p{margin-bottom:0}.angular-editor .angular-editor-wrapper .angular-editor-placeholder{display:none;position:absolute;top:0;padding:.5rem .8rem 1rem .9rem;z-index:1;color:#6c757d;opacity:.75}.angular-editor .angular-editor-wrapper.show-placeholder .angular-editor-placeholder{display:block}.angular-editor .angular-editor-wrapper.disabled{cursor:not-allowed;opacity:.5;pointer-events:none}"] }] } ]; /** @nocollapse */ EditorComponent.ctorParameters = () => [ { type: Renderer2 }, { type: EditorService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; EditorComponent.propDecorators = { id: [{ type: Input }], config: [{ type: Input }], textArea: [{ type: ViewChild, args: ['editor',] }], editorWrapper: [{ type: ViewChild, args: ['editorWrapper',] }], editorToolbar: [{ type: ViewChild, args: ['editorToolbar',] }], html: [{ type: Output }], viewMode: [{ type: Output }], blur: [{ type: Output }], focus: [{ type: Output }] }; if (false) { /** * @type {?} * @private */ EditorComponent.prototype.onChange; /** * @type {?} * @private */ EditorComponent.prototype.onTouched; /** @type {?} */ EditorComponent.prototype.placeholder; /** @type {?} */ EditorComponent.prototype.modeVisual; /** @type {?} */ EditorComponent.prototype.showPlaceholder; /** @type {?} */ EditorComponent.prototype.id; /** @type {?} */ EditorComponent.prototype.config; /** @type {?} */ EditorComponent.prototype.textArea; /** @type {?} */ EditorComponent.prototype.editorWrapper; /** @type {?} */ EditorComponent.prototype.editorToolbar; /** @type {?} */ EditorComponent.prototype.html; /** @type {?} */ EditorComponent.prototype.viewMode; /** @type {?} */ EditorComponent.prototype.blur; /** @type {?} */ EditorComponent.prototype.focus; /** * @type {?} * @private */ EditorComponent.prototype._renderer; /** * @type {?} * @private */ EditorComponent.prototype.editorService; /** * @type {?} * @private */ EditorComponent.prototype._document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1maXJlYmFzZS1jbXMvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlL2VkaXRvci9lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQXVCLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBY3pFLE1BQU0sT0FBTyxlQUFlOzs7Ozs7SUFrQjFCLFlBQ1UsU0FBb0IsRUFDcEIsYUFBNEIsRUFDVixTQUFjO1FBRmhDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDVixjQUFTLEdBQVQsU0FBUyxDQUFLO1FBZjFDLGVBQVUsR0FBRyxJQUFJLENBQUE7UUFDakIsb0JBQWUsR0FBRyxLQUFLLENBQUE7UUFDZCxPQUFFLEdBQUcsRUFBRSxDQUFBO1FBQ1AsV0FBTSxHQUF3QixtQkFBbUIsQ0FBQTtRQUtoRCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQTtRQUN0QyxTQUFJLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUE7UUFDdkQsVUFBSyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFBO0lBTWxFLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEs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O0lBQ3hDLENBQUM7OztZQTFNRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLHk1QkFBc0M7Z0JBRXRDLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVTs7O3dCQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsRUFBQzt3QkFDOUMsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7O2FBQ0Y7Ozs7WUFsQm1FLFNBQVM7WUFFcEUsYUFBYTs0Q0FzQ2pCLE1BQU0sU0FBQyxRQUFROzs7aUJBYmpCLEtBQUs7cUJBQ0wsS0FBSzt1QkFDTCxTQUFTLFNBQUMsUUFBUTs0QkFDbEIsU0FBUyxTQUFDLGVBQWU7NEJBQ3pCLFNBQVMsU0FBQyxlQUFlO21CQUN6QixNQUFNO3VCQUNOLE1BQU07bUJBQ04sTUFBTTtvQkFDTixNQUFNOzs7Ozs7O0lBZFAsbUNBQXlDOzs7OztJQUN6QyxvQ0FBNkI7O0lBRTdCLHNDQUFvQjs7SUFDcEIscUNBQWlCOztJQUNqQiwwQ0FBdUI7O0lBQ3ZCLDZCQUFnQjs7SUFDaEIsaUNBQTBEOztJQUMxRCxtQ0FBa0M7O0lBQ2xDLHdDQUE4Qzs7SUFDOUMsd0NBQWlFOztJQUNqRSwrQkFBYzs7SUFDZCxtQ0FBZ0Q7O0lBQ2hELCtCQUFpRTs7SUFDakUsZ0NBQWtFOzs7OztJQUdoRSxvQ0FBNEI7Ozs7O0lBQzVCLHdDQUFvQzs7Ozs7SUFDcEMsb0NBQXdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgRXZlbnRFbWl0dGVyLCBSZW5kZXJlcjIsIEluamVjdCwgZm9yd2FyZFJlZiwgQWZ0ZXJDb250ZW50SW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4uL2VkaXRvci10b29sYmFyL2VkaXRvci10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yQ29uZmlnLCBhbmd1bGFyRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL2VkaXRvcic7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FxLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lZGl0b3IuY29tcG9uZW50LmNzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEVkaXRvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlckNvbnRlbnRJbml0IHtcblxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZFxuXG4gIHBsYWNlaG9sZGVyOiBib29sZWFuXG4gIG1vZGVWaXN1YWwgPSB0cnVlXG4gIHNob3dQbGFjZWhvbGRlciA9IGZhbHNlXG4gIEBJbnB1dCgpIGlkID0gJydcbiAgQElucHV0KCkgY29uZmlnOiBBbmd1bGFyRWRpdG9yQ29uZmlnID0gYW5ndWxhckVkaXRvckNvbmZpZ1xuICBAVmlld0NoaWxkKCdlZGl0b3InKSB0ZXh0QXJlYTogYW55XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcldyYXBwZXInKSBlZGl0b3JXcmFwcGVyOiBhbnlcbiAgQFZpZXdDaGlsZCgnZWRpdG9yVG9vbGJhcicpIGVkaXRvclRvb2xiYXI6IEVkaXRvclRvb2xiYXJDb21wb25lbnRcbiAgQE91dHB1dCgpIGh0bWxcbiAgQE91dHB1dCgpIHZpZXdNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpXG4gIEBPdXRwdXQoKSBibHVyOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpXG4gIEBPdXRwdXQoKSBmb2N1czogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsIFxuICAgIHByaXZhdGUgZWRpdG9yU2VydmljZTogRWRpdG9yU2VydmljZSwgXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IGFueSkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5lZGl0b3JUb29sYmFyLmlkID0gdGhpcy5pZDtcbiAgICB0aGlzLmVkaXRvclRvb2xiYXIuZm9udHMgPSB0aGlzLmNvbmZpZy5mb250cyA/IHRoaXMuY29uZmlnLmZvbnRzIDogYW5ndWxhckVkaXRvckNvbmZpZy5mb250cztcbiAgICB0aGlzLmVkaXRvclRvb2xiYXIuY3VzdG9tQ2xhc3NlcyA9IHRoaXMuY29uZmlnLmN1c3RvbUNsYXNzZXM7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnVwbG9hZFVybCA9IHRoaXMuY29uZmlnLnVwbG9hZFVybDtcbiAgICBpZiAodGhpcy5jb25maWcuc2hvd1Rvb2xiYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3JUb29sYmFyLnNob3dUb29sYmFyID0gdGhpcy5jb25maWcuc2hvd1Rvb2xiYXI7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0UGFyYWdyYXBoU2VwYXJhdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0RGVmYXVsdFBhcmFncmFwaFNlcGFyYXRvcih0aGlzLmNvbmZpZy5kZWZhdWx0UGFyYWdyYXBoU2VwYXJhdG9yKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmRlZmF1bHRGb250TmFtZSkge1xuICAgICAgdGhpcy5lZGl0b3JUb29sYmFyLmRlZmF1bHRGb250SWQgPSB0aGlzLmNvbmZpZy5kZWZhdWx0Rm9udE5hbWUgPyB0aGlzLmVkaXRvclRvb2xiYXIuZm9udHMuZmluZEluZGV4KHggPT4ge1xuICAgICAgICByZXR1cm4geC5uYW1lID09PSB0aGlzLmNvbmZpZy5kZWZhdWx0Rm9udE5hbWU7XG4gICAgICB9KSA6IDA7XG4gICAgICB0aGlzLmVkaXRvclRvb2xiYXIuZm9udElkID0gdGhpcy5lZGl0b3JUb29sYmFyLmRlZmF1bHRGb250SWQ7XG4gICAgICB0aGlzLm9uRWRpdG9yRm9jdXMoKTtcbiAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRGb250TmFtZSh0aGlzLmNvbmZpZy5kZWZhdWx0Rm9udE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRvclRvb2xiYXIuZGVmYXVsdEZvbnRJZCA9IDA7XG4gICAgICB0aGlzLmVkaXRvclRvb2xiYXIuZm9udElkID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnLmRlZmF1bHRGb250U2l6ZSkge1xuICAgICAgdGhpcy5lZGl0b3JUb29sYmFyLmZvbnRTaXplID0gdGhpcy5jb25maWcuZGVmYXVsdEZvbnRTaXplO1xuICAgICAgdGhpcy5vbkVkaXRvckZvY3VzKCk7XG4gICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0Rm9udFNpemUodGhpcy5jb25maWcuZGVmYXVsdEZvbnRTaXplKTtcbiAgICB9XG4gIH1cblxuICBleGVjdXRlQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpIHtcbiAgICBpZiAoY29tbWFuZCA9PT0gJ3RvZ2dsZUVkaXRvck1vZGUnKSB7XG4gICAgICB0aGlzLnRvZ2dsZUVkaXRvck1vZGUodGhpcy5tb2RlVmlzdWFsKTtcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgIT09ICcnKSB7XG4gICAgICB0aGlzLmVkaXRvclNlcnZpY2UuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgICB0aGlzLmV4ZWMoKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uRWRpdG9yRm9jdXMoKTtcbiAgfVxuXG4gIG9uVGV4dEFyZWFGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzLmVtaXQoJ2ZvY3VzJyk7XG4gIH1cblxuICBvblRleHRBcmVhQmx1cihldmVudDogRm9jdXNFdmVudCkge1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5zYXZlU2VsZWN0aW9uKClcbiAgICBpZiAodHlwZW9mIHRoaXMub25Ub3VjaGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpXG4gICAgfVxuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0ICE9IG51bGwgJiYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQuY2xhc3NOYW1lICE9PSAnYW5ndWxhci1lZGl0b3ItdG9vbGJhci1zZXQnKSB7XG4gICAgICB0aGlzLmJsdXIuZW1pdCgnYmx1cicpXG4gICAgfVxuICB9XG5cbiAgb25FZGl0b3JGb2N1cygpIHtcbiAgICB0aGlzLnRleHRBcmVhLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKVxuICB9XG5cbiAgb25Db250ZW50Q2hhbmdlKGh0bWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgdGhpcy5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vbkNoYW5nZShodG1sKTtcbiAgICAgIGlmICgoIWh0bWwgfHwgaHRtbCA9PT0gJzxicj4nIHx8IGh0bWwgPT09ICcnKSAhPT0gdGhpcy5zaG93UGxhY2Vob2xkZXIpIHtcbiAgICAgICAgdGhpcy50b2dnbGVQbGFjZWhvbGRlcih0aGlzLnNob3dQbGFjZWhvbGRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoKCF2YWx1ZSB8fCB2YWx1ZSA9PT0gJzxicj4nIHx8IHZhbHVlID09PSAnJykgIT09IHRoaXMuc2hvd1BsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLnRvZ2dsZVBsYWNlaG9sZGVyKHRoaXMuc2hvd1BsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnPGJyPicpIHtcbiAgICAgIHZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVmlldyh2YWx1ZSk7XG4gIH1cblxuICByZWZyZXNoVmlldyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUgPT09IG51bGwgPyAnJyA6IHZhbHVlXG4gICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50LCAnaW5uZXJIVE1MJywgbm9ybWFsaXplZFZhbHVlKVxuICAgIHJldHVyblxuICB9XG5cbiAgdG9nZ2xlUGxhY2Vob2xkZXIodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVkaXRvcldyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3Nob3ctcGxhY2Vob2xkZXInKTtcbiAgICAgIHRoaXMuc2hvd1BsYWNlaG9sZGVyID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lZGl0b3JXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdzaG93LXBsYWNlaG9sZGVyJyk7XG4gICAgICB0aGlzLnNob3dQbGFjZWhvbGRlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGRpdiA9IHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBhY3Rpb24gPSBpc0Rpc2FibGVkID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyc7XG4gICAgdGhpcy5fcmVuZGVyZXJbYWN0aW9uXShkaXYsICdkaXNhYmxlZCcpO1xuICB9XG5cbiAgdG9nZ2xlRWRpdG9yTW9kZShiVG9Tb3VyY2U6IGJvb2xlYW4pIHtcbiAgICBsZXQgb0NvbnRlbnQ6IGFueTtcbiAgICBjb25zdCBlZGl0YWJsZUVsZW1lbnQgPSB0aGlzLnRleHRBcmVhLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoYlRvU291cmNlKSB7XG4gICAgICBvQ29udGVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVkaXRhYmxlRWxlbWVudC5pbm5lckhUTUwpO1xuICAgICAgZWRpdGFibGVFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuXG4gICAgICBjb25zdCBvUHJlID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICBvUHJlLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwibWFyZ2luOiAwOyBvdXRsaW5lOiBub25lO1wiKTtcbiAgICAgIGNvbnN0IG9Db2RlID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY29kZScpO1xuICAgICAgZWRpdGFibGVFbGVtZW50LmNvbnRlbnRFZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgb0NvZGUuaWQgPSBcInNvdXJjZVRleHRcIjtcbiAgICAgIG9Db2RlLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwid2hpdGUtc3BhY2U6IHByZS13cmFwOyB3b3JkLWJyZWFrOiBrZWVwLWFsbDsgbWFyZ2luOiAwOyBvdXRsaW5lOiBub25lOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmNWI5O1wiKTtcbiAgICAgIG9Db2RlLmNvbnRlbnRFZGl0YWJsZSA9ICd0cnVlJztcbiAgICAgIG9Db2RlLmFwcGVuZENoaWxkKG9Db250ZW50KTtcbiAgICAgIG9QcmUuYXBwZW5kQ2hpbGQob0NvZGUpO1xuICAgICAgZWRpdGFibGVFbGVtZW50LmFwcGVuZENoaWxkKG9QcmUpO1xuXG4gICAgICB0aGlzLl9kb2N1bWVudC5leGVjQ29tbWFuZChcImRlZmF1bHRQYXJhZ3JhcGhTZXBhcmF0b3JcIiwgZmFsc2UsIFwiZGl2XCIpO1xuXG4gICAgICB0aGlzLm1vZGVWaXN1YWwgPSBmYWxzZTtcbiAgICAgIHRoaXMudmlld01vZGUuZW1pdChmYWxzZSk7XG4gICAgICBvQ29kZS5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fZG9jdW1lbnQuYWxsKSB7XG4gICAgICAgIGVkaXRhYmxlRWxlbWVudC5pbm5lckhUTUwgPSBlZGl0YWJsZUVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb0NvbnRlbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBvQ29udGVudC5zZWxlY3ROb2RlQ29udGVudHMoZWRpdGFibGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICBlZGl0YWJsZUVsZW1lbnQuaW5uZXJIVE1MID0gb0NvbnRlbnQudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIGVkaXRhYmxlRWxlbWVudC5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgICAgdGhpcy5tb2RlVmlzdWFsID0gdHJ1ZTtcbiAgICAgIHRoaXMudmlld01vZGUuZW1pdCh0cnVlKTtcbiAgICAgIHRoaXMub25Db250ZW50Q2hhbmdlKGVkaXRhYmxlRWxlbWVudC5pbm5lckhUTUwpO1xuICAgICAgZWRpdGFibGVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIHRoaXMuZWRpdG9yVG9vbGJhci5zZXRFZGl0b3JNb2RlKCF0aGlzLm1vZGVWaXN1YWwpO1xuICB9XG5cbiAgZXhlYygpIHtcbiAgICB0aGlzLmVkaXRvclRvb2xiYXIudHJpZ2dlckJ1dHRvbnMoKTtcblxuICAgIGxldCB1c2VyU2VsZWN0aW9uO1xuICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICB1c2VyU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIGxldCBhID0gdXNlclNlbGVjdGlvbi5mb2N1c05vZGU7XG4gICAgY29uc3QgZWxzID0gW107XG4gICAgd2hpbGUgKGEgJiYgYS5pZCAhPT0gJ2VkaXRvcicpIHtcbiAgICAgIGVscy51bnNoaWZ0KGEpO1xuICAgICAgYSA9IGEucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgdGhpcy5lZGl0b3JUb29sYmFyLnRyaWdnZXJCbG9ja3MoZWxzKTtcbiAgfVxuXG59Il19