@ctrl/ngx-codemirror
Version:
CodeMirror wrapper for Angular
238 lines • 27.7 kB
JavaScript
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=