ng-cw-v12
Version:
Angular UI component library
192 lines • 21.9 kB
JavaScript
import { Component, Input } from '@angular/core';
import { animate, style, transition, trigger, state } from '@angular/animations';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class NumberCounterComponent {
constructor(elementRef) {
this.elementRef = elementRef;
/** 要显示的数字 */
this._value = 0;
/** 每个数字动画持续时间 */
this.ncDuration = 1000;
/** 每个数字之间的延迟 */
this.ncDelayMultiple = 0;
/** 存在每个数字之间的延迟时,数字方向 */
this.ncDirection = 'left';
/** 每个数字之间的间距 */
this.ncGap = 0;
/** 开始前的延迟 */
this.ncDelay = 0;
/** 是否在视图可见时才开始动画 */
this._startOnView = false;
/** 是否只执行一次动画 */
this._once = false;
this.digits = [];
this.observer = null;
this.timeout = null;
}
set ncValue(value) {
this._value = value;
setTimeout(() => {
this.start();
});
}
get ncValue() {
return this._value;
}
set ncStartOnView(val) {
this._startOnView = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncStartOnView() {
return this._startOnView;
}
set ncOnce(val) {
this._once = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncOnce() {
return this._once;
}
ngOnInit() { }
ngOnDestroy() {
this.clear();
}
start() {
this.clear();
if (!this.ncStartOnView) {
this.processValue();
this.timeout = setTimeout(() => {
this.startAnimation();
}, this.ncDelay);
}
else {
this.setupIntersectionObserver();
}
}
clear() {
if (this.observer) {
this.observer.disconnect();
}
if (this.timeout) {
clearTimeout(this.timeout);
}
}
setupIntersectionObserver() {
this.observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
this.processValue();
this.timeout = setTimeout(() => {
this.startAnimation();
}, this.ncDelay);
if (this.ncOnce) {
if (this.observer) {
this.observer.disconnect();
}
}
}
else if (!this.ncOnce) {
this.resetAnimation();
}
}, { threshold: 0.1 });
this.observer.observe(this.elementRef.nativeElement);
}
processValue() {
this.digits = [];
const stringValue = this.ncValue.toString();
for (let i = 0; i < stringValue.length; i++) {
const digit = parseInt(stringValue[i]);
// 对于所有数字,都生成0到9的序列,然后再从0到最终数字
let numbers = [
...Array.from({ length: 10 }, (_, index) => index),
...Array.from({ length: digit + 1 }, (_, index) => index)
];
let delay = 0;
if (this.ncDirection === 'left') {
delay = (stringValue.length - 1 - i) * this.ncDelayMultiple;
}
else {
delay = i * this.ncDelayMultiple;
}
this.digits.push({
numbers: numbers,
targetPosition: -(numbers.length - 1),
state: 'initial',
delay: delay
});
}
}
startAnimation() {
this.digits.forEach((digit) => {
setTimeout(() => {
digit.state = 'final';
}, digit.delay);
});
}
resetAnimation() {
if (this.timeout) {
clearTimeout(this.timeout);
}
this.digits.forEach(digit => {
digit.state = 'initial';
});
}
}
NumberCounterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NumberCounterComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
NumberCounterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: NumberCounterComponent, selector: "nc-number-counter", inputs: { ncValue: "ncValue", ncDuration: "ncDuration", ncDelayMultiple: "ncDelayMultiple", ncDirection: "ncDirection", ncGap: "ncGap", ncDelay: "ncDelay", ncStartOnView: "ncStartOnView", ncOnce: "ncOnce" }, ngImport: i0, template: "<div class=\"number-counter-container\" [ngClass]=\"{'gap-x': ncGap > 0}\" [style.--gap.px]=\"ncGap\">\n <div class=\"digit-wrapper\" *ngFor=\"let digit of digits; let i = index\">\n <div class=\"digits-strip\"\n [@countAnimation]=\"{value: digit.state, params: {duration: ncDuration, delay: digit.delay, finalPosition: digit.targetPosition}}\">\n <div class=\"digit\" *ngFor=\"let num of digit.numbers\">{{num}}</div>\n </div>\n </div>\n</div>", styles: [":host{display:inline-block}.number-counter-container{display:flex;width:-moz-fit-content;width:fit-content}.gap-x>*+*{margin-left:var(--gap)}.digit-wrapper{overflow:hidden;position:relative;height:1em;line-height:1em}.digit-wrapper .digits-strip{width:100%;transform:translateY(0);will-change:transform}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [
trigger('countAnimation', [
state('initial', style({
transform: 'translateY(0)'
})),
state('final', style({
transform: 'translateY({{finalPosition}}em)'
}), {
params: { finalPosition: 0 }
}),
transition('initial => final', [
animate('{{duration}}ms {{delay}}ms cubic-bezier(0.33, 1, 0.68, 1)')
], {
params: { duration: 1000, delay: 0 }
})
])
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NumberCounterComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-number-counter',
templateUrl: './number-counter.component.html',
styleUrls: ['./number-counter.component.less'],
animations: [
trigger('countAnimation', [
state('initial', style({
transform: 'translateY(0)'
})),
state('final', style({
transform: 'translateY({{finalPosition}}em)'
}), {
params: { finalPosition: 0 }
}),
transition('initial => final', [
animate('{{duration}}ms {{delay}}ms cubic-bezier(0.33, 1, 0.68, 1)')
], {
params: { duration: 1000, delay: 0 }
})
])
]
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { ncValue: [{
type: Input
}], ncDuration: [{
type: Input
}], ncDelayMultiple: [{
type: Input
}], ncDirection: [{
type: Input
}], ncGap: [{
type: Input
}], ncDelay: [{
type: Input
}], ncStartOnView: [{
type: Input
}], ncOnce: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLWNvdW50ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9udW1iZXItY291bnRlci9udW1iZXItY291bnRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL251bWJlci1jb3VudGVyL251bWJlci1jb3VudGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUF3QmpGLE1BQU0sT0FBTyxzQkFBc0I7SUErQ2pDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUE5QzFDLGFBQWE7UUFDTCxXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBWTNCLGlCQUFpQjtRQUNSLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDbkMsZ0JBQWdCO1FBQ1Asb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDckMsd0JBQXdCO1FBQ2YsZ0JBQVcsR0FBcUIsTUFBTSxDQUFDO1FBQ2hELGdCQUFnQjtRQUNQLFVBQUssR0FBVyxDQUFDLENBQUM7UUFDM0IsYUFBYTtRQUNKLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDN0Isb0JBQW9CO1FBQ1osaUJBQVksR0FBWSxLQUFLLENBQUM7UUFRdEMsZ0JBQWdCO1FBQ1IsVUFBSyxHQUFZLEtBQUssQ0FBQztRQVMvQixXQUFNLEdBQWtGLEVBQUUsQ0FBQztRQUNuRixhQUFRLEdBQWdDLElBQUksQ0FBQztRQUM3QyxZQUFPLEdBQVEsSUFBSSxDQUFDO0lBRWtCLENBQUM7SUE1Qy9DLElBQ0ksT0FBTyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFD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Z0IsRUFBRTs0QkFDeEIsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7Z0NBQ3JCLFNBQVMsRUFBRSxlQUFlOzZCQUMzQixDQUFDLENBQUM7NEJBQ0gsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Z0NBQ25CLFNBQVMsRUFBRSxpQ0FBaUM7NkJBQzdDLENBQUMsRUFBRTtnQ0FDRixNQUFNLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFOzZCQUM3QixDQUFDOzRCQUNGLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRTtnQ0FDN0IsT0FBTyxDQUFDLDJEQUEyRCxDQUFDOzZCQUNyRSxFQUFFO2dDQUNELE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTs2QkFDckMsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIO2lCQUNGO2lHQUtLLE9BQU87c0JBRFYsS0FBSztnQkFZRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUlGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBVUYsTUFBTTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkRlc3Ryb3ksIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGFuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyLCBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduYy1udW1iZXItY291bnRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9udW1iZXItY291bnRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL251bWJlci1jb3VudGVyLmNvbXBvbmVudC5sZXNzJ10sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdjb3VudEFuaW1hdGlvbicsIFtcbiAgICAgIHN0YXRlKCdpbml0aWFsJywgc3R5bGUoe1xuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJ1xuICAgICAgfSkpLFxuICAgICAgc3RhdGUoJ2ZpbmFsJywgc3R5bGUoe1xuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKHt7ZmluYWxQb3NpdGlvbn19ZW0pJ1xuICAgICAgfSksIHtcbiAgICAgICAgcGFyYW1zOiB7IGZpbmFsUG9zaXRpb246IDAgfVxuICAgICAgfSksXG4gICAgICB0cmFuc2l0aW9uKCdpbml0aWFsID0+IGZpbmFsJywgW1xuICAgICAgICBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcyBjdWJpYy1iZXppZXIoMC4zMywgMSwgMC42OCwgMSknKVxuICAgICAgXSwge1xuICAgICAgICBwYXJhbXM6IHsgZHVyYXRpb246IDEwMDAsIGRlbGF5OiAwIH1cbiAgICAgIH0pXG4gICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOdW1iZXJDb3VudGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiog6KaB5pi+56S655qE5pWw5a2XICovXG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKVxuICBzZXQgbmNWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICB9KTtcbiAgfVxuICBnZXQgbmNWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKiDmr4/kuKrmlbDlrZfliqjnlLvmjIHnu63ml7bpl7QgKi9cbiAgQElucHV0KCkgbmNEdXJhdGlvbjogbnVtYmVyID0gMTAwMDtcbiAgLyoqIOavj+S4quaVsOWtl+S5i+mXtOeahOW7tui/nyAqL1xuICBASW5wdXQoKSBuY0RlbGF5TXVsdGlwbGU6IG51bWJlciA9IDA7XG4gIC8qKiDlrZjlnKjmr4/kuKrmlbDlrZfkuYvpl7TnmoTlu7bov5/ml7bvvIzmlbDlrZfmlrnlkJEgKi9cbiAgQElucHV0KCkgbmNEaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcgPSAnbGVmdCc7XG4gIC8qKiDmr4/kuKrmlbDlrZfkuYvpl7TnmoTpl7Tot50gKi9cbiAgQElucHV0KCkgbmNHYXA6IG51bWJlciA9IDA7XG4gIC8qKiDlvIDlp4vliY3nmoTlu7bov58gKi9cbiAgQElucHV0KCkgbmNEZWxheTogbnVtYmVyID0gMDtcbiAgLyoqIOaYr+WQpuWcqOinhuWbvuWPr+ingeaXtuaJjeW8gOWni+WKqOeUuyAqL1xuICBwcml2YXRlIF9zdGFydE9uVmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBzZXQgbmNTdGFydE9uVmlldyh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcbiAgICB0aGlzLl9zdGFydE9uVmlldyA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcbiAgfVxuICBnZXQgbmNTdGFydE9uVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRPblZpZXc7XG4gIH1cbiAgLyoqIOaYr+WQpuWPquaJp+ihjOS4gOasoeWKqOeUuyAqL1xuICBwcml2YXRlIF9vbmNlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHNldCBuY09uY2UodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5fb25jZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcbiAgfVxuICBnZXQgbmNPbmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vbmNlO1xuICB9XG5cbiAgZGlnaXRzOiB7IG51bWJlcnM6IG51bWJlcltdLCB0YXJnZXRQb3NpdGlvbjogbnVtYmVyLCBzdGF0ZTogc3RyaW5nLCBkZWxheTogbnVtYmVyIH1bXSA9IFtdO1xuICBwcml2YXRlIG9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRpbWVvdXQ6IGFueSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHsgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIGlmICghdGhpcy5uY1N0YXJ0T25WaWV3KSB7XG4gICAgICB0aGlzLnByb2Nlc3NWYWx1ZSgpO1xuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcbiAgICAgIH0sIHRoaXMubmNEZWxheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgaWYgKGVudHJpZXNbMF0uaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzVmFsdWUoKTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICAgICAgICB9LCB0aGlzLm5jRGVsYXkpO1xuXG4gICAgICAgIGlmICh0aGlzLm5jT25jZSkge1xuICAgICAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmNPbmNlKSB7XG4gICAgICAgIHRoaXMucmVzZXRBbmltYXRpb24oKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICAgeyB0aHJlc2hvbGQ6IDAuMSB9XG4gICAgKTtcblxuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NWYWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpZ2l0cyA9IFtdO1xuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdGhpcy5uY1ZhbHVlLnRvU3RyaW5nKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZ1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBkaWdpdCA9IHBhcnNlSW50KHN0cmluZ1ZhbHVlW2ldKTtcblxuICAgICAgLy8g5a+55LqO5omA5pyJ5pWw5a2X77yM6YO955Sf5oiQMOWIsDnnmoTluo/liJfvvIznhLblkI7lho3ku44w5Yiw5pyA57uI5pWw5a2XXG4gICAgICBsZXQgbnVtYmVycyA9IFtcbiAgICAgICAgLi4uQXJyYXkuZnJvbSh7IGxlbmd0aDogMTAgfSwgKF8sIGluZGV4KSA9PiBpbmRleCksXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IGRpZ2l0ICsgMSB9LCAoXywgaW5kZXgpID0+IGluZGV4KVxuICAgICAgXTtcblxuICAgICAgbGV0IGRlbGF5ID0gMDtcbiAgICAgIGlmICh0aGlzLm5jRGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgZGVsYXkgPSAoc3RyaW5nVmFsdWUubGVuZ3RoIC0gMSAtIGkpICogdGhpcy5uY0RlbGF5TXVsdGlwbGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxheSA9IGkgKiB0aGlzLm5jRGVsYXlNdWx0aXBsZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5kaWdpdHMucHVzaCh7XG4gICAgICAgIG51bWJlcnM6IG51bWJlcnMsXG4gICAgICAgIHRhcmdldFBvc2l0aW9uOiAtKG51bWJlcnMubGVuZ3RoIC0gMSksXG4gICAgICAgIHN0YXRlOiAnaW5pdGlhbCcsXG4gICAgICAgIGRlbGF5OiBkZWxheVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmRpZ2l0cy5mb3JFYWNoKChkaWdpdCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRpZ2l0LnN0YXRlID0gJ2ZpbmFsJztcbiAgICAgIH0sIGRpZ2l0LmRlbGF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRBbmltYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgfVxuICAgIHRoaXMuZGlnaXRzLmZvckVhY2goZGlnaXQgPT4ge1xuICAgICAgZGlnaXQuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJudW1iZXItY291bnRlci1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7J2dhcC14JzogbmNHYXAgPiAwfVwiIFtzdHlsZS4tLWdhcC5weF09XCJuY0dhcFwiPlxuICA8ZGl2IGNsYXNzPVwiZGlnaXQtd3JhcHBlclwiICpuZ0Zvcj1cImxldCBkaWdpdCBvZiBkaWdpdHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGlnaXRzLXN0cmlwXCJcbiAgICAgIFtAY291bnRBbmltYXRpb25dPVwie3ZhbHVlOiBkaWdpdC5zdGF0ZSwgcGFyYW1zOiB7ZHVyYXRpb246IG5jRHVyYXRpb24sIGRlbGF5OiBkaWdpdC5kZWxheSwgZmluYWxQb3NpdGlvbjogZGlnaXQudGFyZ2V0UG9zaXRpb259fVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRpZ2l0XCIgKm5nRm9yPVwibGV0IG51bSBvZiBkaWdpdC5udW1iZXJzXCI+e3tudW19fTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==