@fivethree/core
Version:
Fivethree Core Components
346 lines • 29.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/refresher/refresher.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { takeUntil, tap, filter, map } from 'rxjs/operators';
import { FivPull } from './../pull/pull.directive';
import { FivRefresherContent } from './refresher-content/refresher-content.component';
import { Component, Output, EventEmitter, ViewChild, ElementRef, Input, Renderer2 } from '@angular/core';
import { animate, style, transition, trigger, AnimationBuilder } from '@angular/animations';
import { Platform } from '@ionic/angular';
import { Subject } from 'rxjs';
import { easeOutSine, tween, reverse } from '@fivethree/ngx-rxjs-animations';
export class FivRefresher {
/**
* @param {?} builder
* @param {?} refresher
* @param {?} renderer
* @param {?} platform
*/
constructor(builder, refresher, renderer, platform) {
this.builder = builder;
this.refresher = refresher;
this.renderer = renderer;
this.platform = platform;
this.hintText = 'new posts';
this.maxPullHeight = 168;
this.minPullHeight = 112;
this.fivProgressChanged = new EventEmitter();
this.fivRefresh = new EventEmitter();
this.hintVisible = false;
this.currentProgress = 0;
this.refreshing = false;
this.$onDestroy = new Subject();
}
/**
* @return {?}
*/
ngOnInit() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
yield this.attachPullDirective();
});
}
/**
* @return {?}
*/
ngOnDestroy() {
this.$onDestroy.next();
}
/**
* @private
* @return {?}
*/
attachPullDirective() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const content = this.refresher.nativeElement.closest('ion-content');
if (!content) {
throw new Error('The fiv-refresher component needs to be inside of an ion-content.');
}
content.scrollEvents = true;
/** @type {?} */
const scroll = yield content.getScrollElement();
/** @type {?} */
const pull = new FivPull(new ElementRef(content), this.platform, content);
pull.init();
pull.fivPull
.pipe(filter((/**
* @return {?}
*/
() => !this.refreshing && !this.hintVisible)), tap((/**
* @param {?} progress
* @return {?}
*/
progress => this.fivPull(progress))), takeUntil(this.$onDestroy))
.subscribe();
pull.fivRefresh
.pipe(tap((/**
* @return {?}
*/
() => this.refresh())), takeUntil(this.$onDestroy))
.subscribe();
pull.fivCancel
.pipe(tap((/**
* @return {?}
*/
() => this.moveBack())), takeUntil(this.$onDestroy))
.subscribe();
this.spinner.fivComplete.pipe(takeUntil(this.$onDestroy)).subscribe();
this.fivRefresh
.pipe(tap((/**
* @return {?}
*/
() => scroll.scrollTo({ top: 0, behavior: 'smooth' }))), takeUntil(this.$onDestroy))
.subscribe();
});
}
/**
* @return {?}
*/
refresh() {
if (this.refreshing) {
return;
}
this.refreshing = true;
this.spinner.load();
this.setPullAnimationProgress(112 / 168);
this.fivRefresh.emit(this);
}
/**
* @return {?}
*/
complete() {
if (!this.refreshing) {
return;
}
this.spinner.complete();
}
/**
* @return {?}
*/
onDone() {
this.spinner.hide();
}
/**
* @return {?}
*/
onHidden() {
this.refreshing = false;
this.setPullAnimationProgress(0);
}
/**
* @return {?}
*/
showHint() {
this.hintVisible = true;
}
/**
* @return {?}
*/
onHintClicked() {
this.hintVisible = false;
}
/**
* @param {?} event
* @return {?}
*/
postHint(event) {
if (!event.fromState && event.toState === 'void') {
this.refresh();
}
}
/**
* @param {?} progress
* @return {?}
*/
setPullAnimationProgress(progress) {
this.currentProgress = progress;
if (progress < 1) {
this.renderer.setStyle(this.spinner.element.nativeElement, 'transform', `translateY(${this.minPullHeight * progress}px)`);
}
}
/**
* @param {?} progress
* @return {?}
*/
changeAnimationToProgress(progress) {
return new Promise((/**
* @param {?} resolve
* @return {?}
*/
resolve => {
/** @type {?} */
const animation = this.builder.build([
style({
transform: `translateY(${100 *
this.currentProgress}px) rotateZ(${360 * this.currentProgress}deg)`
}),
animate('85ms ease-in', style({
transform: `translateY(${100 * progress}px) rotateZ(${360 *
progress}deg)`
}))
]);
/** @type {?} */
const player = animation.create(this.spinner.element.nativeElement);
player.play();
player.onDone((/**
* @return {?}
*/
() => {
this.setPullAnimationProgress(progress);
player.destroy();
resolve();
}));
}));
}
/**
* @param {?} progress
* @return {?}
*/
fivPull(progress) {
this.setPullAnimationProgress(progress);
this.spinner.show();
/** @type {?} */
const value = Math.max(0, Math.min(100, (progress * 100 * this.maxPullHeight) / this.minPullHeight));
this.spinner.setValue(value * 0.84);
}
/**
* @return {?}
*/
moveBack() {
/** @type {?} */
const animation = this.builder.build([
style({
transform: `translateY(${this.currentProgress *
this.minPullHeight}px) rotateZ(${360 * this.currentProgress}deg)`
}),
animate('205ms ease-in', style({ transform: 'translateY(0) rotateZ(0)' }))
]);
/** @type {?} */
const player = animation.create(this.spinner.element.nativeElement);
tween(easeOutSine, 145)
.pipe(reverse(), map((/**
* @param {?} n
* @return {?}
*/
n => Math.max(0, Math.min(100, (this.currentProgress * n * 100 * this.maxPullHeight) /
this.minPullHeight)))), tap((/**
* @param {?} value
* @return {?}
*/
value => this.spinner.setValue(value))))
.subscribe();
player.play();
player.onDone((/**
* @return {?}
*/
() => {
this.setPullAnimationProgress(0);
this.spinner.visible = false;
player.destroy();
}));
}
/**
* @param {?} progress
* @return {?}
*/
onSpinnerProgress(progress) {
this.fivProgressChanged.emit(progress);
this.renderer
// tslint:disable-next-line:max-line-length
.setStyle(this.spinner.element.nativeElement, 'transform', `translateY(${this.maxPullHeight *
this.currentProgress}px) rotateZ(${(360 * progress) / 200}deg)`);
}
}
FivRefresher.decorators = [
{ type: Component, args: [{
selector: 'fiv-refresher',
template: "<fiv-refresher-content [progress]=\"currentProgress\" (fivProgress)=\"onSpinnerProgress($event)\" (fivComplete)=\"onDone()\"\n (fivHidden)=\"onHidden()\" #spinner>\n</fiv-refresher-content>\n\n<ion-chip class=\"gg-hint-wrapper\" *ngIf=\"hintVisible\" [@hintAnim] (@hintAnim.done)=\"postHint($event)\"\n (click)=\"onHintClicked()\" #hint>\n <ion-icon class=\"icon\" name=\"arrow-up\"></ion-icon>\n <ion-label [ngClass]=\"{'hidden': !hintVisible}\" class=\"text\">{{hintText}}</ion-label>\n</ion-chip>",
animations: [
trigger('hintAnim', [
transition('void => *', [
style({ transform: 'translateY(0px) translateX(-50%)' }),
animate('150ms ease-in', style({
opacity: 1,
transform: 'translateY(72px) translateX(-50%)'
}))
]),
transition('* => void', [
style({
width: '*',
opacity: 1,
transform: 'translateY(72px) translateX(-50%)'
}),
animate('150ms 125ms ease-out', style({
width: '40px',
transform: 'translateY(72px) translateX(-50%)'
}))
])
])
],
styles: [":host{--fiv-spin-color:var(--ion-color-primary);--fiv-hint-color:var(--fiv-spin-color, var(--ion-color-primary));--fiv-spin-background:var(--ion-color-light)}.icon{height:20px;width:20px;background:0 0;color:var(--fiv-hint-color)}.text{font-size:1em;color:var(--fiv-hint-color)}.text.hidden{opacity:0}.gg-hint-wrapper{position:absolute;z-index:8;opacity:1;left:50%;top:-40px;transform:translateY(72px) translateX(-50%);height:40px;padding-left:8px;padding-right:8px;background:var(--fiv-spin-background);border-radius:40px;box-shadow:0 4px 6px 0 rgba(0,0,0,.14),0 4px 5px rgba(0,0,0,.1);margin:0}"]
}] }
];
/** @nocollapse */
FivRefresher.ctorParameters = () => [
{ type: AnimationBuilder },
{ type: ElementRef },
{ type: Renderer2 },
{ type: Platform }
];
FivRefresher.propDecorators = {
hintText: [{ type: Input }],
maxPullHeight: [{ type: Input }],
minPullHeight: [{ type: Input }],
fivProgressChanged: [{ type: Output }],
fivRefresh: [{ type: Output }],
spinner: [{ type: ViewChild, args: ['spinner', { static: false },] }]
};
if (false) {
/** @type {?} */
FivRefresher.prototype.hintText;
/** @type {?} */
FivRefresher.prototype.maxPullHeight;
/** @type {?} */
FivRefresher.prototype.minPullHeight;
/** @type {?} */
FivRefresher.prototype.fivProgressChanged;
/** @type {?} */
FivRefresher.prototype.fivRefresh;
/** @type {?} */
FivRefresher.prototype.spinner;
/** @type {?} */
FivRefresher.prototype.hintVisible;
/** @type {?} */
FivRefresher.prototype.currentProgress;
/** @type {?} */
FivRefresher.prototype.refreshing;
/**
* @type {?}
* @private
*/
FivRefresher.prototype.$onDestroy;
/**
* @type {?}
* @private
*/
FivRefresher.prototype.builder;
/**
* @type {?}
* @private
*/
FivRefresher.prototype.refresher;
/**
* @type {?}
* @private
*/
FivRefresher.prototype.renderer;
/**
* @type {?}
* @private
*/
FivRefresher.prototype.platform;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BmaXZldGhyZWUvY29yZS8iLCJzb3VyY2VzIjpbImxpYi9yZWZyZXNoZXIvcmVmcmVzaGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3RGLE9BQU8sRUFDTCxTQUFTLEVBRVQsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsVUFBVSxFQUNWLE9BQU8sRUFDUCxnQkFBZ0IsRUFDakIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQWMsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQW1DN0UsTUFBTSxPQUFPLFlBQVk7Ozs7Ozs7SUFjdkIsWUFDVSxPQUF5QixFQUN6QixTQUFxQixFQUNyQixRQUFtQixFQUNuQixRQUFrQjtRQUhsQixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUN6QixjQUFTLEdBQVQsU0FBUyxDQUFZO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWpCbkIsYUFBUSxHQUFHLFdBQVcsQ0FBQztRQUN2QixrQkFBYSxHQUFHLEdBQUcsQ0FBQztRQUNw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dUJBc0MxQixLQUFLOzRCQUNMLEtBQUs7NEJBQ0wsS0FBSztpQ0FDTCxNQUFNO3lCQUNOLE1BQU07c0JBQ04sU0FBUyxTQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Ozs7SUFMdkMsZ0NBQWdDOztJQUNoQyxxQ0FBNkI7O0lBQzdCLHFDQUE2Qjs7SUFDN0IsMENBQXdFOztJQUN4RSxrQ0FBc0U7O0lBQ3RFLCtCQUFzRTs7SUFDdEUsbUNBQW9COztJQUNwQix1Q0FBb0I7O0lBRXBCLGtDQUFtQjs7Ozs7SUFFbkIsa0NBQW1DOzs7OztJQUdqQywrQkFBaUM7Ozs7O0lBQ2pDLGlDQUE2Qjs7Ozs7SUFDN0IsZ0NBQTJCOzs7OztJQUMzQixnQ0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0YWtlVW50aWwsIHRhcCwgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaXZQdWxsIH0gZnJvbSAnLi8uLi9wdWxsL3B1bGwuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZpdlJlZnJlc2hlckNvbnRlbnQgfSBmcm9tICcuL3JlZnJlc2hlci1jb250ZW50L3JlZnJlc2hlci1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIFJlbmRlcmVyMixcbiAgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgYW5pbWF0ZSxcbiAgc3R5bGUsXG4gIHRyYW5zaXRpb24sXG4gIHRyaWdnZXIsXG4gIEFuaW1hdGlvbkJ1aWxkZXJcbn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBJb25Db250ZW50LCBQbGF0Zm9ybSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGVhc2VPdXRTaW5lLCB0d2VlbiwgcmV2ZXJzZSB9IGZyb20gJ0BmaXZldGhyZWUvbmd4LXJ4anMtYW5pbWF0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zpdi1yZWZyZXNoZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVmcmVzaGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVmcmVzaGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdoaW50QW5pbScsIFtcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCkgdHJhbnNsYXRlWCgtNTAlKScgfSksXG4gICAgICAgIGFuaW1hdGUoXG4gICAgICAgICAgJzE1MG1zIGVhc2UtaW4nLFxuICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDcycHgpIHRyYW5zbGF0ZVgoLTUwJSknXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgXSksXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbXG4gICAgICAgIHN0eWxlKHtcbiAgICAgICAgICB3aWR0aDogJyonLFxuICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSg3MnB4KSB0cmFuc2xhdGVYKC01MCUpJ1xuICAgICAgICB9KSxcbiAgICAgICAgYW5pbWF0ZShcbiAgICAgICAgICAnMTUwbXMgMTI1bXMgZWFzZS1vdXQnLFxuICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgIHdpZHRoOiAnNDBweCcsXG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDcycHgpIHRyYW5zbGF0ZVgoLTUwJSknXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgXSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZpdlJlZnJlc2hlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgaGludFRleHQgPSAnbmV3IHBvc3RzJztcbiAgQElucHV0KCkgbWF4UHVsbEhlaWdodCA9IDE2ODtcbiAgQElucHV0KCkgbWluUHVsbEhlaWdodCA9IDExMjtcbiAgQE91dHB1dCgpIGZpdlByb2dyZXNzQ2hhbmdlZDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmaXZSZWZyZXNoOiBFdmVudEVtaXR0ZXI8Rml2UmVmcmVzaGVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQFZpZXdDaGlsZCgnc3Bpbm5lcicsIHsgc3RhdGljOiBmYWxzZSB9KSBzcGlubmVyOiBGaXZSZWZyZXNoZXJDb250ZW50O1xuICBoaW50VmlzaWJsZSA9IGZhbHNlO1xuICBjdXJyZW50UHJvZ3Jlc3MgPSAwO1xuXG4gIHJlZnJlc2hpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlICRvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlcixcbiAgICBwcml2YXRlIHJlZnJlc2hlcjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm1cbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGF3YWl0IHRoaXMuYXR0YWNoUHVsbERpcmVjdGl2ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4kb25EZXN0cm95Lm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXR0YWNoUHVsbERpcmVjdGl2ZSgpIHtcbiAgICBjb25zdCBjb250ZW50OiBJb25Db250ZW50ID0gdGhpcy5yZWZyZXNoZXIubmF0aXZlRWxlbWVudC5jbG9zZXN0KFxuICAgICAgJ2lvbi1jb250ZW50J1xuICAgICk7XG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBmaXYtcmVmcmVzaGVyIGNvbXBvbmVudCBuZWVkcyB0byBiZSBpbnNpZGUgb2YgYW4gaW9uLWNvbnRlbnQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29udGVudC5zY3JvbGxFdmVudHMgPSB0cnVlO1xuICAgIGNvbnN0IHNjcm9sbCA9IGF3YWl0IGNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpO1xuICAgIGNvbnN0IHB1bGwgPSBuZXcgRml2UHVsbChuZXcgRWxlbWVudFJlZihjb250ZW50KSwgdGhpcy5wbGF0Zm9ybSwgY29udGVudCk7XG4gICAgcHVsbC5pbml0KCk7XG5cbiAgICBwdWxsLmZpdlB1bGxcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMucmVmcmVzaGluZyAmJiAhdGhpcy5oaW50VmlzaWJsZSksXG4gICAgICAgIHRhcChwcm9ncmVzcyA9PiB0aGlzLmZpdlB1bGwocHJvZ3Jlc3MpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuJG9uRGVzdHJveSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHB1bGwuZml2UmVmcmVzaFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLnJlZnJlc2goKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLiRvbkRlc3Ryb3kpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBwdWxsLmZpdkNhbmNlbFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLm1vdmVCYWNrKCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy4kb25EZXN0cm95KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5zcGlubmVyLmZpdkNvbXBsZXRlLnBpcGUodGFrZVVudGlsKHRoaXMuJG9uRGVzdHJveSkpLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5maXZSZWZyZXNoXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHNjcm9sbC5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuJG9uRGVzdHJveSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3Bpbm5lci5sb2FkKCk7XG4gICAgdGhpcy5zZXRQdWxsQW5pbWF0aW9uUHJvZ3Jlc3MoMTEyIC8gMTY4KTtcbiAgICB0aGlzLmZpdlJlZnJlc2guZW1pdCh0aGlzKTtcbiAgfVxuXG4gIGNvbXBsZXRlKCkge1xuICAgIGlmICghdGhpcy5yZWZyZXNoaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3Bpbm5lci5jb21wbGV0ZSgpO1xuICB9XG5cbiAgb25Eb25lKCkge1xuICAgIHRoaXMuc3Bpbm5lci5oaWRlKCk7XG4gIH1cblxuICBvbkhpZGRlbigpIHtcbiAgICB0aGlzLnJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNldFB1bGxBbmltYXRpb25Qcm9ncmVzcygwKTtcbiAgfVxuXG4gIHNob3dIaW50KCkge1xuICAgIHRoaXMuaGludFZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgb25IaW50Q2xpY2tlZCgpIHtcbiAgICB0aGlzLmhpbnRWaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICBwb3N0SGludChldmVudCkge1xuICAgIGlmICghZXZlbnQuZnJvbVN0YXRlICYmIGV2ZW50LnRvU3RhdGUgPT09ICd2b2lkJykge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UHVsbEFuaW1hdGlvblByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICB0aGlzLmN1cnJlbnRQcm9ncmVzcyA9IHByb2dyZXNzO1xuXG4gICAgaWYgKHByb2dyZXNzIDwgMSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5zcGlubmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgIGB0cmFuc2xhdGVZKCR7dGhpcy5taW5QdWxsSGVpZ2h0ICogcHJvZ3Jlc3N9cHgpYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VBbmltYXRpb25Ub1Byb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuYnVpbGRlci5idWlsZChbXG4gICAgICAgIHN0eWxlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7MTAwICpcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2dyZXNzfXB4KSByb3RhdGVaKCR7MzYwICogdGhpcy5jdXJyZW50UHJvZ3Jlc3N9ZGVnKWBcbiAgICAgICAgfSksXG4gICAgICAgIGFuaW1hdGUoXG4gICAgICAgICAgJzg1bXMgZWFzZS1pbicsXG4gICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgkezEwMCAqIHByb2dyZXNzfXB4KSByb3RhdGVaKCR7MzYwICpcbiAgICAgICAgICAgICAgcHJvZ3Jlc3N9ZGVnKWBcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgcGxheWVyID0gYW5pbWF0aW9uLmNyZWF0ZSh0aGlzLnNwaW5uZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgICBwbGF5ZXIub25Eb25lKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRQdWxsQW5pbWF0aW9uUHJvZ3Jlc3MocHJvZ3Jlc3MpO1xuICAgICAgICBwbGF5ZXIuZGVzdHJveSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpdlB1bGwocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHVsbEFuaW1hdGlvblByb2dyZXNzKHByb2dyZXNzKTtcbiAgICB0aGlzLnNwaW5uZXIuc2hvdygpO1xuICAgIGNvbnN0IHZhbHVlID0gTWF0aC5tYXgoXG4gICAgICAwLFxuICAgICAgTWF0aC5taW4oMTAwLCAocHJvZ3Jlc3MgKiAxMDAgKiB0aGlzLm1heFB1bGxIZWlnaHQpIC8gdGhpcy5taW5QdWxsSGVpZ2h0KVxuICAgICk7XG4gICAgdGhpcy5zcGlubmVyLnNldFZhbHVlKHZhbHVlICogMC44NCk7XG4gIH1cblxuICBtb3ZlQmFjaygpIHtcbiAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLmJ1aWxkZXIuYnVpbGQoW1xuICAgICAgc3R5bGUoe1xuICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7dGhpcy5jdXJyZW50UHJvZ3Jlc3MgKlxuICAgICAgICAgIHRoaXMubWluUHVsbEhlaWdodH1weCkgcm90YXRlWigkezM2MCAqIHRoaXMuY3VycmVudFByb2dyZXNzfWRlZylgXG4gICAgICB9KSxcbiAgICAgIGFuaW1hdGUoJzIwNW1zIGVhc2UtaW4nLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCkgcm90YXRlWigwKScgfSkpXG4gICAgXSk7XG4gICAgY29uc3QgcGxheWVyID0gYW5pbWF0aW9uLmNyZWF0ZSh0aGlzLnNwaW5uZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcblxuICAgIHR3ZWVuKGVhc2VPdXRTaW5lLCAxNDUpXG4gICAgICAucGlwZShcbiAgICAgICAgcmV2ZXJzZSgpLFxuICAgICAgICBtYXAobiA9PlxuICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKFxuICAgICAgICAgICAgICAxMDAsXG4gICAgICAgICAgICAgICh0aGlzLmN1cnJlbnRQcm9ncmVzcyAqIG4gKiAxMDAgKiB0aGlzLm1heFB1bGxIZWlnaHQpIC9cbiAgICAgICAgICAgICAgICB0aGlzLm1pblB1bGxIZWlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRhcCh2YWx1ZSA9PiB0aGlzLnNwaW5uZXIuc2V0VmFsdWUodmFsdWUpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICAgIHBsYXllci5wbGF5KCk7XG4gICAgcGxheWVyLm9uRG9uZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFB1bGxBbmltYXRpb25Qcm9ncmVzcygwKTtcbiAgICAgIHRoaXMuc3Bpbm5lci52aXNpYmxlID0gZmFsc2U7XG4gICAgICBwbGF5ZXIuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgb25TcGlubmVyUHJvZ3Jlc3MocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgIHRoaXMuZml2UHJvZ3Jlc3NDaGFuZ2VkLmVtaXQocHJvZ3Jlc3MpO1xuICAgIHRoaXMucmVuZGVyZXJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgIC5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5zcGlubmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgIGB0cmFuc2xhdGVZKCR7dGhpcy5tYXhQdWxsSGVpZ2h0ICpcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9ncmVzc31weCkgcm90YXRlWigkeygzNjAgKiBwcm9ncmVzcykgLyAyMDB9ZGVnKWBcbiAgICAgICk7XG4gIH1cbn1cbiJdfQ==