UNPKG

ngx-autosize

Version:

Directive that automatically adjusts textarea height to fit content

188 lines 26.9 kB
import { HostListener, Directive, Input, Output, EventEmitter } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "./window-ref.service"; const MAX_LOOKUP_RETRIES = 3; export class AutosizeDirective { constructor(element, _window, _zone) { this.element = element; this._window = _window; this._zone = _zone; this.onlyGrow = false; this.useImportant = false; this.resized = new EventEmitter(); this.autosize = true; this.retries = 0; this._destroyed = false; if (this.element.nativeElement.tagName !== 'TEXTAREA') { this._findNestedTextArea(); } else { this.textAreaEl = this.element.nativeElement; this.textAreaEl.style['overflow-y'] = 'hidden'; this._onTextAreaFound(); } } set minRows(value) { this._minRows = +value; if (this.textAreaEl) { this.textAreaEl.rows = this._minRows; } } ; set _autosize(autosize) { this.autosize = typeof autosize === 'boolean' ? autosize : true; } ; onInput(textArea) { this.adjust(); } ngOnDestroy() { this._destroyed = true; if (this._windowResizeHandler) { this._window.nativeWindow.removeEventListener('resize', this._windowResizeHandler, false); } } ngAfterContentChecked() { this.adjust(); } ngOnChanges(changes) { this.adjust(true); } _findNestedTextArea() { this.textAreaEl = this.element.nativeElement.querySelector('TEXTAREA'); if (!this.textAreaEl && this.element.nativeElement.shadowRoot) { this.textAreaEl = this.element.nativeElement.shadowRoot.querySelector('TEXTAREA'); } if (!this.textAreaEl) { if (this.retries >= MAX_LOOKUP_RETRIES) { console.warn('ngx-autosize: textarea not found'); } else { this.retries++; setTimeout(() => { this._findNestedTextArea(); }, 100); } return; } this.textAreaEl.style['overflow-y'] = 'hidden'; this._onTextAreaFound(); } _onTextAreaFound() { this._addWindowResizeHandler(); setTimeout(() => { this.adjust(); }); } _addWindowResizeHandler() { this._windowResizeHandler = debounce(() => { this._zone.run(() => { this.adjust(); }); }, 200); this._zone.runOutsideAngular(() => { this._window.nativeWindow.addEventListener('resize', this._windowResizeHandler, false); }); } adjust(inputsChanged = false) { if (this.autosize && !this._destroyed && this.textAreaEl && this.textAreaEl.parentNode) { const currentText = this.textAreaEl.value; if (inputsChanged === false && currentText === this._oldContent && this.textAreaEl.offsetWidth === this._oldWidth) { return; } this._oldContent = currentText; this._oldWidth = this.textAreaEl.offsetWidth; const clone = this.textAreaEl.cloneNode(true); const parent = this.textAreaEl.parentNode; clone.style.width = this.textAreaEl.offsetWidth + 'px'; clone.style.visibility = 'hidden'; clone.style.position = 'absolute'; clone.textContent = currentText; parent.appendChild(clone); clone.style['overflow-y'] = 'hidden'; clone.style.height = 'auto'; let height = clone.scrollHeight; // add into height top and bottom borders' width let computedStyle = this._window.nativeWindow.getComputedStyle(clone, null); height += parseInt(computedStyle.getPropertyValue('border-top-width')); height += parseInt(computedStyle.getPropertyValue('border-bottom-width')); if (computedStyle.getPropertyValue('box-sizing') === 'content-box') { height -= parseInt(computedStyle.getPropertyValue('padding-top')); height -= parseInt(computedStyle.getPropertyValue('padding-bottom')); } const oldHeight = this.textAreaEl.offsetHeight; const willGrow = height > oldHeight; if (this.onlyGrow === false || willGrow) { const lineHeight = this._getLineHeight(); const rowsCount = height / lineHeight; if (this._minRows && this._minRows >= rowsCount) { height = this._minRows * lineHeight; } else if (this.maxRows && this.maxRows <= rowsCount) { // never shrink the textarea if onlyGrow is true const maxHeight = this.maxRows * lineHeight; height = this.onlyGrow ? Math.max(maxHeight, oldHeight) : maxHeight; this.textAreaEl.style['overflow-y'] = 'auto'; } else { this.textAreaEl.style['overflow-y'] = 'hidden'; } const heightStyle = height + 'px'; const important = this.useImportant ? 'important' : ''; this.textAreaEl.style.setProperty('height', heightStyle, important); this.resized.emit(height); } parent.removeChild(clone); } } _getLineHeight() { let lineHeight = parseInt(this.textAreaEl.style.lineHeight, 10); if (isNaN(lineHeight) && this._window.nativeWindow.getComputedStyle) { const styles = this._window.nativeWindow.getComputedStyle(this.textAreaEl); lineHeight = parseInt(styles.lineHeight, 10); } if (isNaN(lineHeight)) { const fontSize = this._window.nativeWindow.getComputedStyle(this.textAreaEl, null).getPropertyValue('font-size'); lineHeight = Math.floor(parseInt(fontSize.replace('px', ''), 10) * 1.5); } return lineHeight; } } AutosizeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: AutosizeDirective, deps: [{ token: i0.ElementRef }, { token: i1.WindowRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); AutosizeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.1", type: AutosizeDirective, selector: "[autosize]", inputs: { minRows: "minRows", _autosize: ["autosize", "_autosize"], maxRows: "maxRows", onlyGrow: "onlyGrow", useImportant: "useImportant" }, outputs: { resized: "resized" }, host: { listeners: { "input": "onInput($event.target)" } }, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: AutosizeDirective, decorators: [{ type: Directive, args: [{ selector: '[autosize]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.WindowRef }, { type: i0.NgZone }]; }, propDecorators: { minRows: [{ type: Input }], _autosize: [{ type: Input, args: ['autosize'] }], maxRows: [{ type: Input }], onlyGrow: [{ type: Input }], useImportant: [{ type: Input }], resized: [{ type: Output }], onInput: [{ type: HostListener, args: ['input', ['$event.target']] }] } }); function debounce(func, timeout) { let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => { func(...args); }, timeout); }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b3NpemUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF1dG9zaXplL3NyYy9saWIvYXV0b3NpemUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxZQUFZLEVBQ1osU0FBUyxFQUNULEtBQUssRUFDOEMsTUFBTSxFQUFFLFlBQVksRUFDeEUsTUFBTSxlQUFlLENBQUM7OztBQUd2QixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQU03QixNQUFNLE9BQU8saUJBQWlCO0lBcUMxQixZQUNXLE9BQW1CLEVBQ2xCLE9BQWtCLEVBQ2xCLEtBQWE7UUFGZCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ2xCLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQXZCaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVwQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV2QyxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFPWixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBWXZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRTtZQUNuRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUU5QjthQUFNO1lBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBakRELElBQ0ksT0FBTyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLFFB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bnQiOlsiaW1wb3J0IHtcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBOZ1pvbmUsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRDaGVja2VkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V2luZG93UmVmfSBmcm9tICcuL3dpbmRvdy1yZWYuc2VydmljZSc7XG5cbmNvbnN0IE1BWF9MT09LVVBfUkVUUklFUyA9IDM7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2F1dG9zaXplXSdcbn0pXG5cbmV4cG9ydCBjbGFzcyBBdXRvc2l6ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgICBASW5wdXQoKVxuICAgIHNldCBtaW5Sb3dzKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fbWluUm93cyA9ICt2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMudGV4dEFyZWFFbCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0QXJlYUVsLnJvd3MgPSB0aGlzLl9taW5Sb3dzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBASW5wdXQoJ2F1dG9zaXplJylcbiAgICBzZXQgX2F1dG9zaXplKGF1dG9zaXplOiBib29sZWFuIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYXV0b3NpemUgPSB0eXBlb2YgYXV0b3NpemUgPT09ICdib29sZWFuJ1xuICAgICAgICAgICAgPyBhdXRvc2l6ZVxuICAgICAgICAgICAgOiB0cnVlO1xuICAgIH07XG4gICAgcHJpdmF0ZSBfbWluUm93cyE6IG51bWJlcjtcblxuICAgIEBJbnB1dCgpIG1heFJvd3MhOiBudW1iZXI7XG4gICAgQElucHV0KCkgb25seUdyb3cgPSBmYWxzZTtcbiAgICBASW5wdXQoKSB1c2VJbXBvcnRhbnQgPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSByZXNpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBwcml2YXRlIGF1dG9zaXplID0gdHJ1ZTtcbiAgICBwcml2YXRlIHJldHJpZXMgPSAwO1xuICAgIHByaXZhdGUgdGV4dEFyZWFFbDogYW55O1xuXG4gICAgcHJpdmF0ZSBfb2xkQ29udGVudCE6IHN0cmluZztcbiAgICBwcml2YXRlIF9vbGRXaWR0aCE6IG51bWJlcjtcblxuICAgIHByaXZhdGUgX3dpbmRvd1Jlc2l6ZUhhbmRsZXIhOiAoLi4uYXJnczogQXJyYXk8YW55PikgPT4gYW55O1xuICAgIHByaXZhdGUgX2Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudC50YXJnZXQnXSlcbiAgICBvbklucHV0KHRleHRBcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRqdXN0KCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIF93aW5kb3c6IFdpbmRvd1JlZixcbiAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lXG4gICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC50YWdOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgICAgICB0aGlzLl9maW5kTmVzdGVkVGV4dEFyZWEoKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50ZXh0QXJlYUVsID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhRWwuc3R5bGVbJ292ZXJmbG93LXknXSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgdGhpcy5fb25UZXh0QXJlYUZvdW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX3dpbmRvd1Jlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvdy5uYXRpdmVXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fd2luZG93UmVzaXplSGFuZGxlciwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgICAgICB0aGlzLmFkanVzdCgpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5hZGp1c3QodHJ1ZSk7XG4gICAgfVxuXG4gICAgX2ZpbmROZXN0ZWRUZXh0QXJlYSgpIHtcbiAgICAgICAgdGhpcy50ZXh0QXJlYUVsID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignVEVYVEFSRUEnKTtcblxuICAgICAgICBpZiAoIXRoaXMudGV4dEFyZWFFbCAmJiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhRWwgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1RFWFRBUkVBJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGV4dEFyZWFFbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmV0cmllcyA+PSBNQVhfTE9PS1VQX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ25neC1hdXRvc2l6ZTogdGV4dGFyZWEgbm90IGZvdW5kJyk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyaWVzKys7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmROZXN0ZWRUZXh0QXJlYSgpO1xuICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRleHRBcmVhRWwuc3R5bGVbJ292ZXJmbG93LXknXSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLl9vblRleHRBcmVhRm91bmQoKTtcblxuICAgIH1cblxuICAgIF9vblRleHRBcmVhRm91bmQoKSB7XG4gICAgICAgIHRoaXMuX2FkZFdpbmRvd1Jlc2l6ZUhhbmRsZXIoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkanVzdCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfYWRkV2luZG93UmVzaXplSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5fd2luZG93UmVzaXplSGFuZGxlciA9IGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkanVzdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDIwMCk7XG5cbiAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93aW5kb3cubmF0aXZlV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX3dpbmRvd1Jlc2l6ZUhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRqdXN0KGlucHV0c0NoYW5nZWQgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hdXRvc2l6ZSAmJiAhdGhpcy5fZGVzdHJveWVkICYmIHRoaXMudGV4dEFyZWFFbCAmJiB0aGlzLnRleHRBcmVhRWwucGFyZW50Tm9kZSkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VGV4dCA9IHRoaXMudGV4dEFyZWFFbC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlucHV0c0NoYW5nZWQgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQgPT09IHRoaXMuX29sZENvbnRlbnQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRBcmVhRWwub2Zmc2V0V2lkdGggPT09IHRoaXMuX29sZFdpZHRoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX29sZENvbnRlbnQgPSBjdXJyZW50VGV4dDtcbiAgICAgICAgICAgIHRoaXMuX29sZFdpZHRoID0gdGhpcy50ZXh0QXJlYUVsLm9mZnNldFdpZHRoO1xuXG4gICAgICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMudGV4dEFyZWFFbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnRleHRBcmVhRWwucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLndpZHRoID0gdGhpcy50ZXh0QXJlYUVsLm9mZnNldFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGNsb25lLnRleHRDb250ZW50ID0gY3VycmVudFRleHQ7XG5cbiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjbG9uZSk7XG5cbiAgICAgICAgICAgIGNsb25lLnN0eWxlWydvdmVyZmxvdy15J10gPSAnaGlkZGVuJztcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcblxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGNsb25lLnNjcm9sbEhlaWdodDtcblxuICAgICAgICAgICAgLy8gYWRkIGludG8gaGVpZ2h0IHRvcCBhbmQgYm90dG9tIGJvcmRlcnMnIHdpZHRoXG4gICAgICAgICAgICBsZXQgY29tcHV0ZWRTdHlsZSA9IHRoaXMuX3dpbmRvdy5uYXRpdmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjbG9uZSwgbnVsbCk7XG4gICAgICAgICAgICBoZWlnaHQgKz0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItdG9wLXdpZHRoJykpO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLWJvdHRvbS13aWR0aCcpKTtcblxuICAgICAgICAgICAgaWYgKGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm94LXNpemluZycpID09PSAnY29udGVudC1ib3gnKSB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0IC09IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0IC09IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1ib3R0b20nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG9sZEhlaWdodCA9IHRoaXMudGV4dEFyZWFFbC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCB3aWxsR3JvdyA9IGhlaWdodCA+IG9sZEhlaWdodDtcblxuICAgICAgICAgICAgaWYgKHRoaXMub25seUdyb3cgPT09IGZhbHNlIHx8IHdpbGxHcm93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHRoaXMuX2dldExpbmVIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzQ291bnQgPSBoZWlnaHQgLyBsaW5lSGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21pblJvd3MgJiYgdGhpcy5fbWluUm93cyA+PSByb3dzQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fbWluUm93cyAqIGxpbmVIZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4Um93cyAmJiB0aGlzLm1heFJvd3MgPD0gcm93c0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHNocmluayB0aGUgdGV4dGFyZWEgaWYgb25seUdyb3cgaXMgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLm1heFJvd3MgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLm9ubHlHcm93ID8gTWF0aC5tYXgobWF4SGVpZ2h0LCBvbGRIZWlnaHQpOiBtYXhIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dEFyZWFFbC5zdHlsZVsnb3ZlcmZsb3cteSddID0gJ2F1dG8nO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0QXJlYUVsLnN0eWxlWydvdmVyZmxvdy15J10gPSAnaGlkZGVuJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHRTdHlsZSA9IGhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0YW50ID0gdGhpcy51c2VJbXBvcnRhbnQgPyAnaW1wb3J0YW50JyA6ICcnO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0QXJlYUVsLnN0eWxlLnNldFByb3BlcnR5KCdoZWlnaHQnLCBoZWlnaHRTdHlsZSwgaW1wb3J0YW50KTtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplZC5lbWl0KGhlaWdodCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRMaW5lSGVpZ2h0KCkge1xuICAgICAgICBsZXQgbGluZUhlaWdodCA9IHBhcnNlSW50KHRoaXMudGV4dEFyZWFFbC5zdHlsZS5saW5lSGVpZ2h0LCAxMCk7XG4gICAgICAgIGlmIChpc05hTihsaW5lSGVpZ2h0KSAmJiB0aGlzLl93aW5kb3cubmF0aXZlV2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuX3dpbmRvdy5uYXRpdmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnRleHRBcmVhRWwpO1xuICAgICAgICAgICAgbGluZUhlaWdodCA9IHBhcnNlSW50KHN0eWxlcy5saW5lSGVpZ2h0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNOYU4obGluZUhlaWdodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5fd2luZG93Lm5hdGl2ZVdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMudGV4dEFyZWFFbCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJyk7XG4gICAgICAgICAgICBsaW5lSGVpZ2h0ID0gTWF0aC5mbG9vcihwYXJzZUludChmb250U2l6ZS5yZXBsYWNlKCdweCcsICcnKSwgMTApICogMS41KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5lSGVpZ2h0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVib3VuY2U8UGFyYW1zIGV4dGVuZHMgQXJyYXk8YW55Pj4oZnVuYzogKC4uLmFyZ3M6IFBhcmFtcykgPT4gYW55LCB0aW1lb3V0OiBudW1iZXIpOiAoLi4uYXJnczogUGFyYW1zKSA9PiB2b2lkIHtcbiAgbGV0IHRpbWVyOiBudW1iZXI7XG4gIHJldHVybiAoLi4uYXJnczogUGFyYW1zKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmdW5jKC4uLmFyZ3MpXG4gICAgfSwgdGltZW91dClcbiAgfVxufVxuXG4vLyBmdW5jdGlvbiBEZWJvdW5jZShmdW5jOiBhbnksIHdhaXQ6IG51bWJlciwgaW1tZWRpYXRlID0gZmFsc2UpIHtcbi8vICAgICBsZXQgdGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuLy8gICAgIHJldHVybiAoKSA9PiB7XG4vLyAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzO1xuLy8gICAgICAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzO1xuLy8gICAgICAgICBjb25zdCBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgIHRpbWVvdXQgPSB1bmRlZmluZWQ7XG4vLyAgICAgICAgICAgICBpZiAoIWltbWVkaWF0ZSkge1xuLy8gICAgICAgICAgICAgICAgIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH07XG4vLyAgICAgICAgIGNvbnN0IGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4vLyAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbi8vICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuLy8gICAgICAgICBpZiAoY2FsbE5vdykge1xuLy8gICAgICAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbi8vICAgICAgICAgfVxuLy8gICAgIH07XG4vLyB9XG4iXX0=