UNPKG

jsim-lazy-expandable

Version:

Light weight and easy to use expansion panel with lazy loaded content.

142 lines 23.5 kB
import { Component, ContentChild, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { LazyContentDirective } from './lazy-content.directive'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class LazyExpandableComponent { constructor() { /** Is the panel open? */ this.isOpen = false; /** Event emitted when isOpen changes */ this.openChanged = new EventEmitter(); /** Hide the arrow icon */ this.hideIcon = false; /** Height of the header when collapsed (in pixels) */ this.headerHeight = 48; /** Height of the header when expanded (in pixels) */ this.headerHeightExpanded = 64; /** Speed of the expand and collapse animation (in pixel by milisecond) */ this.animationSpeed = 0.5; /** Event emitted when animation ends */ this.animationEnd = new EventEmitter(); /** Is expanding and collapsing disabled? */ this.disabled = false; this.headerHeightStyle = this.headerHeight + 'px'; this.contentHeight = this.headerHeight + 'px'; this.currentContentHeight = 0; this.desiredContentHeight = 0; this.timeLastFrame = Date.now(); this.animationDuration = 0; this.currentAnimationTime = 0; this.lerp = (x, y, a) => x * (1 - a) + y * a; } ngOnInit() { } ngAfterContentInit() { setTimeout(() => { this.setContentHeight(false); if (this.isOpen && this.directive) { this.directive.showContent(); } }, 0); } toggleOpen() { if (this.disabled) { return; } this.isOpen = !this.isOpen; if (this.isOpen && this.directive) { this.directive.showContent(); } this.openChanged.emit(this.isOpen); this.setContentHeight(); } setContentHeight(animate = true) { if (animate) { if (this.isOpen) { this.headerHeightStyle = this.headerHeightExpanded + 'px'; this.desiredContentHeight = this.content.nativeElement.clientHeight; this.currentContentHeight = 0; } else { this.headerHeightStyle = this.headerHeight + 'px'; this.desiredContentHeight = 0; this.currentContentHeight = this.content.nativeElement.clientHeight; } this.animationDuration = Math.abs(this.desiredContentHeight - this.currentContentHeight) / this.animationSpeed; this.startAnimation(); } else { if (this.isOpen) { this.headerHeightStyle = this.headerHeightExpanded + 'px'; this.contentHeight = 'unset'; } else { this.headerHeightStyle = this.headerHeight + 'px'; this.contentHeight = this.headerHeight + 'px'; } } } startAnimation() { this.timeLastFrame = Date.now(); this.currentAnimationTime = 0; if (this.animationFrameRef) { cancelAnimationFrame(this.animationFrameRef); } this.animationFrameRef = requestAnimationFrame(this.animateHeader.bind(this)); } animateHeader() { const time = Date.now(); const deltatime = time - this.timeLastFrame; this.timeLastFrame = time; this.currentAnimationTime += deltatime; const amount = this.currentAnimationTime / this.animationDuration; this.currentContentHeight = this.lerp(this.currentContentHeight, this.desiredContentHeight, amount); if (this.isOpen) { this.currentContentHeight = Math.min(this.currentContentHeight, this.desiredContentHeight); this.contentHeight = this.headerHeightExpanded + this.currentContentHeight + 'px'; } else { this.currentContentHeight = Math.max(this.currentContentHeight, this.desiredContentHeight); this.contentHeight = this.headerHeight + this.currentContentHeight + 'px'; } if (this.currentContentHeight == this.desiredContentHeight) { this.animationEnded(); return; } this.animationFrameRef = requestAnimationFrame(this.animateHeader.bind(this)); } animationEnded() { this.animationEnd.emit(this.isOpen); if (this.isOpen) { this.contentHeight = 'unset'; } } } LazyExpandableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LazyExpandableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); LazyExpandableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: LazyExpandableComponent, selector: "jsim-lazy-expandable", inputs: { isOpen: "isOpen", hideIcon: "hideIcon", headerHeight: "headerHeight", headerHeightExpanded: "headerHeightExpanded", animationSpeed: "animationSpeed", disabled: "disabled" }, outputs: { openChanged: "openChanged", animationEnd: "animationEnd" }, queries: [{ propertyName: "directive", first: true, predicate: LazyContentDirective, descendants: true }], viewQueries: [{ propertyName: "content", first: true, predicate: ["lazyContent"], descendants: true }], ngImport: i0, template: "<div class=\"lazy-exp-container\" [class.is-open]=\"isOpen\" [style.height]=\"contentHeight\" [class.disabled]=\"disabled\">\n <div class=\"lazy-exp-header\" (click)=\"toggleOpen()\" [style.height]=\"headerHeightStyle\">\n <div class=\"lazy-exp-header-title\">\n <ng-content select=\"[exp-header-title]\"></ng-content>\n </div>\n <div class=\"lazy-exp-header-subtitle\">\n <ng-content select=\"[exp-header-subtitle]\"></ng-content>\n </div>\n <div *ngIf=\"!hideIcon\" class=\"lazy-exp-header-icon\"></div>\n </div>\n <div #lazyContent class=\"lazy-exp-content\">\n <div class=\"lazy-exp-content-container\">\n <ng-content select=\"[exp-content]\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [".lazy-exp-container{--background-color: white;--background-color-hover: rgba(0,0,0,.04);--icon-color: rgb(119, 119, 119);border-radius:4px;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;background-color:var(--background-color);overflow:hidden}.lazy-exp-header{display:flex;align-items:center;cursor:pointer;transition:height 225ms cubic-bezier(.4,0,.2,1)}.lazy-exp-container:not(.is-open):not(.disabled) .lazy-exp-header:hover{background-color:var(--background-color-hover)}.lazy-exp-container.disabled .lazy-exp-header{cursor:not-allowed}.lazy-exp-header-title{margin-left:1rem;width:50%}.lazy-exp-header-subtitle{width:50%;color:#2e2e2e}.lazy-exp-header-icon{justify-self:flex-end;margin-right:1rem;transform:rotate(0);transition:transform .2s ease-out}.is-open .lazy-exp-header-icon{transform:rotate(180deg)}.lazy-exp-header-icon:after{border-color:var(--icon-color);border-style:solid;border-width:0 2px 2px 0;content:\"\";display:inline-block;padding:3px;transform:rotate(45deg);vertical-align:middle}.lazy-exp-content{box-sizing:border-box;padding:1rem}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: LazyExpandableComponent, decorators: [{ type: Component, args: [{ selector: 'jsim-lazy-expandable', template: "<div class=\"lazy-exp-container\" [class.is-open]=\"isOpen\" [style.height]=\"contentHeight\" [class.disabled]=\"disabled\">\n <div class=\"lazy-exp-header\" (click)=\"toggleOpen()\" [style.height]=\"headerHeightStyle\">\n <div class=\"lazy-exp-header-title\">\n <ng-content select=\"[exp-header-title]\"></ng-content>\n </div>\n <div class=\"lazy-exp-header-subtitle\">\n <ng-content select=\"[exp-header-subtitle]\"></ng-content>\n </div>\n <div *ngIf=\"!hideIcon\" class=\"lazy-exp-header-icon\"></div>\n </div>\n <div #lazyContent class=\"lazy-exp-content\">\n <div class=\"lazy-exp-content-container\">\n <ng-content select=\"[exp-content]\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [".lazy-exp-container{--background-color: white;--background-color-hover: rgba(0,0,0,.04);--icon-color: rgb(119, 119, 119);border-radius:4px;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;background-color:var(--background-color);overflow:hidden}.lazy-exp-header{display:flex;align-items:center;cursor:pointer;transition:height 225ms cubic-bezier(.4,0,.2,1)}.lazy-exp-container:not(.is-open):not(.disabled) .lazy-exp-header:hover{background-color:var(--background-color-hover)}.lazy-exp-container.disabled .lazy-exp-header{cursor:not-allowed}.lazy-exp-header-title{margin-left:1rem;width:50%}.lazy-exp-header-subtitle{width:50%;color:#2e2e2e}.lazy-exp-header-icon{justify-self:flex-end;margin-right:1rem;transform:rotate(0);transition:transform .2s ease-out}.is-open .lazy-exp-header-icon{transform:rotate(180deg)}.lazy-exp-header-icon:after{border-color:var(--icon-color);border-style:solid;border-width:0 2px 2px 0;content:\"\";display:inline-block;padding:3px;transform:rotate(45deg);vertical-align:middle}.lazy-exp-content{box-sizing:border-box;padding:1rem}\n"] }] }], ctorParameters: function () { return []; }, propDecorators: { isOpen: [{ type: Input }], openChanged: [{ type: Output }], hideIcon: [{ type: Input }], headerHeight: [{ type: Input }], headerHeightExpanded: [{ type: Input }], animationSpeed: [{ type: Input }], animationEnd: [{ type: Output }], disabled: [{ type: Input }], content: [{ type: ViewChild, args: ['lazyContent'] }], directive: [{ type: ContentChild, args: [LazyContentDirective] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1leHBhbmRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2pzaW0tbGF6eS1leHBhbmRhYmxlL3NyYy9saWIvbGF6eS1leHBhbmRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2pzaW0tbGF6eS1leHBhbmRhYmxlL3NyYy9saWIvbGF6eS1leHBhbmRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsU0FBUyxFQUFFLFlBQVksRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEksT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7OztBQU9oRSxNQUFNLE9BQU8sdUJBQXVCO0lBeUNsQztRQXZDQSx5QkFBeUI7UUFDaEIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUVqQyx3Q0FBd0M7UUFDOUIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXBELDBCQUEwQjtRQUNqQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBRW5DLHNEQUFzRDtRQUM3QyxpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUVuQyxxREFBcUQ7UUFDNUMseUJBQW9CLEdBQVcsRUFBRSxDQUFDO1FBRTNDLDBFQUEwRTtRQUNqRSxtQkFBYyxHQUFXLEdBQUcsQ0FBQztRQUV0Qyx3Q0FBd0M7UUFDOUIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXJELDRDQUE0QztRQUNuQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBTW5DLHNCQUFpQixHQUFXLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3JELGtCQUFhLEdBQVksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFMUMseUJBQW9CLEdBQVcsQ0FBQyxDQUFDO1FBQ2pD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O1FBRUQsSUFBRyxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFDO1lBQ3hELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBSU8sY0FBYztRQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBRyxJQUFJLENBQUMsTUFBTSxFQUFDO1lBQ2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7U0FDOUI7SUFDSCxDQUFDOztvSEF2SVUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsa1dBNEJwQixvQkFBb0Isd0pDcENwQyxneEJBZ0JBOzJGRFJhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7MEVBT3ZCLE1BQU07c0JBQWQsS0FBSztnQkFHSSxXQUFXO3NCQUFwQixNQUFNO2dCQUdFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHSSxZQUFZO3NCQUFyQixNQUFNO2dCQUdFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRW9CLE9BQU87c0JBQWhDLFNBQVM7dUJBQUMsYUFBYTtnQkFFWSxTQUFTO3NCQUE1QyxZQUFZO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMYXp5Q29udGVudERpcmVjdGl2ZSB9IGZyb20gJy4vbGF6eS1jb250ZW50LmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2pzaW0tbGF6eS1leHBhbmRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xhenktZXhwYW5kYWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xhenktZXhwYW5kYWJsZS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTGF6eUV4cGFuZGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xuXG4gIC8qKiBJcyB0aGUgcGFuZWwgb3Blbj8gKi9cbiAgQElucHV0KCkgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiBpc09wZW4gY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgb3BlbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIEhpZGUgdGhlIGFycm93IGljb24gKi9cbiAgQElucHV0KCkgaGlkZUljb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogSGVpZ2h0IG9mIHRoZSBoZWFkZXIgd2hlbiBjb2xsYXBzZWQgKGluIHBpeGVscykgKi9cbiAgQElucHV0KCkgaGVhZGVySGVpZ2h0OiBudW1iZXIgPSA0ODtcblxuICAvKiogSGVpZ2h0IG9mIHRoZSBoZWFkZXIgd2hlbiBleHBhbmRlZCAoaW4gcGl4ZWxzKSAqL1xuICBASW5wdXQoKSBoZWFkZXJIZWlnaHRFeHBhbmRlZDogbnVtYmVyID0gNjQ7XG5cbiAgLyoqIFNwZWVkIG9mIHRoZSBleHBhbmQgYW5kIGNvbGxhcHNlIGFuaW1hdGlvbiAoaW4gcGl4ZWwgYnkgbWlsaXNlY29uZCkgKi9cbiAgQElucHV0KCkgYW5pbWF0aW9uU3BlZWQ6IG51bWJlciA9IDAuNTtcblxuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIGFuaW1hdGlvbiBlbmRzICovXG4gIEBPdXRwdXQoKSBhbmltYXRpb25FbmQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIElzIGV4cGFuZGluZyBhbmQgY29sbGFwc2luZyBkaXNhYmxlZD8gKi9cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdsYXp5Q29udGVudCcpIGNvbnRlbnQ6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG5cbiAgQENvbnRlbnRDaGlsZChMYXp5Q29udGVudERpcmVjdGl2ZSkgZGlyZWN0aXZlOiBMYXp5Q29udGVudERpcmVjdGl2ZSB8IHVuZGVmaW5lZDtcblxuICBoZWFkZXJIZWlnaHRTdHlsZTogc3RyaW5nID0gdGhpcy5oZWFkZXJIZWlnaHQgKyAncHgnO1xuICBjb250ZW50SGVpZ2h0OiBzdHJpbmcgPSAgdGhpcy5oZWFkZXJIZWlnaHQgKyAncHgnO1xuXG4gIHByaXZhdGUgY3VycmVudENvbnRlbnRIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgZGVzaXJlZENvbnRlbnRIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgdGltZUxhc3RGcmFtZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBhbmltYXRpb25EdXJhdGlvbjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBjdXJyZW50QW5pbWF0aW9uVGltZTogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lUmVmOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNldENvbnRlbnRIZWlnaHQoZmFsc2UpO1xuICAgICAgaWYodGhpcy5pc09wZW4gJiYgdGhpcy5kaXJlY3RpdmUpe1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZS5zaG93Q29udGVudCgpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgdG9nZ2xlT3Blbigpe1xuICAgIGlmKHRoaXMuZGlzYWJsZWQpe1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuXG4gICAgaWYodGhpcy5pc09wZW4gJiYgdGhpcy5kaXJlY3RpdmUpe1xuICAgICAgdGhpcy5kaXJlY3RpdmUuc2hvd0NvbnRlbnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5DaGFuZ2VkLmVtaXQodGhpcy5pc09wZW4pO1xuICAgIHRoaXMuc2V0Q29udGVudEhlaWdodCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDb250ZW50SGVpZ2h0KGFuaW1hdGU6IGJvb2xlYW4gPSB0cnVlKXtcbiAgICBpZihhbmltYXRlKXtcbiAgICAgIGlmKHRoaXMuaXNPcGVuKXtcbiAgICAgICAgdGhpcy5oZWFkZXJIZWlnaHRTdHlsZSA9IHRoaXMuaGVhZGVySGVpZ2h0RXhwYW5kZWQgKyAncHgnO1xuICAgICAgICB0aGlzLmRlc2lyZWRDb250ZW50SGVpZ2h0ID0gdGhpcy5jb250ZW50IS5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29udGVudEhlaWdodCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhlYWRlckhlaWdodFN0eWxlID0gdGhpcy5oZWFkZXJIZWlnaHQgKyAncHgnO1xuICAgICAgICB0aGlzLmRlc2lyZWRDb250ZW50SGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29udGVudEhlaWdodCA9IHRoaXMuY29udGVudCEubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG4gICAgICB0aGlzLmFuaW1hdGlvbkR1cmF0aW9uID0gTWF0aC5hYnModGhpcy5kZXNpcmVkQ29udGVudEhlaWdodCAtIHRoaXMuY3VycmVudENvbnRlbnRIZWlnaHQpIC8gdGhpcy5hbmltYXRpb25TcGVlZDtcbiAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYodGhpcy5pc09wZW4pe1xuICAgICAgICB0aGlzLmhlYWRlckhlaWdodFN0eWxlID0gdGhpcy5oZWFkZXJIZWlnaHRFeHBhbmRlZCArICdweCc7XG4gICAgICAgIHRoaXMuY29udGVudEhlaWdodCA9ICd1bnNldCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhlYWRlckhlaWdodFN0eWxlID0gdGhpcy5oZWFkZXJIZWlnaHQgKyAncHgnO1xuICAgICAgICB0aGlzLmNvbnRlbnRIZWlnaHQgPSB0aGlzLmhlYWRlckhlaWdodCArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFuaW1hdGlvbigpe1xuICAgIHRoaXMudGltZUxhc3RGcmFtZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5jdXJyZW50QW5pbWF0aW9uVGltZSA9IDA7XG4gICAgaWYodGhpcy5hbmltYXRpb25GcmFtZVJlZil7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lUmVmKTtcbiAgICB9XG4gICAgdGhpcy5hbmltYXRpb25GcmFtZVJlZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGVIZWFkZXIuYmluZCh0aGlzKSk7XG4gIH1cblxuICBwcml2YXRlIGFuaW1hdGVIZWFkZXIoKSB7XG4gICAgY29uc3QgdGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVsdGF0aW1lID0gdGltZSAtIHRoaXMudGltZUxhc3RGcmFtZTtcbiAgICB0aGlzLnRpbWVMYXN0RnJhbWUgPSB0aW1lO1xuICAgIHRoaXMuY3VycmVudEFuaW1hdGlvblRpbWUgKz0gZGVsdGF0aW1lO1xuXG4gICAgY29uc3QgYW1vdW50ID0gdGhpcy5jdXJyZW50QW5pbWF0aW9uVGltZSAvIHRoaXMuYW5pbWF0aW9uRHVyYXRpb247XG5cbiAgICB0aGlzLmN1cnJlbnRDb250ZW50SGVpZ2h0ID0gdGhpcy5sZXJwKHRoaXMuY3VycmVudENvbnRlbnRIZWlnaHQsIHRoaXMuZGVzaXJlZENvbnRlbnRIZWlnaHQsIGFtb3VudCk7XG5cbiAgICBpZih0aGlzLmlzT3Blbil7XG4gICAgICB0aGlzLmN1cnJlbnRDb250ZW50SGVpZ2h0ID0gTWF0aC5taW4odGhpcy5jdXJyZW50Q29udGVudEhlaWdodCwgdGhpcy5kZXNpcmVkQ29udGVudEhlaWdodCk7XG4gICAgICB0aGlzLmNvbnRlbnRIZWlnaHQgPSB0aGlzLmhlYWRlckhlaWdodEV4cGFuZGVkICsgdGhpcy5jdXJyZW50Q29udGVudEhlaWdodCArICdweCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudENvbnRlbnRIZWlnaHQgPSBNYXRoLm1heCh0aGlzLmN1cnJlbnRDb250ZW50SGVpZ2h0LCB0aGlzLmRlc2lyZWRDb250ZW50SGVpZ2h0KTtcbiAgICAgIHRoaXMuY29udGVudEhlaWdodCA9IHRoaXMuaGVhZGVySGVpZ2h0ICsgdGhpcy5jdXJyZW50Q29udGVudEhlaWdodCArICdweCc7XG4gICAgfVxuXG4gICAgaWYodGhpcy5jdXJyZW50Q29udGVudEhlaWdodCA9PSB0aGlzLmRlc2lyZWRDb250ZW50SGVpZ2h0KXtcbiAgICAgIHRoaXMuYW5pbWF0aW9uRW5kZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFuaW1hdGlvbkZyYW1lUmVmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZUhlYWRlci5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgbGVycCA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgYTogbnVtYmVyKSA9PiB4ICogKDEgLSBhKSArIHkgKiBhO1xuXG4gIHByaXZhdGUgYW5pbWF0aW9uRW5kZWQoKXtcbiAgICB0aGlzLmFuaW1hdGlvbkVuZC5lbWl0KHRoaXMuaXNPcGVuKTtcbiAgICBpZih0aGlzLmlzT3Blbil7XG4gICAgICB0aGlzLmNvbnRlbnRIZWlnaHQgPSAndW5zZXQnO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxhenktZXhwLWNvbnRhaW5lclwiIFtjbGFzcy5pcy1vcGVuXT1cImlzT3BlblwiIFtzdHlsZS5oZWlnaHRdPVwiY29udGVudEhlaWdodFwiIFtjbGFzcy5kaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsYXp5LWV4cC1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlT3BlbigpXCIgW3N0eWxlLmhlaWdodF09XCJoZWFkZXJIZWlnaHRTdHlsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGF6eS1leHAtaGVhZGVyLXRpdGxlXCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZXhwLWhlYWRlci10aXRsZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGF6eS1leHAtaGVhZGVyLXN1YnRpdGxlXCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZXhwLWhlYWRlci1zdWJ0aXRsZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWhpZGVJY29uXCIgY2xhc3M9XCJsYXp5LWV4cC1oZWFkZXItaWNvblwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgI2xhenlDb250ZW50IGNsYXNzPVwibGF6eS1leHAtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGF6eS1leHAtY29udGVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltleHAtY29udGVudF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=