UNPKG

@piumaz/pull-to-refresh

Version:

It provides an Angular component and a service, for the Pull-To-Refresh feature.

192 lines 24.1 kB
import { Component, EventEmitter, Output, Input, HostListener, ChangeDetectionStrategy, ChangeDetectorRef, Inject } from '@angular/core'; import { PullToRefreshService } from './pull-to-refresh.service'; import { DOCUMENT } from '@angular/common'; export class PullToRefreshComponent { constructor(refreshService, changeDetectorRef, document) { this.refreshService = refreshService; this.changeDetectorRef = changeDetectorRef; this.document = document; /** * Spostamento in pixel che attiva il refresh */ this.pullToRefresh = 90; this.color = '#353535'; this.target = 'body'; this.disabled = false; this.autoDismiss = true; this.refresh = new EventEmitter(); /** * Stato attivazione */ this.activated = false; /** * Rotazione dell'icon spinner */ this.rotation = 0; this.spin = false; /** * posizione Y di inizio sul touchstart */ this.startY = 0; /** * posizione X di inizio sul touchstart */ this.startX = 0; /** * posizione Y del touchmove */ this.moveY = 0; /** * posizione X del touchmove */ this.moveX = 0; /** * Spostamento in pixel dello spinner */ this.pull = 0; this.pullFirst = 0; /** * Spostamento massimo in pixel dello spinner */ this.maxPull = 138; this.maxFirstPull = 60; /** * posizione Y dell'animazione finale */ this.animateY = 80; this.radiusLeft = 0; this.radiusRight = 0; this.isFirstTime = true; this.window = this.document.defaultView; } ngOnInit() { this.elementScrollable = this.document.querySelector(this.target); if (!this.autoDismiss) { this.resetSub = this.refreshService.reset$().subscribe(() => { this.dismiss(); }); } } ngOnDestroy() { if (this.resetSub) { this.resetSub.unsubscribe(); } } getScrollTop() { if (this.target === 'body') { return this.window.pageYOffset || this.document.documentElement.scrollTop || this.document.body.scrollTop || 0; } return this.elementScrollable.scrollTop; } onTouchStart($e) { if (this.disabled || this.activated) { return; } this.reset(); this.startY = $e.touches[0].pageY; this.startX = $e.touches[0].pageX; } onToucMove($e) { if (this.disabled) { return; } this.moveY = $e.touches[0].pageY; this.moveX = $e.touches[0].pageX; if (this.getScrollTop() > 0) { this.isFirstTime = true; } const shiftY = (this.moveY - this.startY); const shiftX = (this.moveX - this.startX); const ratio = Math.abs(shiftX) / Math.abs(shiftY); if (this.getScrollTop() === 0 && this.moveY >= this.startY && ratio <= 0.3) { setTimeout(() => { this.elementScrollable.style.overflowY = 'hidden'; }); if (this.isFirstTime) { this.pullFirst = shiftY >= this.maxFirstPull ? this.maxFirstPull : shiftY; const width = this.elementScrollable.offsetWidth; const x = parseInt(((100 * this.moveX) / width).toString(), 10); let left; let right; if (x <= 50) { // left right = 100 - x; left = x; } else { // right right = 100 - x; left = 100 - (100 - x); } this.radiusLeft = left < 0 ? 0 : left; this.radiusRight = right < 0 ? 0 : right; } else { const pullShiftY = shiftY / 2; this.pull = (pullShiftY >= this.maxPull) ? this.maxPull : pullShiftY + ((this.maxPull - pullShiftY) * 0.5); this.rotation = (360 * this.pull) / this.maxPull; this.activated = (this.pull >= this.pullToRefresh); } } } onTouchEnd($e) { if (this.disabled) { return; } if (this.activated) { this.spin = true; this.pull = this.animateY; this.document.dispatchEvent(new Event('pull-to-refresh')); this.refreshService.pull(); this.refresh.emit(); if (this.autoDismiss) { this.dismiss(); } } else { this.reset(); } } dismiss() { setTimeout(() => { this.reset(); }, 1500); } reset() { this.elementScrollable.style.overflowY = ''; this.isFirstTime = false; this.startY = 9999999; this.moveY = 0; this.rotation = 0; this.spin = false; this.activated = false; this.pull = 0; this.pullFirst = 0; this.changeDetectorRef.detectChanges(); } } PullToRefreshComponent.decorators = [ { type: Component, args: [{ selector: 'pull-to-refresh', template: "\r\n<div class=\"pull\" [ngStyle]=\"{'transform': 'translateY(' + pull + 'px)'}\" [hidden]=\"disabled || pullFirst\">\r\n\r\n <span class=\"rotate\" [ngStyle]=\"{'transform': 'rotate(' + rotation + 'deg)'}\">\r\n\r\n <span class=\"spinner\" [class.spin-animation]=\"spin\" [ngStyle]=\"{'opacity': (rotation/360) - 0.1}\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\">\r\n <g>\r\n <path d=\"M50 15A35 35 0 1 0 74.74873734152916 25.251262658470843\" fill=\"none\" [attr.stroke]=\"color\" stroke-width=\"10\" ></path>\r\n <path d=\"M49 3L49 27L61 15L49 3\" [attr.fill]=\"color\" [attr.stroke]=\"color\" stroke-width=\"4\"></path>\r\n </g>\r\n </svg>\r\n\r\n </span>\r\n\r\n </span>\r\n\r\n</div>\r\n\r\n<div class=\"pull first\"\r\n [ngStyle]=\"{'transform': 'translateY(' + pullFirst + 'px)', 'border-bottom-right-radius': radiusRight + '%', 'border-bottom-left-radius': radiusLeft + '%'}\"\r\n [hidden]=\"disabled || pull\"></div>\r\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: ["::ng-deep body,::ng-deep html{overscroll-behavior-y:none}.pull{display:flex;justify-content:space-around;align-items:center;position:absolute;z-index:1060;width:100%;padding:0;left:0;right:0;text-align:center;overflow:hidden;transform:translateY(-60px);transition:transform .2s;will-change:transform,opacity}.pull,.pull.first{height:60px;top:-60px}.pull.first{transition:transform .3s;background-color:rgba(53,53,53,.3);opacity:.5;border-radius:0/0 0 0 0}.pull .rotate{transition:transform .3s;will-change:transform,opacity;background-color:#fff;border:1px solid rgba(53,53,53,.3);box-shadow:0 0 4px 0 rgba(0,0,0,.2);border-radius:100px;padding:6px;box-sizing:content-box}.pull .rotate,.pull .spinner{height:25px;width:25px;display:inline-block}.pull .spinner svg{height:100%;width:100%}.pull .spinner.spin-animation{-webkit-animation-name:spin;animation-name:spin;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}"] },] } ]; PullToRefreshComponent.ctorParameters = () => [ { type: PullToRefreshService }, { type: ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; PullToRefreshComponent.propDecorators = { pullToRefresh: [{ type: Input, args: ['sensitivity',] }], color: [{ type: Input }], target: [{ type: Input }], disabled: [{ type: Input }], autoDismiss: [{ type: Input }], refresh: [{ type: Output }], onTouchStart: [{ type: HostListener, args: ['window:touchstart', ['$event'],] }], onToucMove: [{ type: HostListener, args: ['window:touchmove', ['$event'],] }], onTouchEnd: [{ type: HostListener, args: ['window:touchend', ['$event'],] }, { type: HostListener, args: ['window:touchcancel', ['$event'],] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC10by1yZWZyZXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3B1bGwtdG8tcmVmcmVzaC9zcmMvbGliL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxZQUFZLEVBRVosdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUNuRCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUUvRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFRekMsTUFBTSxPQUFPLHNCQUFzQjtJQThFakMsWUFDWSxjQUFvQyxFQUNwQyxpQkFBb0MsRUFDakIsUUFBUTtRQUYzQixtQkFBYyxHQUFkLGNBQWMsQ0FBc0I7UUFDcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFBO1FBL0V2Qzs7V0FFRztRQUNtQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUV4QyxVQUFLLEdBQVcsU0FBUyxDQUFDO1FBQzFCLFdBQU0sR0FBVyxNQUFNLENBQUM7UUFDeEIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUUzQixZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFLL0Q7O1dBRUc7UUFDSCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBT2xCOztXQUVHO1FBQ0gsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFNBQUksR0FBRyxLQUFLLENBQUM7UUFFYjs7V0FFRztRQUNILFdBQU0sR0FBRyxDQUFDLENBQUM7UUFFWDs7V0FFRztRQUNILFdBQU0sR0FBRyxDQUFDLENBQUM7UUFFWDs7V0FFRztRQUNILFVBQUssR0FBRyxDQUFDLENBQUM7UUFFVjs7V0FFRztRQUNILFVBQUssR0FBRyxDQUFDLENBQUM7UUFFVjs7V0FFRztRQUNILFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWQ7O1dBRUc7UUFDSCxZQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2QsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFFbEI7O1dBRUc7UUFDSCxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBR2QsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRWhCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBU2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDMUMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxFLElBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFHO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUVWLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztTQUNoSDtRQUVELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztJQUUxQyxDQUFDO0lBR0QsWUFBWSxDQUFDLEVBQUU7UUFFYixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFYixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFFcEMsQ0FBQztJQUdELFVBQVUsQ0FBQyxFQUFFO1FBRVgsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUdqQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7U0FDekI7UUFFRCxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWhELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRTtZQUUxRSxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQztZQUdILElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFFcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUUxRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO2dCQUNqRCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBRWhFLElBQUksSUFBSSxDQUFDO2dCQUNULElBQUksS0FBSyxDQUFDO2dCQUVWLElBQUssQ0FBQyxJQUFJLEVBQUUsRUFBSTtvQkFDZCxPQUFPO29CQUNQLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUNoQixJQUFJLEdBQUcsQ0FBQyxDQUFDO2lCQUNWO3FCQUFNO29CQUNMLFFBQVE7b0JBQ1IsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ2hCLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ3hCO2dCQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFFMUM7aUJBQU07Z0JBRUwsTUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFFOUIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFFM0csSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFFakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBRXBEO1NBRUY7SUFDSCxDQUFDO0lBSUQsVUFBVSxDQUFDLEVBQUU7UUFDWCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBRUQsSUFBSyxJQUFJLENBQUMsU0FBUyxFQUFHO1lBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUUxQixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRXBCLElBQUssSUFBSSxDQUFDLFdBQVcsRUFBRztnQkFDdEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2hCO1NBR0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNkO0lBRUgsQ0FBQztJQUVELE9BQU87UUFDTCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QyxDQUFDOzs7WUFsUEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLGtwQ0FBK0M7Z0JBRS9DLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNoRDs7O1lBVE8sb0JBQW9CO1lBRkQsaUJBQWlCOzRDQTZGckMsTUFBTSxTQUFDLFFBQVE7Ozs0QkE1RW5CLEtBQUssU0FBQyxhQUFhO29CQUVuQixLQUFLO3FCQUNMLEtBQUs7dUJBQ0wsS0FBSzswQkFDTCxLQUFLO3NCQUVMLE1BQU07MkJBb0dOLFlBQVksU0FBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQzt5QkFjNUMsWUFBWSxTQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO3lCQWdFM0MsWUFBWSxTQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQzFDLFlBQVksU0FBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIElucHV0LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBPbkRlc3Ryb3ksXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBJbmplY3RcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtQdWxsVG9SZWZyZXNoU2VydmljZX0gZnJvbSAnLi9wdWxsLXRvLXJlZnJlc2guc2VydmljZSc7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncHVsbC10by1yZWZyZXNoJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcHVsbC10by1yZWZyZXNoLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wdWxsLXRvLXJlZnJlc2guY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHVsbFRvUmVmcmVzaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgLyoqXHJcbiAgICogU3Bvc3RhbWVudG8gaW4gcGl4ZWwgY2hlIGF0dGl2YSBpbCByZWZyZXNoXHJcbiAgICovXHJcbiAgQElucHV0KCdzZW5zaXRpdml0eScpIHB1bGxUb1JlZnJlc2g6IG51bWJlciA9IDkwO1xyXG5cclxuICBASW5wdXQoKSBjb2xvcjogc3RyaW5nID0gJyMzNTM1MzUnO1xyXG4gIEBJbnB1dCgpIHRhcmdldDogc3RyaW5nID0gJ2JvZHknO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgYXV0b0Rpc21pc3M6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBAT3V0cHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblxyXG4gIHJlc2V0U3ViOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXRvIGF0dGl2YXppb25lXHJcbiAgICovXHJcbiAgYWN0aXZhdGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVsZW1lbnRvIGNoZSByaWNldmUgbG8gc2Nyb2xsXHJcbiAgICovXHJcbiAgZWxlbWVudFNjcm9sbGFibGU6IEhUTUxFbGVtZW50O1xyXG5cclxuICAvKipcclxuICAgKiBSb3RhemlvbmUgZGVsbCdpY29uIHNwaW5uZXJcclxuICAgKi9cclxuICByb3RhdGlvbiA9IDA7XHJcbiAgc3BpbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBwb3NpemlvbmUgWSBkaSBpbml6aW8gc3VsIHRvdWNoc3RhcnRcclxuICAgKi9cclxuICBzdGFydFkgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBwb3NpemlvbmUgWCBkaSBpbml6aW8gc3VsIHRvdWNoc3RhcnRcclxuICAgKi9cclxuICBzdGFydFggPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBwb3NpemlvbmUgWSBkZWwgdG91Y2htb3ZlXHJcbiAgICovXHJcbiAgbW92ZVkgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBwb3NpemlvbmUgWCBkZWwgdG91Y2htb3ZlXHJcbiAgICovXHJcbiAgbW92ZVggPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBTcG9zdGFtZW50byBpbiBwaXhlbCBkZWxsbyBzcGlubmVyXHJcbiAgICovXHJcbiAgcHVsbCA9IDA7XHJcbiAgcHVsbEZpcnN0ID0gMDtcclxuXHJcbiAgLyoqXHJcbiAgICogU3Bvc3RhbWVudG8gbWFzc2ltbyBpbiBwaXhlbCBkZWxsbyBzcGlubmVyXHJcbiAgICovXHJcbiAgbWF4UHVsbCA9IDEzODtcclxuICBtYXhGaXJzdFB1bGwgPSA2MDtcclxuXHJcbiAgLyoqXHJcbiAgICogcG9zaXppb25lIFkgZGVsbCdhbmltYXppb25lIGZpbmFsZVxyXG4gICAqL1xyXG4gIGFuaW1hdGVZID0gODA7XHJcblxyXG5cclxuICByYWRpdXNMZWZ0ID0gMDtcclxuICByYWRpdXNSaWdodCA9IDA7XHJcblxyXG4gIGlzRmlyc3RUaW1lID0gdHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSB3aW5kb3c6IFdpbmRvdztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAgIHByaXZhdGUgcmVmcmVzaFNlcnZpY2U6IFB1bGxUb1JlZnJlc2hTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgQEluamVjdChET0NVTUVOVCkgcmVhZG9ubHkgZG9jdW1lbnRcclxuICApIHtcclxuICAgIHRoaXMud2luZG93ID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldztcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5lbGVtZW50U2Nyb2xsYWJsZSA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnRhcmdldCk7XHJcblxyXG4gICAgaWYgKCAhdGhpcy5hdXRvRGlzbWlzcyApIHtcclxuICAgICAgdGhpcy5yZXNldFN1YiA9IHRoaXMucmVmcmVzaFNlcnZpY2UucmVzZXQkKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmRpc21pc3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnJlc2V0U3ViKSB7XHJcbiAgICAgIHRoaXMucmVzZXRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNjcm9sbFRvcCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy50YXJnZXQgPT09ICdib2R5Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy53aW5kb3cucGFnZVlPZmZzZXQgfHwgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IHRoaXMuZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50U2Nyb2xsYWJsZS5zY3JvbGxUb3A7XHJcblxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnRvdWNoc3RhcnQnLCBbJyRldmVudCddKVxyXG4gIG9uVG91Y2hTdGFydCgkZSkge1xyXG5cclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuYWN0aXZhdGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcblxyXG4gICAgdGhpcy5zdGFydFkgPSAkZS50b3VjaGVzWzBdLnBhZ2VZO1xyXG4gICAgdGhpcy5zdGFydFggPSAkZS50b3VjaGVzWzBdLnBhZ2VYO1xyXG5cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzp0b3VjaG1vdmUnLCBbJyRldmVudCddKVxyXG4gIG9uVG91Y01vdmUoJGUpIHtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tb3ZlWSA9ICRlLnRvdWNoZXNbMF0ucGFnZVk7XHJcbiAgICB0aGlzLm1vdmVYID0gJGUudG91Y2hlc1swXS5wYWdlWDtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0U2Nyb2xsVG9wKCkgPiAwKSB7XHJcbiAgICAgIHRoaXMuaXNGaXJzdFRpbWUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNoaWZ0WSA9ICh0aGlzLm1vdmVZIC0gdGhpcy5zdGFydFkpO1xyXG4gICAgY29uc3Qgc2hpZnRYID0gKHRoaXMubW92ZVggLSB0aGlzLnN0YXJ0WCk7XHJcbiAgICBjb25zdCByYXRpbyA9IE1hdGguYWJzKHNoaWZ0WCkvTWF0aC5hYnMoc2hpZnRZKTtcclxuXHJcbiAgICBpZiAodGhpcy5nZXRTY3JvbGxUb3AoKSA9PT0gMCAmJiB0aGlzLm1vdmVZID49IHRoaXMuc3RhcnRZICYmIHJhdGlvIDw9IDAuMykge1xyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50U2Nyb2xsYWJsZS5zdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJztcclxuICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgaWYgKHRoaXMuaXNGaXJzdFRpbWUpIHtcclxuXHJcbiAgICAgICAgdGhpcy5wdWxsRmlyc3QgPSBzaGlmdFkgPj0gdGhpcy5tYXhGaXJzdFB1bGwgPyB0aGlzLm1heEZpcnN0UHVsbCA6IHNoaWZ0WTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmVsZW1lbnRTY3JvbGxhYmxlLm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGNvbnN0IHggPSBwYXJzZUludCgoKDEwMCAqIHRoaXMubW92ZVgpIC8gd2lkdGgpLnRvU3RyaW5nKCksIDEwKTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnQ7XHJcbiAgICAgICAgbGV0IHJpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoIHggPD0gNTAgKSAge1xyXG4gICAgICAgICAgLy8gbGVmdFxyXG4gICAgICAgICAgcmlnaHQgPSAxMDAgLSB4O1xyXG4gICAgICAgICAgbGVmdCA9IHg7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHJpZ2h0XHJcbiAgICAgICAgICByaWdodCA9IDEwMCAtIHg7XHJcbiAgICAgICAgICBsZWZ0ID0gMTAwIC0gKDEwMCAtIHgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yYWRpdXNMZWZ0ID0gbGVmdCA8IDAgPyAwIDogbGVmdDtcclxuICAgICAgICB0aGlzLnJhZGl1c1JpZ2h0ID0gcmlnaHQgPCAwID8gMCA6IHJpZ2h0O1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgY29uc3QgcHVsbFNoaWZ0WSA9IHNoaWZ0WSAvIDI7XHJcblxyXG4gICAgICAgIHRoaXMucHVsbCA9IChwdWxsU2hpZnRZID49IHRoaXMubWF4UHVsbCkgPyB0aGlzLm1heFB1bGwgOiBwdWxsU2hpZnRZICsgKCh0aGlzLm1heFB1bGwgLSBwdWxsU2hpZnRZKSAqIDAuNSk7XHJcblxyXG4gICAgICAgIHRoaXMucm90YXRpb24gPSAoMzYwICogdGhpcy5wdWxsKSAvIHRoaXMubWF4UHVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZWQgPSAodGhpcy5wdWxsID49IHRoaXMucHVsbFRvUmVmcmVzaCk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnRvdWNoZW5kJywgWyckZXZlbnQnXSlcclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6dG91Y2hjYW5jZWwnLCBbJyRldmVudCddKVxyXG4gIG9uVG91Y2hFbmQoJGUpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIHRoaXMuYWN0aXZhdGVkICkge1xyXG4gICAgICB0aGlzLnNwaW4gPSB0cnVlO1xyXG4gICAgICB0aGlzLnB1bGwgPSB0aGlzLmFuaW1hdGVZO1xyXG5cclxuICAgICAgdGhpcy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncHVsbC10by1yZWZyZXNoJykpO1xyXG4gICAgICB0aGlzLnJlZnJlc2hTZXJ2aWNlLnB1bGwoKTtcclxuICAgICAgdGhpcy5yZWZyZXNoLmVtaXQoKTtcclxuXHJcbiAgICAgIGlmICggdGhpcy5hdXRvRGlzbWlzcyApIHtcclxuICAgICAgICB0aGlzLmRpc21pc3MoKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZGlzbWlzcygpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9LCAxNTAwKTtcclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5lbGVtZW50U2Nyb2xsYWJsZS5zdHlsZS5vdmVyZmxvd1kgPSAnJztcclxuICAgIHRoaXMuaXNGaXJzdFRpbWUgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnN0YXJ0WSA9IDk5OTk5OTk7XHJcbiAgICB0aGlzLm1vdmVZID0gMDtcclxuXHJcbiAgICB0aGlzLnJvdGF0aW9uID0gMDtcclxuICAgIHRoaXMuc3BpbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5hY3RpdmF0ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMucHVsbCA9IDA7XHJcbiAgICB0aGlzLnB1bGxGaXJzdCA9IDA7XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==