ng-cw-v12
Version:
Angular UI Component Library
117 lines • 18.5 kB
JavaScript
import { Component, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class CarouselListComponent {
constructor(eleRef, cdr) {
this.eleRef = eleRef;
this.cdr = cdr;
/** 滚动时间,多少秒滚动一格 */
this.ncTime = 1; //多少秒滚动一格
/** 显示多少行 */
this.ncRow = 1; //显示多少行
this.liCount = 0; //计算
this.liHeight = 0; //计算
// 将事件处理函数定义为类的属性
this.handleMouseEnter = () => {
const ul = this.eleRef.nativeElement.querySelector('ul');
if (!ul)
return;
ul.style.animationPlayState = 'paused';
Array.from(ul.getElementsByTagName('li')).forEach(li => {
li.style.animationPlayState = 'paused';
});
};
this.handleMouseLeave = () => {
const ul = this.eleRef.nativeElement.querySelector('ul');
if (!ul)
return;
ul.style.animationPlayState = 'running';
Array.from(ul.getElementsByTagName('li')).forEach(li => {
li.style.animationPlayState = 'running';
});
};
}
ngAfterViewInit() {
this.initializeCarousel();
this.setupMutationObserver();
}
initializeCarousel() {
let ul = this.eleRef.nativeElement.querySelector('ul');
if (!ul)
return;
const liElements = Array.from(ul.getElementsByTagName('li')).filter(li => !li.classList.contains('cloned'));
if (liElements.length === 0)
return;
this.liCount = liElements.length;
this.liHeight = liElements[0].offsetHeight;
this.ncRow = this.ncRow <= this.liCount ? this.ncRow : this.liCount;
// 清除之前可能添加的克隆元素
const clonedElements = ul.querySelectorAll('.cloned');
clonedElements.forEach(el => el.remove());
// 添加新的克隆元素
let copy = liElements.slice(0, this.ncRow).map((li) => {
const clonedLi = li.cloneNode(true);
clonedLi.classList.add('cloned');
return clonedLi;
});
copy.forEach(li => ul.appendChild(li));
// 重置动画
ul.style.animation = 'none';
ul.offsetHeight; // 触发重排
ul.style.animation = `move calc(${this.ncTime} * ${this.liCount} * 1s) steps(${this.liCount}) infinite`;
// 重置所有 li 的动画
const allLis = ul.getElementsByTagName('li');
Array.from(allLis).forEach(li => {
li.style.animation = 'none';
li.offsetHeight; // 触发重排
li.style.animation = `liMove calc(${this.ncTime} * 1s) infinite`;
});
// 先移除旧的事件监听器,再添加新的
ul.removeEventListener('mouseenter', this.handleMouseEnter);
ul.removeEventListener('mouseleave', this.handleMouseLeave);
ul.addEventListener('mouseenter', this.handleMouseEnter);
ul.addEventListener('mouseleave', this.handleMouseLeave);
//在操作完 DOM 后调用 detectChanges() 确保变更被正确检测,防止下面的错误,用setTimeout的话该组件存在闪烁的问题
//ERROR RuntimeError: NG0100: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: '0'. Current value: '5'.. Find more at https://angular.io/errors/NG0100
this.cdr.detectChanges();
}
setupMutationObserver() {
const ul = this.eleRef.nativeElement.querySelector('ul');
if (!ul)
return;
this.observer = new MutationObserver(() => {
// console.log('数据发生变化');
this.initializeCarousel();
});
this.observer.observe(ul, {
// childList: true,//该项开启后非常卡顿,initializeCarousel会一直执行
subtree: true,
characterData: true
});
}
ngOnDestroy() {
if (this.observer) {
this.observer.disconnect();
}
// 使用类属性中定义的事件处理函数来移除监听器
const ul = this.eleRef.nativeElement.querySelector('ul');
if (ul) {
ul.removeEventListener('mouseenter', this.handleMouseEnter);
ul.removeEventListener('mouseleave', this.handleMouseLeave);
}
}
}
CarouselListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CarouselListComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
CarouselListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: CarouselListComponent, selector: "nc-carousel-list", inputs: { ncTime: "ncTime", ncRow: "ncRow" }, ngImport: i0, template: "<div class=\"carousel\" style=\"--liCount: {{liCount}};--liHeight: {{liHeight}};--speed: {{ncTime}};--row: {{ncRow}};\">\r\n <ng-content></ng-content>\r\n</div>", styles: ["::ng-deep .carousel{height:calc(var(--liHeight) * 1px * var(--row));overflow:hidden}::ng-deep .carousel ul{margin:0;padding:0}::ng-deep .carousel ul li{list-style:none;cursor:pointer}@keyframes move{0%{transform:translate(0)}to{transform:translateY(calc(var(--liCount) * var(--liHeight) * -1px))}}@keyframes liMove{0%{transform:translate(0)}80%,to{transform:translateY(calc(var(--liHeight) * -1px))}}\n"] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CarouselListComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-carousel-list',
templateUrl: './carousel-list.component.html',
styleUrls: ['./carousel-list.component.less']
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { ncTime: [{
type: Input
}], ncRow: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2Nhcm91c2VsLWxpc3QvY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2Nhcm91c2VsLWxpc3QvY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7O0FBTzFHLE1BQU0sT0FBTyxxQkFBcUI7SUE2QmhDLFlBQ1UsTUFBa0IsRUFDbEIsR0FBc0I7UUFEdEIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTlCaEMsbUJBQW1CO1FBQ1YsV0FBTSxHQUFXLENBQUMsQ0FBQyxDQUFBLFNBQVM7UUFDckMsWUFBWTtRQUNILFVBQUssR0FBVyxDQUFDLENBQUMsQ0FBQSxPQUFPO1FBRWxDLFlBQU8sR0FBVyxDQUFDLENBQUMsQ0FBQSxJQUFJO1FBQ3hCLGFBQVEsR0FBVyxDQUFDLENBQUMsQ0FBQSxJQUFJO1FBR3pCLGlCQUFpQjtRQUNULHFCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUM5QixNQUFNLEVBQUUsR0FBZ0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxFQUFFO2dCQUFFLE9BQU87WUFDaEIsRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7WUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ3JELEVBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQWtC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QUFDLEVBQUUsRUFBRTtZQUN4QixzREFBc0Q7WUFDdEQsT0FBTyxFQUFFLElBQUk7WUFDYixhQUFhLEVBQUUsSUFBSTtTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQzVCO1FBQ0Qsd0JBQXdCO1FBQ3hCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLEVBQUUsRUFBRTtZQUNOLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUQsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUM3RDtJQUNILENBQUM7O2tIQWpIVSxxQkFBcUI7c0dBQXJCLHFCQUFxQixzR0NQbEMscUtBRU07MkZES08scUJBQXFCO2tCQUxqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFdBQVcsRUFBRSxnQ0FBZ0M7b0JBQzdDLFNBQVMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDO2lCQUM5QztpSUFHVSxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYy1jYXJvdXNlbC1saXN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2Fyb3VzZWwtbGlzdC5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiDmu5rliqjml7bpl7TvvIzlpJrlsJHnp5Lmu5rliqjkuIDmoLwgKi9cclxuICBASW5wdXQoKSBuY1RpbWU6IG51bWJlciA9IDE7Ly/lpJrlsJHnp5Lmu5rliqjkuIDmoLxcclxuICAvKiog5pi+56S65aSa5bCR6KGMICovXHJcbiAgQElucHV0KCkgbmNSb3c6IG51bWJlciA9IDE7Ly/mmL7npLrlpJrlsJHooYxcclxuXHJcbiAgbGlDb3VudDogbnVtYmVyID0gMDsvL+iuoeeul1xyXG4gIGxpSGVpZ2h0OiBudW1iZXIgPSAwOy8v6K6h566XXHJcbiAgcHJpdmF0ZSBvYnNlcnZlciE6IE11dGF0aW9uT2JzZXJ2ZXI7XHJcblxyXG4gIC8vIOWwhuS6i+S7tuWkhOeQhuWHveaVsOWumuS5ieS4uuexu+eahOWxnuaAp1xyXG4gIHByaXZhdGUgaGFuZGxlTW91c2VFbnRlciA9ICgpID0+IHtcclxuICAgIGNvbnN0IHVsOiBIVE1MRWxlbWVudCA9IHRoaXMuZWxlUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwnKTtcclxuICAgIGlmICghdWwpIHJldHVybjtcclxuICAgIHVsLnN0eWxlLmFuaW1hdGlvblBsYXlTdGF0ZSA9ICdwYXVzZWQnO1xyXG4gICAgQXJyYXkuZnJvbSh1bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKSkuZm9yRWFjaChsaSA9PiB7XHJcbiAgICAgIGxpLnN0eWxlLmFuaW1hdGlvblBsYXlTdGF0ZSA9ICdwYXVzZWQnO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZUxlYXZlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdWw6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1bCcpO1xyXG4gICAgaWYgKCF1bCkgcmV0dXJuO1xyXG4gICAgdWwuc3R5bGUuYW5pbWF0aW9uUGxheVN0YXRlID0gJ3J1bm5pbmcnO1xyXG4gICAgQXJyYXkuZnJvbSh1bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKSkuZm9yRWFjaChsaSA9PiB7XHJcbiAgICAgIGxpLnN0eWxlLmFuaW1hdGlvblBsYXlTdGF0ZSA9ICdydW5uaW5nJztcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVDYXJvdXNlbCgpO1xyXG4gICAgdGhpcy5zZXR1cE11dGF0aW9uT2JzZXJ2ZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNhcm91c2VsKCk6IHZvaWQge1xyXG4gICAgbGV0IHVsOiBIVE1MRWxlbWVudCA9IHRoaXMuZWxlUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwnKTtcclxuICAgIGlmICghdWwpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBsaUVsZW1lbnRzID0gQXJyYXkuZnJvbSh1bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKSkuZmlsdGVyKGxpID0+ICFsaS5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsb25lZCcpKTtcclxuICAgIGlmIChsaUVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMubGlDb3VudCA9IGxpRWxlbWVudHMubGVuZ3RoO1xyXG4gICAgdGhpcy5saUhlaWdodCA9IGxpRWxlbWVudHNbMF0ub2Zmc2V0SGVpZ2h0O1xyXG4gICAgdGhpcy5uY1JvdyA9IHRoaXMubmNSb3cgPD0gdGhpcy5saUNvdW50ID8gdGhpcy5uY1JvdyA6IHRoaXMubGlDb3VudDtcclxuXHJcbiAgICAvLyDmuIXpmaTkuYvliY3lj6/og73mt7vliqDnmoTlhYvpmoblhYPntKBcclxuICAgIGNvbnN0IGNsb25lZEVsZW1lbnRzID0gdWwucXVlcnlTZWxlY3RvckFsbCgnLmNsb25lZCcpO1xyXG4gICAgY2xvbmVkRWxlbWVudHMuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XHJcblxyXG4gICAgLy8g5re75Yqg5paw55qE5YWL6ZqG5YWD57SgXHJcbiAgICBsZXQgY29weSA9IGxpRWxlbWVudHMuc2xpY2UoMCwgdGhpcy5uY1JvdykubWFwKChsaSkgPT4ge1xyXG4gICAgICBjb25zdCBjbG9uZWRMaSA9IGxpLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgY2xvbmVkTGkuY2xhc3NMaXN0LmFkZCgnY2xvbmVkJyk7XHJcbiAgICAgIHJldHVybiBjbG9uZWRMaTtcclxuICAgIH0pO1xyXG4gICAgY29weS5mb3JFYWNoKGxpID0+IHVsLmFwcGVuZENoaWxkKGxpKSk7XHJcblxyXG4gICAgLy8g6YeN572u5Yqo55S7XHJcbiAgICB1bC5zdHlsZS5hbmltYXRpb24gPSAnbm9uZSc7XHJcbiAgICB1bC5vZmZzZXRIZWlnaHQ7IC8vIOinpuWPkemHjeaOklxyXG4gICAgdWwuc3R5bGUuYW5pbWF0aW9uID0gYG1vdmUgY2FsYygke3RoaXMubmNUaW1lfSAqICR7dGhpcy5saUNvdW50fSAqIDFzKSBzdGVwcygke3RoaXMubGlDb3VudH0pIGluZmluaXRlYDtcclxuXHJcbiAgICAvLyDph43nva7miYDmnIkgbGkg55qE5Yqo55S7XHJcbiAgICBjb25zdCBhbGxMaXMgPSB1bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKTtcclxuICAgIEFycmF5LmZyb20oYWxsTGlzKS5mb3JFYWNoKGxpID0+IHtcclxuICAgICAgbGkuc3R5bGUuYW5pbWF0aW9uID0gJ25vbmUnO1xyXG4gICAgICBsaS5vZmZzZXRIZWlnaHQ7IC8vIOinpuWPkemHjeaOklxyXG4gICAgICBsaS5zdHlsZS5hbmltYXRpb24gPSBgbGlNb3ZlIGNhbGMoJHt0aGlzLm5jVGltZX0gKiAxcykgaW5maW5pdGVgO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5YWI56e76Zmk5pen55qE5LqL5Lu255uR5ZCs5Zmo77yM5YaN5re75Yqg5paw55qEXHJcbiAgICB1bC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVNb3VzZUVudGVyKTtcclxuICAgIHVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLmhhbmRsZU1vdXNlTGVhdmUpO1xyXG5cclxuICAgIHVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLmhhbmRsZU1vdXNlRW50ZXIpO1xyXG4gICAgdWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XHJcblxyXG4gICAgLy/lnKjmk43kvZzlrowgRE9NIOWQjuiwg+eUqCBkZXRlY3RDaGFuZ2VzKCkg56Gu5L+d5Y+Y5pu06KKr5q2j56Gu5qOA5rWL77yM6Ziy5q2i5LiL6Z2i55qE6ZSZ6K+v77yM55Soc2V0VGltZW91dOeahOivneivpee7hOS7tuWtmOWcqOmXqueDgeeahOmXrumimFxyXG4gICAgLy9FUlJPUiBSdW50aW1lRXJyb3I6IE5HMDEwMDogRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvcjogRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZC4gUHJldmlvdXMgdmFsdWU6ICcwJy4gQ3VycmVudCB2YWx1ZTogJzUnLi4gRmluZCBtb3JlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9lcnJvcnMvTkcwMTAwXHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwTXV0YXRpb25PYnNlcnZlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVsID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1bCcpO1xyXG4gICAgaWYgKCF1bCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCfmlbDmja7lj5HnlJ/lj5jljJYnKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplQ2Fyb3VzZWwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh1bCwge1xyXG4gICAgICAvLyBjaGlsZExpc3Q6IHRydWUsLy/or6XpobnlvIDlkK/lkI7pnZ7luLjljaHpob/vvIxpbml0aWFsaXplQ2Fyb3VzZWzkvJrkuIDnm7TmiafooYxcclxuICAgICAgc3VidHJlZTogdHJ1ZSxcclxuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XHJcbiAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG4gICAgLy8g5L2/55So57G75bGe5oCn5Lit5a6a5LmJ55qE5LqL5Lu25aSE55CG5Ye95pWw5p2l56e76Zmk55uR5ZCs5ZmoXHJcbiAgICBjb25zdCB1bCA9IHRoaXMuZWxlUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwnKTtcclxuICAgIGlmICh1bCkge1xyXG4gICAgICB1bC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVNb3VzZUVudGVyKTtcclxuICAgICAgdWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlTW91c2VMZWF2ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjYXJvdXNlbFwiIHN0eWxlPVwiLS1saUNvdW50OiB7e2xpQ291bnR9fTstLWxpSGVpZ2h0OiB7e2xpSGVpZ2h0fX07LS1zcGVlZDoge3tuY1RpbWV9fTstLXJvdzoge3tuY1Jvd319O1wiPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L2Rpdj4iXX0=