UNPKG

ng-cw-v12

Version:

Angular UI component library

178 lines 24.2 kB
import { Component, Input, ViewChild, HostListener } from '@angular/core'; import * as i0 from "@angular/core"; export class AutoScrollTextComponent { constructor() { this.position = 0; this.isPaused = false; this.lastTimestamp = 0; this.pauseStartTime = 0; // 滚动文本 this._text = ''; // 滚动速度,单位为像素/秒 this.ncSpeed = 50; // 是否开启无缝滚动 this._loop = false; // 开启无缝滚动时,间距,单位为像素 this.ncGap = 0; // 是否启用鼠标悬停暂停滚动 this._pause = false; } set ncText(val) { this._text = val; setTimeout(() => { if (this.textContainer && this.scrollText) { this.resetScroll(); } }); } get ncText() { return this._text; } set ncLoop(val) { this._loop = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncLoop() { return this._loop; } set ncPause(val) { this._pause = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncPause() { return this._pause; } ngOnInit() { } ngOnDestroy() { if (this.animationId) { cancelAnimationFrame(this.animationId); } } // 鼠标移入事件处理 onMouseEnter() { if (this.ncPause) { this.isPaused = true; this.pauseStartTime = performance.now(); } } // 鼠标移出事件处理 onMouseLeave() { if (this.ncPause && this.isPaused) { this.isPaused = false; const pauseDuration = performance.now() - this.pauseStartTime; this.lastTimestamp += pauseDuration; } } startScrolling() { // 检查文本是否需要滚动 if (!this.textContainer || !this.scrollText) return; const containerWidth = this.textContainer.nativeElement.offsetWidth; const textWidth = this.scrollText.nativeElement.offsetWidth; // 只有当文本宽度大于容器宽度时才滚动 if (textWidth > containerWidth) { this.lastTimestamp = 0; const animate = (timestamp) => { if (!this.lastTimestamp) this.lastTimestamp = timestamp; // 当不处于暂停状态时才计算位移 if (!this.isPaused) { const elapsed = timestamp - this.lastTimestamp; // 根据时间和速度计算位移 this.position += (elapsed / 1000) * this.ncSpeed; // 当文本的最后一个字符出现在视窗内时创建复制文本实现无缝衔接 if (this.position >= textWidth - containerWidth) { if (this.ncLoop) { // 让文本平滑地重新开始滚动,而不是突然跳回开始位置 // 将第二份文本复制品拼接在原文本后面,实现无缝衔接效果 if (!this.scrollText.nativeElement.querySelector('.duplicate-text')) { const duplicateText = document.createElement('span'); duplicateText.classList.add('duplicate-text'); duplicateText.textContent = this.ncText; duplicateText.style.marginLeft = `${this.ncGap}px`; this.scrollText.nativeElement.appendChild(duplicateText); } } else { // 不开启无缝滚动时,当文本的最后一个字符出现在视窗内时重新开始 this.position = 0; } } // 实现真正的无缝滚动:当滚动位置超过第一段文本宽度时,重置位置并保持视觉连续 if (this.ncLoop && this.position >= textWidth + this.ncGap) { // 重置位置,但保持视觉效果不变 this.position = 0; // 移除复制的文本元素 const duplicateText = this.scrollText.nativeElement.querySelector('.duplicate-text'); if (duplicateText) { this.scrollText.nativeElement.removeChild(duplicateText); } // 立即重新设置transform,避免闪烁 this.scrollText.nativeElement.style.transform = 'translateX(0)'; // 立即创建新的复制文本 const newDuplicateText = document.createElement('span'); newDuplicateText.classList.add('duplicate-text'); newDuplicateText.textContent = this.ncText; newDuplicateText.style.marginLeft = `${this.ncGap}px`; this.scrollText.nativeElement.appendChild(newDuplicateText); } else { // 应用位移 this.scrollText.nativeElement.style.transform = `translateX(-${this.position}px)`; } // 更新时间戳 this.lastTimestamp = timestamp; } this.animationId = requestAnimationFrame(animate); }; this.animationId = requestAnimationFrame(animate); } } resetScroll() { if (this.animationId) { cancelAnimationFrame(this.animationId); } this.position = 0; this.isPaused = false; if (this.scrollText) { this.scrollText.nativeElement.style.transform = 'translateX(0)'; // 清除可能存在的重复文本 const duplicateText = this.scrollText.nativeElement.querySelector('.duplicate-text'); if (duplicateText) { this.scrollText.nativeElement.removeChild(duplicateText); } } this.startScrolling(); } } AutoScrollTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AutoScrollTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); AutoScrollTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AutoScrollTextComponent, selector: "nc-auto-scroll-text", inputs: { ncText: "ncText", ncSpeed: "ncSpeed", ncLoop: "ncLoop", ncGap: "ncGap", ncPause: "ncPause" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, viewQueries: [{ propertyName: "textContainer", first: true, predicate: ["textContainer"], descendants: true }, { propertyName: "scrollText", first: true, predicate: ["scrollText"], descendants: true }], ngImport: i0, template: "<div class=\"auto-scroll-container\" #textContainer>\n <div class=\"scroll-text\" #scrollText>\n <span>{{ ncText }}</span>\n </div>\n</div>\n", styles: [".auto-scroll-container{width:100%;overflow:hidden;white-space:nowrap;position:relative}.scroll-text{display:inline-block;white-space:nowrap}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AutoScrollTextComponent, decorators: [{ type: Component, args: [{ selector: 'nc-auto-scroll-text', templateUrl: './auto-scroll-text.component.html', styleUrls: ['./auto-scroll-text.component.less'] }] }], ctorParameters: function () { return []; }, propDecorators: { textContainer: [{ type: ViewChild, args: ['textContainer'] }], scrollText: [{ type: ViewChild, args: ['scrollText'] }], ncText: [{ type: Input }], ncSpeed: [{ type: Input }], ncLoop: [{ type: Input }], ncGap: [{ type: Input }], ncPause: [{ type: Input }], onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], onMouseLeave: [{ type: HostListener, args: ['mouseleave'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2F1dG8tc2Nyb2xsLXRleHQvYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2F1dG8tc2Nyb2xsLXRleHQvYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYyxTQUFTLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU96RyxNQUFNLE9BQU8sdUJBQXVCO0lBK0NsQztRQTFDUSxhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBQ3JCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFFbkMsT0FBTztRQUNDLFVBQUssR0FBVyxFQUFFLENBQUM7UUFhM0IsZUFBZTtRQUNOLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDOUIsV0FBVztRQUNILFVBQUssR0FBWSxLQUFLLENBQUM7UUFRL0IsbUJBQW1CO1FBQ1YsVUFBSyxHQUFXLENBQUMsQ0FBQztRQUMzQixlQUFlO1FBQ1AsV0FBTSxHQUFZLEtBQUssQ0FBQztJQVNoQixDQUFDO0lBbkNqQixJQUNJLE1BQU0sQ0FBQyxHQUFXO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDekMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJ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O3dHQUF2Qix1QkFBdUIsdWNDUHBDLG9KQUtBOzJGREVhLHVCQUF1QjtrQkFMbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixXQUFXLEVBQUUsbUNBQW1DO29CQUNoRCxTQUFTLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQztpQkFDakQ7MEVBRTZCLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFDRCxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBV25CLE1BQU07c0JBRFQsS0FBSztnQkFhRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUYsTUFBTTtzQkFEVCxLQUFLO2dCQVFHLEtBQUs7c0JBQWIsS0FBSztnQkFJRixPQUFPO3NCQURWLEtBQUs7Z0JBb0JOLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZO2dCQVUxQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYy1hdXRvLXNjcm9sbC10ZXh0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYXV0by1zY3JvbGwtdGV4dC5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRvU2Nyb2xsVGV4dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCd0ZXh0Q29udGFpbmVyJykgdGV4dENvbnRhaW5lciE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsVGV4dCcpIHNjcm9sbFRleHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcml2YXRlIGFuaW1hdGlvbklkITogbnVtYmVyO1xyXG4gIHByaXZhdGUgcG9zaXRpb246IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBpc1BhdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbGFzdFRpbWVzdGFtcDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHBhdXNlU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xyXG5cclxuICAvLyDmu5rliqjmlofmnKxcclxuICBwcml2YXRlIF90ZXh0OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY1RleHQodmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3RleHQgPSB2YWw7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudGV4dENvbnRhaW5lciAmJiB0aGlzLnNjcm9sbFRleHQpIHtcclxuICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXQgbmNUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcclxuICB9XHJcbiAgLy8g5rua5Yqo6YCf5bqm77yM5Y2V5L2N5Li65YOP57SgL+enklxyXG4gIEBJbnB1dCgpIG5jU3BlZWQ6IG51bWJlciA9IDUwO1xyXG4gIC8vIOaYr+WQpuW8gOWQr+aXoOe8nea7muWKqFxyXG4gIHByaXZhdGUgX2xvb3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY0xvb3AodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9sb29wID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNMb29wKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvb3A7XHJcbiAgfVxyXG4gIC8vIOW8gOWQr+aXoOe8nea7muWKqOaXtu+8jOmXtOi3ne+8jOWNleS9jeS4uuWDj+e0oFxyXG4gIEBJbnB1dCgpIG5jR2FwOiBudW1iZXIgPSAwO1xyXG4gIC8vIOaYr+WQpuWQr+eUqOm8oOagh+aCrOWBnOaaguWBnOa7muWKqFxyXG4gIHByaXZhdGUgX3BhdXNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNQYXVzZSh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3BhdXNlID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNQYXVzZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXVzZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uSWQpIHtcclxuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25JZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDpvKDmoIfnp7vlhaXkuovku7blpITnkIZcclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcclxuICBvbk1vdXNlRW50ZXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5uY1BhdXNlKSB7XHJcbiAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnBhdXNlU3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDpvKDmoIfnp7vlh7rkuovku7blpITnkIZcclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcclxuICBvbk1vdXNlTGVhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5uY1BhdXNlICYmIHRoaXMuaXNQYXVzZWQpIHtcclxuICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICBjb25zdCBwYXVzZUR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLnBhdXNlU3RhcnRUaW1lO1xyXG4gICAgICB0aGlzLmxhc3RUaW1lc3RhbXAgKz0gcGF1c2VEdXJhdGlvbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRTY3JvbGxpbmcoKTogdm9pZCB7XHJcbiAgICAvLyDmo4Dmn6XmlofmnKzmmK/lkKbpnIDopoHmu5rliqhcclxuICAgIGlmICghdGhpcy50ZXh0Q29udGFpbmVyIHx8ICF0aGlzLnNjcm9sbFRleHQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMudGV4dENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgY29uc3QgdGV4dFdpZHRoID0gdGhpcy5zY3JvbGxUZXh0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcblxyXG4gICAgLy8g5Y+q5pyJ5b2T5paH5pys5a695bqm5aSn5LqO5a655Zmo5a695bqm5pe25omN5rua5YqoXHJcbiAgICBpZiAodGV4dFdpZHRoID4gY29udGFpbmVyV2lkdGgpIHtcclxuICAgICAgdGhpcy5sYXN0VGltZXN0YW1wID0gMDtcclxuXHJcbiAgICAgIGNvbnN0IGFuaW1hdGUgPSAodGltZXN0YW1wOiBudW1iZXIpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMubGFzdFRpbWVzdGFtcCkgdGhpcy5sYXN0VGltZXN0YW1wID0gdGltZXN0YW1wO1xyXG5cclxuICAgICAgICAvLyDlvZPkuI3lpITkuo7mmoLlgZznirbmgIHml7bmiY3orqHnrpfkvY3np7tcclxuICAgICAgICBpZiAoIXRoaXMuaXNQYXVzZWQpIHtcclxuICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSB0aW1lc3RhbXAgLSB0aGlzLmxhc3RUaW1lc3RhbXA7XHJcblxyXG4gICAgICAgICAgLy8g5qC55o2u5pe26Ze05ZKM6YCf5bqm6K6h566X5L2N56e7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uICs9IChlbGFwc2VkIC8gMTAwMCkgKiB0aGlzLm5jU3BlZWQ7XHJcblxyXG4gICAgICAgICAgLy8g5b2T5paH5pys55qE5pyA5ZCO5LiA5Liq5a2X56ym5Ye6546w5Zyo6KeG56qX5YaF5pe25Yib5bu65aSN5Yi25paH5pys5a6e546w5peg57yd6KGU5o6lXHJcbiAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA+PSB0ZXh0V2lkdGggLSBjb250YWluZXJXaWR0aCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uY0xvb3ApIHtcclxuICAgICAgICAgICAgICAvLyDorqnmlofmnKzlubPmu5HlnLDph43mlrDlvIDlp4vmu5rliqjvvIzogIzkuI3mmK/nqoHnhLbot7Plm57lvIDlp4vkvY3nva5cclxuICAgICAgICAgICAgICAvLyDlsIbnrKzkuozku73mlofmnKzlpI3liLblk4Hmi7zmjqXlnKjljp/mlofmnKzlkI7pnaLvvIzlrp7njrDml6DnvJ3ooZTmjqXmlYjmnpxcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kdXBsaWNhdGUtdGV4dCcpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgICAgICAgICAgZHVwbGljYXRlVGV4dC5jbGFzc0xpc3QuYWRkKCdkdXBsaWNhdGUtdGV4dCcpO1xyXG4gICAgICAgICAgICAgICAgZHVwbGljYXRlVGV4dC50ZXh0Q29udGVudCA9IHRoaXMubmNUZXh0O1xyXG4gICAgICAgICAgICAgICAgZHVwbGljYXRlVGV4dC5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7dGhpcy5uY0dhcH1weGA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChkdXBsaWNhdGVUZXh0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8g5LiN5byA5ZCv5peg57yd5rua5Yqo5pe277yM5b2T5paH5pys55qE5pyA5ZCO5LiA5Liq5a2X56ym5Ye6546w5Zyo6KeG56qX5YaF5pe26YeN5paw5byA5aeLXHJcbiAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyDlrp7njrDnnJ/mraPnmoTml6DnvJ3mu5rliqjvvJrlvZPmu5rliqjkvY3nva7otoXov4fnrKzkuIDmrrXmlofmnKzlrr3luqbml7bvvIzph43nva7kvY3nva7lubbkv53mjIHop4bop4nov57nu61cclxuICAgICAgICAgIGlmICh0aGlzLm5jTG9vcCAmJiB0aGlzLnBvc2l0aW9uID49IHRleHRXaWR0aCArIHRoaXMubmNHYXApIHtcclxuICAgICAgICAgICAgLy8g6YeN572u5L2N572u77yM5L2G5L+d5oyB6KeG6KeJ5pWI5p6c5LiN5Y+YXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xyXG5cclxuICAgICAgICAgICAgLy8g56e76Zmk5aSN5Yi255qE5paH5pys5YWD57SgXHJcbiAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZVRleHQgPSB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZHVwbGljYXRlLXRleHQnKTtcclxuICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZVRleHQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChkdXBsaWNhdGVUZXh0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g56uL5Y2z6YeN5paw6K6+572udHJhbnNmb3Jt77yM6YG/5YWN6Zeq54OBXHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcclxuXHJcbiAgICAgICAgICAgIC8vIOeri+WNs+WIm+W7uuaWsOeahOWkjeWItuaWh+acrFxyXG4gICAgICAgICAgICBjb25zdCBuZXdEdXBsaWNhdGVUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgICAgICBuZXdEdXBsaWNhdGVUZXh0LmNsYXNzTGlzdC5hZGQoJ2R1cGxpY2F0ZS10ZXh0Jyk7XHJcbiAgICAgICAgICAgIG5ld0R1cGxpY2F0ZVRleHQudGV4dENvbnRlbnQgPSB0aGlzLm5jVGV4dDtcclxuICAgICAgICAgICAgbmV3RHVwbGljYXRlVGV4dC5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7dGhpcy5uY0dhcH1weGA7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKG5ld0R1cGxpY2F0ZVRleHQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8g5bqU55So5L2N56e7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKC0ke3RoaXMucG9zaXRpb259cHgpYDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyDmm7TmlrDml7bpl7TmiLNcclxuICAgICAgICAgIHRoaXMubGFzdFRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLmFuaW1hdGlvbklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldFNjcm9sbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmFuaW1hdGlvbklkKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uSWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XHJcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5zY3JvbGxUZXh0KSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVGV4dC5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcclxuICAgICAgLy8g5riF6Zmk5Y+v6IO95a2Y5Zyo55qE6YeN5aSN5paH5pysXHJcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZVRleHQgPSB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZHVwbGljYXRlLXRleHQnKTtcclxuICAgICAgaWYgKGR1cGxpY2F0ZVRleHQpIHtcclxuICAgICAgICB0aGlzLnNjcm9sbFRleHQubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChkdXBsaWNhdGVUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zdGFydFNjcm9sbGluZygpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYXV0by1zY3JvbGwtY29udGFpbmVyXCIgI3RleHRDb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJzY3JvbGwtdGV4dFwiICNzY3JvbGxUZXh0PlxuICAgIDxzcGFuPnt7IG5jVGV4dCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==