UNPKG

@ctrl/ngx-codemirror

Version:
238 lines 27.7 kB
import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Output, ViewChild, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; function normalizeLineEndings(str) { if (!str) { return str; } return str.replace(/\r\n|\r/g, '\n'); } class CodemirrorComponent { _differs; _ngZone; /* class applied to the created textarea */ className = ''; /* name applied to the created textarea */ name = 'codemirror'; /* autofocus setting applied to the created textarea */ autoFocus = false; /** * set options for codemirror * @link http://codemirror.net/doc/manual.html#config */ set options(value) { this._options = value; if (!this._differ && value) { this._differ = this._differs.find(value).create(); } } /* preserve previous scroll position after updating value */ preserveScrollPosition = false; /* called when the text cursor is moved */ cursorActivity = new EventEmitter(); /* called when the editor is focused or loses focus */ focusChange = new EventEmitter(); /* called when the editor is scrolled */ // eslint-disable-next-line @angular-eslint/no-output-native scroll = new EventEmitter(); /* called when file(s) are dropped */ // eslint-disable-next-line @angular-eslint/no-output-native drop = new EventEmitter(); /* called when codeMirror instance is initiated on the component */ codeMirrorLoaded = new EventEmitter(); ref; value = ''; disabled = false; isFocused = false; codeMirror; /** * either global variable or required library */ _codeMirror; _differ; _options; constructor(_differs, _ngZone) { this._differs = _differs; this._ngZone = _ngZone; } get codeMirrorGlobal() { if (this._codeMirror) { return this._codeMirror; } // in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : import('codemirror'); return this._codeMirror; } ngAfterViewInit() { this._ngZone.runOutsideAngular(async () => { const codeMirrorObj = await this.codeMirrorGlobal; const codeMirror = codeMirrorObj?.default ? codeMirrorObj.default : codeMirrorObj; this.codeMirror = codeMirror.fromTextArea(this.ref.nativeElement, this._options); this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm))); this.codeMirror.on('scroll', this.scrollChanged.bind(this)); this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false))); this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true))); this.codeMirror.on('change', (cm, change) => this._ngZone.run(() => this.codemirrorValueChanged(cm, change))); this.codeMirror.on('drop', (cm, e) => { this._ngZone.run(() => this.dropFiles(cm, e)); }); this.codeMirror.setValue(this.value); this.codeMirrorLoaded.emit(this); }); } ngDoCheck() { if (!this._differ) { return; } // check options have not changed const changes = this._differ.diff(this._options); if (changes) { changes.forEachChangedItem(option => this.setOptionIfChanged(option.key, option.currentValue)); changes.forEachAddedItem(option => this.setOptionIfChanged(option.key, option.currentValue)); changes.forEachRemovedItem(option => this.setOptionIfChanged(option.key, option.currentValue)); } } ngOnDestroy() { // is there a lighter-weight way to remove the cm instance? if (this.codeMirror) { this.codeMirror.toTextArea(); } } codemirrorValueChanged(cm, change) { const cmVal = cm.getValue(); if (this.value !== cmVal) { this.value = cmVal; this.onChange(this.value); } } setOptionIfChanged(optionName, newValue) { if (!this.codeMirror) { return; } // cast to any to handle strictly typed option names // could possibly import settings strings available in the future this.codeMirror.setOption(optionName, newValue); } focusChanged(focused) { this.onTouched(); this.isFocused = focused; this.focusChange.emit(focused); } scrollChanged(cm) { this.scroll.emit(cm.getScrollInfo()); } cursorActive(cm) { this.cursorActivity.emit(cm); } dropFiles(cm, e) { this.drop.emit([cm, e]); } /** Implemented as part of ControlValueAccessor. */ writeValue(value) { if (value === null || value === undefined) { return; } if (!this.codeMirror) { this.value = value; return; } const cur = this.codeMirror.getValue(); if (value !== cur && normalizeLineEndings(cur) !== normalizeLineEndings(value)) { this.value = value; if (this.preserveScrollPosition) { const prevScrollPosition = this.codeMirror.getScrollInfo(); this.codeMirror.setValue(this.value); this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top); } else { this.codeMirror.setValue(this.value); } } } /** Implemented as part of ControlValueAccessor. */ registerOnChange(fn) { this.onChange = fn; } /** Implemented as part of ControlValueAccessor. */ registerOnTouched(fn) { this.onTouched = fn; } /** Implemented as part of ControlValueAccessor. */ setDisabledState(isDisabled) { this.disabled = isDisabled; this.setOptionIfChanged('readOnly', this.disabled); } /** Implemented as part of ControlValueAccessor. */ onChange = (_) => { }; /** Implemented as part of ControlValueAccessor. */ onTouched = () => { }; static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.1", type: CodemirrorComponent, selector: "ngx-codemirror", inputs: { className: "className", name: "name", autoFocus: "autoFocus", options: "options", preserveScrollPosition: "preserveScrollPosition" }, outputs: { cursorActivity: "cursorActivity", focusChange: "focusChange", scroll: "scroll", drop: "drop", codeMirrorLoaded: "codeMirrorLoaded" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CodemirrorComponent), multi: true, }, ], viewQueries: [{ propertyName: "ref", first: true, predicate: ["ref"], descendants: true }], ngImport: i0, template: ` <textarea [name]="name" class="ngx-codemirror {{ className }}" [class.ngx-codemirror--focused]="isFocused" autocomplete="off" [autofocus]="autoFocus" #ref > </textarea> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); } export { CodemirrorComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-codemirror', template: ` <textarea [name]="name" class="ngx-codemirror {{ className }}" [class.ngx-codemirror--focused]="isFocused" autocomplete="off" [autofocus]="autoFocus" #ref > </textarea> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CodemirrorComponent), multi: true, }, ], preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i0.NgZone }]; }, propDecorators: { className: [{ type: Input }], name: [{ type: Input }], autoFocus: [{ type: Input }], options: [{ type: Input }], preserveScrollPosition: [{ type: Input }], cursorActivity: [{ type: Output }], focusChange: [{ type: Output }], scroll: [{ type: Output }], drop: [{ type: Output }], codeMirrorLoaded: [{ type: Output }], ref: [{ type: ViewChild, args: ['ref'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NvZGVtaXJyb3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUtMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUd6RSxTQUFTLG9CQUFvQixDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFDRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFLRCxNQXVCYSxtQkFBbUI7SUErQ1Y7SUFBbUM7SUE1Q3ZELDJDQUEyQztJQUNsQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLDBDQUEwQztJQUNqQyxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBQzdCLHVEQUF1RDtJQUM5QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQzNCOzs7T0FHRztJQUNILElBQ0ksT0FBTyxDQUFDLEtBQTZCO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssRUFBRTtZQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUNELDREQUE0RDtJQUNuRCxzQkFBc0IsR0FBRyxLQUFLLENBQUM7SUFDeEMsMENBQTBDO0lBQ2hDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQ3RELHNE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QUFiLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNXLEdBQUc7c0JBQXBCLFNBQVM7dUJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERvQ2hlY2ssXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIEtleVZhbHVlRGlmZmVyLFxuICBLZXlWYWx1ZURpZmZlcnMsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFZGl0b3IsIEVkaXRvckNoYW5nZSwgRWRpdG9yRnJvbVRleHRBcmVhLCBTY3JvbGxJbmZvIH0gZnJvbSAnY29kZW1pcnJvcic7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVFbmRpbmdzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxyXFxufFxcci9nLCAnXFxuJyk7XG59XG5cbmRlY2xhcmUgdmFyIHJlcXVpcmU6IGFueTtcbmRlY2xhcmUgdmFyIENvZGVNaXJyb3I6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWNvZGVtaXJyb3InLFxuICB0ZW1wbGF0ZTogYFxuICAgIDx0ZXh0YXJlYVxuICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICBjbGFzcz1cIm5neC1jb2RlbWlycm9yIHt7IGNsYXNzTmFtZSB9fVwiXG4gICAgICBbY2xhc3Mubmd4LWNvZGVtaXJyb3ItLWZvY3VzZWRdPVwiaXNGb2N1c2VkXCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICBbYXV0b2ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gICAgICAjcmVmXG4gICAgPlxuICAgIDwvdGV4dGFyZWE+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29kZW1pcnJvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBEb0NoZWNrXG57XG4gIC8qIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGNyZWF0ZWQgdGV4dGFyZWEgKi9cbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG4gIC8qIG5hbWUgYXBwbGllZCB0byB0aGUgY3JlYXRlZCB0ZXh0YXJlYSAqL1xuICBASW5wdXQoKSBuYW1lID0gJ2NvZGVtaXJyb3InO1xuICAvKiBhdXRvZm9jdXMgc2V0dGluZyBhcHBsaWVkIHRvIHRoZSBjcmVhdGVkIHRleHRhcmVhICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IGZhbHNlO1xuICAvKipcbiAgICogc2V0IG9wdGlvbnMgZm9yIGNvZGVtaXJyb3JcbiAgICogQGxpbmsgaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNjb25maWdcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBvcHRpb25zKHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHZhbHVlO1xuICAgIGlmICghdGhpcy5fZGlmZmVyICYmIHZhbHVlKSB7XG4gICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9kaWZmZXJzLmZpbmQodmFsdWUpLmNyZWF0ZSgpO1xuICAgIH1cbiAgfVxuICAvKiBwcmVzZXJ2ZSBwcmV2aW91cyBzY3JvbGwgcG9zaXRpb24gYWZ0ZXIgdXBkYXRpbmcgdmFsdWUgKi9cbiAgQElucHV0KCkgcHJlc2VydmVTY3JvbGxQb3NpdGlvbiA9IGZhbHNlO1xuICAvKiBjYWxsZWQgd2hlbiB0aGUgdGV4dCBjdXJzb3IgaXMgbW92ZWQgKi9cbiAgQE91dHB1dCgpIGN1cnNvckFjdGl2aXR5ID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0b3I+KCk7XG4gIC8qIGNhbGxlZCB3aGVuIHRoZSBlZGl0b3IgaXMgZm9jdXNlZCBvciBsb3NlcyBmb2N1cyAqL1xuICBAT3V0cHV0KCkgZm9jdXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIC8qIGNhbGxlZCB3aGVuIHRoZSBlZGl0b3IgaXMgc2Nyb2xsZWQgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBzY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbEluZm8+KCk7XG4gIC8qIGNhbGxlZCB3aGVuIGZpbGUocykgYXJlIGRyb3BwZWQgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBkcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxbRWRpdG9yLCBEcmFnRXZlbnRdPigpO1xuICAvKiBjYWxsZWQgd2hlbiBjb2RlTWlycm9yIGluc3RhbmNlIGlzIGluaXRpYXRlZCBvbiB0aGUgY29tcG9uZW50ICovXG4gIEBPdXRwdXQoKSBjb2RlTWlycm9yTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb2RlbWlycm9yQ29tcG9uZW50PigpO1xuICBAVmlld0NoaWxkKCdyZWYnKSByZWYhOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xuICB2YWx1ZSA9ICcnO1xuICBkaXNhYmxlZCA9IGZhbHNlO1xuICBpc0ZvY3VzZWQgPSBmYWxzZTtcbiAgY29kZU1pcnJvcj86IEVkaXRvckZyb21UZXh0QXJlYTtcbiAgLyoqXG4gICAqIGVpdGhlciBnbG9iYWwgdmFyaWFibGUgb3IgcmVxdWlyZWQgbGlicmFyeVxuICAgKi9cbiAgcHJpdmF0ZSBfY29kZU1pcnJvcjogYW55O1xuXG4gIHByaXZhdGUgX2RpZmZlcj86IEtleVZhbHVlRGlmZmVyPHN0cmluZywgYW55PjtcbiAgcHJpdmF0ZSBfb3B0aW9uczogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RpZmZlcnM6IEtleVZhbHVlRGlmZmVycywgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgZ2V0IGNvZGVNaXJyb3JHbG9iYWwoKTogYW55IHtcbiAgICBpZiAodGhpcy5fY29kZU1pcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJyb3I7XG4gICAgfVxuXG4gICAgLy8gaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHVuaXZlcnNhbCByZW5kZXJpbmcsIHdlIGltcG9ydCBDb2RlbWlycm9yIHJ1bnRpbWUgd2l0aCBgcmVxdWlyZWAgdG8gcHJldmVudCBub2RlIGVycm9yc1xuICAgIHRoaXMuX2NvZGVNaXJyb3IgPSB0eXBlb2YgQ29kZU1pcnJvciAhPT0gJ3VuZGVmaW5lZCcgPyBDb2RlTWlycm9yIDogaW1wb3J0KCdjb2RlbWlycm9yJyk7XG4gICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJyb3I7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvZGVNaXJyb3JPYmogPSBhd2FpdCB0aGlzLmNvZGVNaXJyb3JHbG9iYWw7XG4gICAgICBjb25zdCBjb2RlTWlycm9yID0gY29kZU1pcnJvck9iaj8uZGVmYXVsdCA/IGNvZGVNaXJyb3JPYmouZGVmYXVsdCA6IGNvZGVNaXJyb3JPYmo7XG4gICAgICB0aGlzLmNvZGVNaXJyb3IgPSBjb2RlTWlycm9yLmZyb21UZXh0QXJlYShcbiAgICAgICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5fb3B0aW9ucyxcbiAgICAgICkgYXMgRWRpdG9yRnJvbVRleHRBcmVhO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdjdXJzb3JBY3Rpdml0eScsIGNtID0+IHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5jdXJzb3JBY3RpdmUoY20pKSk7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbignYmx1cicsICgpID0+IHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5mb2N1c0NoYW5nZWQoZmFsc2UpKSk7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ2ZvY3VzJywgKCkgPT4gdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmZvY3VzQ2hhbmdlZCh0cnVlKSkpO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdjaGFuZ2UnLCAoY20sIGNoYW5nZSkgPT5cbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmNvZGVtaXJyb3JWYWx1ZUNoYW5nZWQoY20sIGNoYW5nZSkpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbignZHJvcCcsIChjbSwgZSkgPT4ge1xuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuZHJvcEZpbGVzKGNtLCBlKSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvckxvYWRlZC5lbWl0KHRoaXMpO1xuICAgIH0pO1xuICB9XG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAoIXRoaXMuX2RpZmZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjaGVjayBvcHRpb25zIGhhdmUgbm90IGNoYW5nZWRcbiAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fb3B0aW9ucyk7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKG9wdGlvbiA9PlxuICAgICAgICB0aGlzLnNldE9wdGlvbklmQ2hhbmdlZChvcHRpb24ua2V5LCBvcHRpb24uY3VycmVudFZhbHVlKSxcbiAgICAgICk7XG4gICAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0ob3B0aW9uID0+IHRoaXMuc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbi5rZXksIG9wdGlvbi5jdXJyZW50VmFsdWUpKTtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKG9wdGlvbiA9PlxuICAgICAgICB0aGlzLnNldE9wdGlvbklmQ2hhbmdlZChvcHRpb24ua2V5LCBvcHRpb24uY3VycmVudFZhbHVlKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vIGlzIHRoZXJlIGEgbGlnaHRlci13ZWlnaHQgd2F5IHRvIHJlbW92ZSB0aGUgY20gaW5zdGFuY2U/XG4gICAgaWYgKHRoaXMuY29kZU1pcnJvcikge1xuICAgICAgdGhpcy5jb2RlTWlycm9yLnRvVGV4dEFyZWEoKTtcbiAgICB9XG4gIH1cbiAgY29kZW1pcnJvclZhbHVlQ2hhbmdlZChjbTogRWRpdG9yLCBjaGFuZ2U6IEVkaXRvckNoYW5nZSkge1xuICAgIGNvbnN0IGNtVmFsID0gY20uZ2V0VmFsdWUoKTtcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gY21WYWwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBjbVZhbDtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG4gIHNldE9wdGlvbklmQ2hhbmdlZChvcHRpb25OYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY29kZU1pcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNhc3QgdG8gYW55IHRvIGhhbmRsZSBzdHJpY3RseSB0eXBlZCBvcHRpb24gbmFtZXNcbiAgICAvLyBjb3VsZCBwb3NzaWJseSBpbXBvcnQgc2V0dGluZ3Mgc3RyaW5ncyBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZVxuICAgIHRoaXMuY29kZU1pcnJvci5zZXRPcHRpb24ob3B0aW9uTmFtZSBhcyBhbnksIG5ld1ZhbHVlKTtcbiAgfVxuICBmb2N1c0NoYW5nZWQoZm9jdXNlZDogYm9vbGVhbikge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmb2N1c2VkO1xuICAgIHRoaXMuZm9jdXNDaGFuZ2UuZW1pdChmb2N1c2VkKTtcbiAgfVxuICBzY3JvbGxDaGFuZ2VkKGNtOiBFZGl0b3IpIHtcbiAgICB0aGlzLnNjcm9sbC5lbWl0KGNtLmdldFNjcm9sbEluZm8oKSk7XG4gIH1cbiAgY3Vyc29yQWN0aXZlKGNtOiBFZGl0b3IpIHtcbiAgICB0aGlzLmN1cnNvckFjdGl2aXR5LmVtaXQoY20pO1xuICB9XG4gIGRyb3BGaWxlcyhjbTogRWRpdG9yLCBlOiBEcmFnRXZlbnQpIHtcbiAgICB0aGlzLmRyb3AuZW1pdChbY20sIGVdKTtcbiAgfVxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvZGVNaXJyb3IpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VyID0gdGhpcy5jb2RlTWlycm9yLmdldFZhbHVlKCk7XG4gICAgaWYgKHZhbHVlICE9PSBjdXIgJiYgbm9ybWFsaXplTGluZUVuZGluZ3MoY3VyKSAhPT0gbm9ybWFsaXplTGluZUVuZGluZ3ModmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy5wcmVzZXJ2ZVNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHByZXZTY3JvbGxQb3NpdGlvbiA9IHRoaXMuY29kZU1pcnJvci5nZXRTY3JvbGxJbmZvKCk7XG4gICAgICAgIHRoaXMuY29kZU1pcnJvci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5jb2RlTWlycm9yLnNjcm9sbFRvKHByZXZTY3JvbGxQb3NpdGlvbi5sZWZ0LCBwcmV2U2Nyb2xsUG9zaXRpb24udG9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZU1pcnJvci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5zZXRPcHRpb25JZkNoYW5nZWQoJ3JlYWRPbmx5JywgdGhpcy5kaXNhYmxlZCk7XG4gIH1cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge307XG59XG4iXX0=