@w11k/ngx-present
Version:
Angular based Presentation Tool
880 lines • 56.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/slide-by-slide/slide-by-slide.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __extends, __read, __spread } from "tslib";
import { Injectable, Injector } from '@angular/core';
import { Router } from '@angular/router';
import { skipNil, skipPropertyNil } from '@w11k/rx-ninja';
import { Commands, Facade } from '@w11k/tydux';
import { combineLatest, Subject } from 'rxjs';
import { filter, map, take, takeUntil, withLatestFrom } from 'rxjs/operators';
import { isNotEditable, nonNavigationEvent } from '../core/event.service';
import { PresentationService } from '../core/presentation.service';
import { Slide } from '../core/presentation.types';
import { flattenDeep, maxDepth } from '../core/utils';
import { tableOfContentSlides } from '../theming/table-of-content';
import { calculateCoordinates, compareCoordinates, coordinateToSlideMap, equalCoordinates, isValidCoordinate, routeParamsToCoordinate, } from './slide-by-slide.functions';
import * as i0 from "@angular/core";
import * as i1 from "../core/presentation.service";
import * as i2 from "@angular/router";
var SlideBySlideState = /** @class */ (function () {
function SlideBySlideState() {
this.coordinatesMaxDepth = 0;
this.slides = [];
this.slideMap = {};
}
return SlideBySlideState;
}());
export { SlideBySlideState };
if (false) {
/** @type {?} */
SlideBySlideState.prototype.coordinatesMaxDepth;
/** @type {?} */
SlideBySlideState.prototype.slides;
/** @type {?} */
SlideBySlideState.prototype.slideMap;
/** @type {?} */
SlideBySlideState.prototype.currentSlide;
/** @type {?} */
SlideBySlideState.prototype.currentMode;
}
var SlideBySlideMutator = /** @class */ (function (_super) {
__extends(SlideBySlideMutator, _super);
function SlideBySlideMutator() {
return _super.call(this) || this;
}
/**
* @param {?} slide
* @return {?}
*/
SlideBySlideMutator.prototype.setCurrentSlide = /**
* @param {?} slide
* @return {?}
*/
function (slide) {
this.state.currentSlide = slide;
};
/**
* @param {?} mode
* @return {?}
*/
SlideBySlideMutator.prototype.setCurrentMode = /**
* @param {?} mode
* @return {?}
*/
function (mode) {
this.state.currentMode = mode;
};
/**
* @param {?} slides
* @return {?}
*/
SlideBySlideMutator.prototype.setSlides = /**
* @param {?} slides
* @return {?}
*/
function (slides) {
this.state.coordinatesMaxDepth = maxDepth(slides);
this.state.slides = flattenDeep(slides);
this.state.slideMap = coordinateToSlideMap(this.state.slides);
};
return SlideBySlideMutator;
}(Commands));
export { SlideBySlideMutator };
var SlideBySlideService = /** @class */ (function (_super) {
__extends(SlideBySlideService, _super);
function SlideBySlideService(injector, presentation, router) {
var _this = _super.call(this, 'SlideBySlide', new SlideBySlideState(), new SlideBySlideMutator()) || this;
_this.presentation = presentation;
_this.router = router;
_this.onDestroy$ = new Subject();
_this.presentation.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.slides; }))
.pipe(takeUntil(_this.onDestroy$))
.subscribe((/**
* @param {?} slides
* @return {?}
*/
function (slides) { return _this.commands.setSlides(slides); }));
return _this;
}
/**
* @param {?} coordinatesToKeep
* @param {?=} mode
* @return {?}
*/
SlideBySlideService.prototype.navigateToNext = /**
* @param {?} coordinatesToKeep
* @param {?=} mode
* @return {?}
*/
function (coordinatesToKeep, mode) {
var _this = this;
this.nextSlide(coordinatesToKeep)
.pipe(take(1))
.subscribe((/**
* @param {?} slide
* @return {?}
*/
function (slide) { return _this.navigateAbsolute(slide, mode); }));
};
/**
* @param {?} coordinatesToKeep
* @param {?=} mode
* @return {?}
*/
SlideBySlideService.prototype.navigateToPrevious = /**
* @param {?} coordinatesToKeep
* @param {?=} mode
* @return {?}
*/
function (coordinatesToKeep, mode) {
var _this = this;
this.previousSlide(coordinatesToKeep)
.pipe(take(1))
.subscribe((/**
* @param {?} slide
* @return {?}
*/
function (slide) { return _this.navigateAbsolute(slide, mode); }));
};
/**
* @param {?} coordinatesToKeep
* @param {?=} prefix
* @return {?}
*/
SlideBySlideService.prototype.previousSlide = /**
* @param {?} coordinatesToKeep
* @param {?=} prefix
* @return {?}
*/
function (coordinatesToKeep, prefix) {
return this.navigateRelative(-1, coordinatesToKeep);
};
/**
* @param {?} coordinatesToKeep
* @return {?}
*/
SlideBySlideService.prototype.nextSlide = /**
* @param {?} coordinatesToKeep
* @return {?}
*/
function (coordinatesToKeep) {
return this.navigateRelative(1, coordinatesToKeep);
};
/**
* @param {?=} mode
* @return {?}
*/
SlideBySlideService.prototype.navigateToNextToc = /**
* @param {?=} mode
* @return {?}
*/
function (mode) {
var _this = this;
this.nextToc('forward')
.pipe(take(1))
.subscribe((/**
* @param {?} slide
* @return {?}
*/
function (slide) { return _this.navigateAbsolute(slide, mode); }));
};
/**
* @param {?=} mode
* @return {?}
*/
SlideBySlideService.prototype.navigateToPreviousToc = /**
* @param {?=} mode
* @return {?}
*/
function (mode) {
var _this = this;
this.nextToc('backward')
.pipe(take(1))
.subscribe((/**
* @param {?} slide
* @return {?}
*/
function (slide) { return _this.navigateAbsolute(slide, mode); }));
};
/**
* @param {?} direction
* @return {?}
*/
SlideBySlideService.prototype.nextToc = /**
* @param {?} direction
* @return {?}
*/
function (direction) {
/** @type {?} */
var currentSlide$ = this.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.currentSlide; }))
.pipe(skipNil());
/** @type {?} */
var tocSlides$ = this.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.slides; }))
.pipe(skipNil(), filter((/**
* @param {?} x
* @return {?}
*/
function (x) { return x.length !== 0; })), map(tableOfContentSlides));
return combineLatest(currentSlide$, tocSlides$)
.pipe(map((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = __read(_a, 2), currentSlide = _b[0], tocSlides = _b[1];
if (direction === 'forward') {
return tocSlides.find((/**
* @param {?} tocSlide
* @return {?}
*/
function (tocSlide) {
return compareCoordinates(tocSlide.coordinates, currentSlide.coordinates) === 1;
}));
}
else {
return tocSlides.slice().reverse().find((/**
* @param {?} tocSlide
* @return {?}
*/
function (tocSlide) {
return compareCoordinates(tocSlide.coordinates, currentSlide.coordinates) === -1;
}));
}
})));
};
/**
* @param {?} move
* @param {?} coordinatesToKeep
* @return {?}
*/
SlideBySlideService.prototype.navigateRelative = /**
* @param {?} move
* @param {?} coordinatesToKeep
* @return {?}
*/
function (move, coordinatesToKeep) {
/** @type {?} */
var currentSlide$ = this.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.currentSlide; }))
.pipe(skipNil());
/** @type {?} */
var slides$ = this.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.slides; }))
.pipe(skipNil(), filter((/**
* @param {?} x
* @return {?}
*/
function (x) { return x.length !== 0; })));
/** @type {?} */
var depth$ = this.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.coordinatesMaxDepth; }))
.pipe(skipNil());
return combineLatest(slides$, currentSlide$, depth$)
.pipe(map((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = __read(_a, 3), slides = _b[0], current = _b[1], depth = _b[2];
return calculateCoordinates(slides, current, move, coordinatesToKeep, depth);
})));
};
/**
* @param {?} target
* @param {?=} mode
* @return {?}
*/
SlideBySlideService.prototype.navigateAbsolute = /**
* @param {?} target
* @param {?=} mode
* @return {?}
*/
function (target, mode) {
/** @type {?} */
var slide;
if (target instanceof Slide) {
slide = target;
}
else {
slide = this.state.slides.find((/**
* @param {?} x
* @return {?}
*/
function (x) { return equalCoordinates(target, x.coordinates); }));
}
if (slide === undefined) {
return;
}
/** @type {?} */
var modeWithFallback;
if (mode !== undefined) {
modeWithFallback = mode;
}
else if (this.state.currentMode !== undefined) {
modeWithFallback = this.state.currentMode;
}
else {
modeWithFallback = 'slide';
}
/** @type {?} */
var link = __spread(["/" + modeWithFallback], slide.coordinates);
return this.router.navigate(link, { queryParamsHandling: 'merge' });
};
/**
* @param {?=} prefix
* @return {?}
*/
SlideBySlideService.prototype.navigateToFirst = /**
* @param {?=} prefix
* @return {?}
*/
function (prefix) {
var _this = this;
this.firstSlide()
.pipe(take(1), takeUntil(this.onDestroy$))
.subscribe((/**
* @param {?} slide
* @return {?}
*/
function (slide) { return _this.navigateAbsolute(slide, prefix); }));
};
/**
* @return {?}
*/
SlideBySlideService.prototype.firstSlide = /**
* @return {?}
*/
function () {
return this.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.slides; }))
.pipe(skipNil(), filter((/**
* @param {?} slides
* @return {?}
*/
function (slides) { return slides.length > 0; })), map((/**
* @param {?} slides
* @return {?}
*/
function (slides) { return slides[0]; })));
};
/**
* @param {?} coordinates
* @return {?}
*/
SlideBySlideService.prototype.isValidCoordinate = /**
* @param {?} coordinates
* @return {?}
*/
function (coordinates) {
return this.presentation.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.slides; }))
.pipe(skipNil(), filter((/**
* @param {?} slides
* @return {?}
*/
function (slides) { return slides.length > 0; })), map((/**
* @param {?} slides
* @return {?}
*/
function (slides) { return isValidCoordinate(slides, coordinates); })));
};
/**
* @private
* @param {?} coordinates
* @return {?}
*/
SlideBySlideService.prototype.coordinatesToSlide = /**
* @private
* @param {?} coordinates
* @return {?}
*/
function (coordinates) {
return this.state.slideMap[coordinates.join('.')];
};
/**
* @param {?} route
* @return {?}
*/
SlideBySlideService.prototype.setCurrentModeAndSlide = /**
* @param {?} route
* @return {?}
*/
function (route) {
/** @type {?} */
var coordinates = routeParamsToCoordinate(route.params);
/** @type {?} */
var mode = (/** @type {?} */ (route.url[0].path));
/** @type {?} */
var slide = this.coordinatesToSlide(coordinates);
this.commands.setCurrentSlide(slide);
this.commands.setCurrentMode(mode);
};
/**
* @return {?}
*/
SlideBySlideService.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.onDestroy$.next();
};
SlideBySlideService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
SlideBySlideService.ctorParameters = function () { return [
{ type: Injector },
{ type: PresentationService },
{ type: Router }
]; };
/** @nocollapse */ SlideBySlideService.ɵprov = i0.ɵɵdefineInjectable({ factory: function SlideBySlideService_Factory() { return new SlideBySlideService(i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.PresentationService), i0.ɵɵinject(i2.Router)); }, token: SlideBySlideService, providedIn: "root" });
return SlideBySlideService;
}(Facade));
export { SlideBySlideService };
if (false) {
/**
* @type {?}
* @private
*/
SlideBySlideService.prototype.onDestroy$;
/**
* @type {?}
* @private
*/
SlideBySlideService.prototype.presentation;
/**
* @type {?}
* @private
*/
SlideBySlideService.prototype.router;
}
var NavigateSectionForward = /** @class */ (function () {
function NavigateSectionForward(service) {
this.service = service;
}
/**
* @param {?} events$
* @return {?}
*/
NavigateSectionForward.prototype.init = /**
* @param {?} events$
* @return {?}
*/
function (events$) {
var _this = this;
events$
.pipe(filter(isNotEditable),
// arrow down + alt || arrow right + alt
filter((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.keyCode === 40 && event.altKey) {
return true;
}
else if (event.keyCode === 39 && event.altKey) {
return true;
}
return false;
})))
.subscribe((/**
* @return {?}
*/
function () {
_this.service.navigateToNextToc();
}));
};
NavigateSectionForward.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NavigateSectionForward.ctorParameters = function () { return [
{ type: SlideBySlideService }
]; };
return NavigateSectionForward;
}());
export { NavigateSectionForward };
if (false) {
/**
* @type {?}
* @private
*/
NavigateSectionForward.prototype.service;
}
var NavigateSlideForward = /** @class */ (function () {
function NavigateSlideForward(service) {
this.service = service;
}
/**
* @param {?} events$
* @return {?}
*/
NavigateSlideForward.prototype.init = /**
* @param {?} events$
* @return {?}
*/
function (events$) {
var _this = this;
events$
.pipe(filter(nonNavigationEvent),
// arrow down, arrow right, or page down
filter((/**
* @param {?} event
* @return {?}
*/
function (event) { return event.keyCode === 40 || event.keyCode === 39 || event.keyCode === 34; })))
.subscribe((/**
* @return {?}
*/
function () {
_this.service.navigateToNext(-1);
}));
};
NavigateSlideForward.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NavigateSlideForward.ctorParameters = function () { return [
{ type: SlideBySlideService }
]; };
return NavigateSlideForward;
}());
export { NavigateSlideForward };
if (false) {
/**
* @type {?}
* @private
*/
NavigateSlideForward.prototype.service;
}
var NavigateSectionBackward = /** @class */ (function () {
function NavigateSectionBackward(service) {
this.service = service;
}
/**
* @param {?} events$
* @return {?}
*/
NavigateSectionBackward.prototype.init = /**
* @param {?} events$
* @return {?}
*/
function (events$) {
var _this = this;
events$
.pipe(filter(isNotEditable),
// arrow up + alt || arrow left + alt
filter((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.keyCode === 38 && event.altKey) {
return true;
}
else if (event.keyCode === 37 && event.altKey) {
return true;
}
return false;
})))
.subscribe((/**
* @return {?}
*/
function () {
_this.service.navigateToPreviousToc();
}));
};
NavigateSectionBackward.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NavigateSectionBackward.ctorParameters = function () { return [
{ type: SlideBySlideService }
]; };
return NavigateSectionBackward;
}());
export { NavigateSectionBackward };
if (false) {
/**
* @type {?}
* @private
*/
NavigateSectionBackward.prototype.service;
}
var NavigateSlideBackward = /** @class */ (function () {
function NavigateSlideBackward(service) {
this.service = service;
}
/**
* @param {?} events$
* @return {?}
*/
NavigateSlideBackward.prototype.init = /**
* @param {?} events$
* @return {?}
*/
function (events$) {
var _this = this;
events$
.pipe(filter(nonNavigationEvent),
// arrow up, arrow left or page up
filter((/**
* @param {?} event
* @return {?}
*/
function (event) { return event.keyCode === 38 || event.keyCode === 37 || event.keyCode === 33; })))
.subscribe((/**
* @return {?}
*/
function () {
_this.service.navigateToPrevious(-1);
}));
};
NavigateSlideBackward.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NavigateSlideBackward.ctorParameters = function () { return [
{ type: SlideBySlideService }
]; };
return NavigateSlideBackward;
}());
export { NavigateSlideBackward };
if (false) {
/**
* @type {?}
* @private
*/
NavigateSlideBackward.prototype.service;
}
var NavigateToFirstSlide = /** @class */ (function () {
function NavigateToFirstSlide(service) {
this.service = service;
}
/**
* @param {?} events$
* @return {?}
*/
NavigateToFirstSlide.prototype.init = /**
* @param {?} events$
* @return {?}
*/
function (events$) {
var _this = this;
events$
.pipe(filter(nonNavigationEvent),
// pos 1
filter((/**
* @param {?} event
* @return {?}
*/
function (event) { return event.keyCode === 36; })))
.subscribe((/**
* @return {?}
*/
function () {
_this.service.navigateToFirst();
}));
};
NavigateToFirstSlide.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NavigateToFirstSlide.ctorParameters = function () { return [
{ type: SlideBySlideService }
]; };
return NavigateToFirstSlide;
}());
export { NavigateToFirstSlide };
if (false) {
/**
* @type {?}
* @private
*/
NavigateToFirstSlide.prototype.service;
}
var NavigateToOverview = /** @class */ (function () {
function NavigateToOverview(service, presentation) {
this.service = service;
this.presentation = presentation;
}
/**
* @param {?} events$
* @return {?}
*/
NavigateToOverview.prototype.init = /**
* @param {?} events$
* @return {?}
*/
function (events$) {
var _this = this;
/** @type {?} */
var config$ = this.presentation.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.config.navigation.overview; }))
.pipe(skipPropertyNil('component'));
/** @type {?} */
var slide$ = this.service.select()
.pipe(withLatestFrom(config$), map((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = __read(_a, 2), state = _b[0], config = _b[1];
return state.slides.find((/**
* @param {?} slide
* @return {?}
*/
function (slide) { return slide.component === config.component; }));
})));
events$
.pipe(filter(nonNavigationEvent),
// pos 1
filter((/**
* @param {?} event
* @return {?}
*/
function (event) {
// o
return event.keyCode === 79;
})), withLatestFrom(slide$))
.subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = __read(_a, 2), event = _b[0], slide = _b[1];
_this.service.navigateAbsolute(slide);
}));
};
NavigateToOverview.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NavigateToOverview.ctorParameters = function () { return [
{ type: SlideBySlideService },
{ type: PresentationService }
]; };
return NavigateToOverview;
}());
export { NavigateToOverview };
if (false) {
/**
* @type {?}
* @private
*/
NavigateToOverview.prototype.service;
/**
* @type {?}
* @private
*/
NavigateToOverview.prototype.presentation;
}
var TogglePresenter = /** @class */ (function () {
function TogglePresenter(service, router) {
this.service = service;
this.router = router;
}
/**
* @param {?} events$
* @return {?}
*/
TogglePresenter.prototype.init = /**
* @param {?} events$
* @return {?}
*/
function (events$) {
var _this = this;
/** @type {?} */
var slide$ = this.service.select();
events$
.pipe(filter(isNotEditable),
// letter p
filter((/**
* @param {?} event
* @return {?}
*/
function (event) { return event.keyCode === 80 && event.altKey; })), withLatestFrom(slide$))
.subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = __read(_a, 2), event = _b[0], state = _b[1];
/** @type {?} */
var mode;
if (state.currentMode === 'presenter') {
mode = 'slide';
}
else {
mode = 'presenter';
}
/** @type {?} */
var coordinates = [];
if (state.currentSlide !== undefined) {
coordinates = state.currentSlide.coordinates;
}
/** @type {?} */
var link = __spread([mode], coordinates);
_this.router.navigate(link, { queryParamsHandling: 'merge' });
}));
};
TogglePresenter.decorators = [
{ type: Injectable }
];
/** @nocollapse */
TogglePresenter.ctorParameters = function () { return [
{ type: SlideBySlideService },
{ type: Router }
]; };
return TogglePresenter;
}());
export { TogglePresenter };
if (false) {
/**
* @type {?}
* @private
*/
TogglePresenter.prototype.service;
/**
* @type {?}
* @private
*/
TogglePresenter.prototype.router;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtYnktc2xpZGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B3MTFrL25neC1wcmVzZW50LyIsInNvdXJjZXMiOlsibGliL3NsaWRlLWJ5LXNsaWRlL3NsaWRlLWJ5LXNsaWRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUEwQixNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBMEIsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQWUsS0FBSyxFQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsdUJBQXVCLEdBQ3hCLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFJcEM7SUFPRTtRQU5PLHdCQUFtQixHQUFHLENBQUMsQ0FBQztR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QUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQyxFQUFDLENBQUM7SUFDUCxDQUFDOztnQkFsQ0YsVUFBVTs7OztnQkFFNkIsbUJBQW1CO2dCQTVXMUIsTUFBTTs7SUE2WXZDLHNCQUFDO0NBQUEsQUFuQ0QsSUFtQ0M7U0FsQ1ksZUFBZTs7Ozs7O0lBQ2Qsa0NBQTZDOzs7OztJQUM3QyxpQ0FBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgc2tpcE5pbCwgc2tpcFByb3BlcnR5TmlsIH0gZnJvbSAnQHcxMWsvcngtbmluamEnO1xuaW1wb3J0IHsgQ29tbWFuZHMsIEZhY2FkZSB9IGZyb20gJ0B3MTFrL3R5ZHV4JztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlLCB0YWtlVW50aWwsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgaXNOb3RFZGl0YWJsZSwgS2V5Ym9hcmRFdmVudFByb2Nlc3Nvciwgbm9uTmF2aWdhdGlvbkV2ZW50IH0gZnJvbSAnLi4vY29yZS9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXNlbnRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3ByZXNlbnRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENvb3JkaW5hdGVzLCBTbGlkZSwgU2xpZGVzIH0gZnJvbSAnLi4vY29yZS9wcmVzZW50YXRpb24udHlwZXMnO1xuaW1wb3J0IHsgZmxhdHRlbkRlZXAsIG1heERlcHRoIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyB0YWJsZU9mQ29udGVudFNsaWRlcyB9IGZyb20gJy4uL3RoZW1pbmcvdGFibGUtb2YtY29udGVudCc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVDb29yZGluYXRlcyxcbiAgY29tcGFyZUNvb3JkaW5hdGVzLFxuICBjb29yZGluYXRlVG9TbGlkZU1hcCxcbiAgZXF1YWxDb29yZGluYXRlcyxcbiAgaXNWYWxpZENvb3JkaW5hdGUsXG4gIHJvdXRlUGFyYW1zVG9Db29yZGluYXRlLFxufSBmcm9tICcuL3NsaWRlLWJ5LXNsaWRlLmZ1bmN0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIE1vZGUgPSAnc2xpZGUnIHwgJ3ByZXNlbnRlcic7XG5cbmV4cG9ydCBjbGFzcyBTbGlkZUJ5U2xpZGVTdGF0ZSB7XG4gIHB1YmxpYyBjb29yZGluYXRlc01heERlcHRoID0gMDtcbiAgcHVibGljIHNsaWRlczogU2xpZGVbXSA9IFtdO1xuICBwdWJsaWMgc2xpZGVNYXA6IHsgW2tleTogc3RyaW5nXTogU2xpZGUgfSA9IHt9O1xuICBwdWJsaWMgY3VycmVudFNsaWRlOiBTbGlkZSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGN1cnJlbnRNb2RlOiBNb2RlIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cbn1cblxuZXhwb3J0IGNsYXNzIFNsaWRlQnlTbGlkZU11dGF0b3IgZXh0ZW5kcyBDb21tYW5kczxTbGlkZUJ5U2xpZGVTdGF0ZT4ge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBzZXRDdXJyZW50U2xpZGUoc2xpZGU6IFNsaWRlKSB7XG4gICAgdGhpcy5zdGF0ZS5jdXJyZW50U2xpZGUgPSBzbGlkZTtcbiAgfVxuXG4gIHNldEN1cnJlbnRNb2RlKG1vZGU6IE1vZGUpIHtcbiAgICB0aGlzLnN0YXRlLmN1cnJlbnRNb2RlID0gbW9kZTtcbiAgfVxuXG4gIHNldFNsaWRlcyhzbGlkZXM6IFNsaWRlcykge1xuICAgIHRoaXMuc3RhdGUuY29vcmRpbmF0ZXNNYXhEZXB0aCA9IG1heERlcHRoKHNsaWRlcyk7XG4gICAgdGhpcy5zdGF0ZS5zbGlkZXMgPSBmbGF0dGVuRGVlcChzbGlkZXMpO1xuICAgIHRoaXMuc3RhdGUuc2xpZGVNYXAgPSBjb29yZGluYXRlVG9TbGlkZU1hcCh0aGlzLnN0YXRlLnNsaWRlcyk7XG4gIH1cblxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTbGlkZUJ5U2xpZGVTZXJ2aWNlIGV4dGVuZHMgRmFjYWRlPFNsaWRlQnlTbGlkZVN0YXRlLCBTbGlkZUJ5U2xpZGVNdXRhdG9yPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHByZXNlbnRhdGlvbjogUHJlc2VudGF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcikge1xuICAgIHN1cGVyKCdTbGlkZUJ5U2xpZGUnLCBuZXcgU2xpZGVCeVNsaWRlU3RhdGUoKSwgbmV3IFNsaWRlQnlTbGlkZU11dGF0b3IoKSk7XG5cbiAgICB0aGlzLnByZXNlbnRhdGlvbi5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuc2xpZGVzKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKHNsaWRlcyA9PiB0aGlzLmNvbW1hbmRzLnNldFNsaWRlcyhzbGlkZXMpKTtcbiAgfVxuXG4gIG5hdmlnYXRlVG9OZXh0KGNvb3JkaW5hdGVzVG9LZWVwOiBudW1iZXIgfCB1bmRlZmluZWQsIG1vZGU/OiBzdHJpbmcpIHtcbiAgICB0aGlzLm5leHRTbGlkZShjb29yZGluYXRlc1RvS2VlcClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKHNsaWRlID0+IHRoaXMubmF2aWdhdGVBYnNvbHV0ZShzbGlkZSwgbW9kZSkpO1xuICB9XG5cbiAgbmF2aWdhdGVUb1ByZXZpb3VzKGNvb3JkaW5hdGVzVG9LZWVwOiBudW1iZXIgfCB1bmRlZmluZWQsIG1vZGU/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnByZXZpb3VzU2xpZGUoY29vcmRpbmF0ZXNUb0tlZXApXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZShzbGlkZSA9PiB0aGlzLm5hdmlnYXRlQWJzb2x1dGUoc2xpZGUsIG1vZGUpKTtcbiAgfVxuXG4gIHByZXZpb3VzU2xpZGUoY29vcmRpbmF0ZXNUb0tlZXA6IG51bWJlciB8IHVuZGVmaW5lZCwgcHJlZml4Pzogc3RyaW5nKTogT2JzZXJ2YWJsZTxTbGlkZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRlUmVsYXRpdmUoLTEsIGNvb3JkaW5hdGVzVG9LZWVwKTtcbiAgfVxuXG4gIG5leHRTbGlkZShjb29yZGluYXRlc1RvS2VlcDogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxTbGlkZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRlUmVsYXRpdmUoMSwgY29vcmRpbmF0ZXNUb0tlZXApO1xuICB9XG5cbiAgbmF2aWdhdGVUb05leHRUb2MobW9kZT86IHN0cmluZykge1xuICAgIHRoaXMubmV4dFRvYygnZm9yd2FyZCcpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZShzbGlkZSA9PiB0aGlzLm5hdmlnYXRlQWJzb2x1dGUoc2xpZGUsIG1vZGUpKTtcbiAgfVxuXG4gIG5hdmlnYXRlVG9QcmV2aW91c1RvYyhtb2RlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5uZXh0VG9jKCdiYWNrd2FyZCcpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZShzbGlkZSA9PiB0aGlzLm5hdmlnYXRlQWJzb2x1dGUoc2xpZGUsIG1vZGUpKTtcbiAgfVxuXG4gIG5leHRUb2MoZGlyZWN0aW9uOiAnZm9yd2FyZCcgfCAnYmFja3dhcmQnKTogT2JzZXJ2YWJsZTxTbGlkZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRTbGlkZSQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5jdXJyZW50U2xpZGUpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpLFxuICAgICAgKTtcblxuICAgIGNvbnN0IHRvY1NsaWRlcyQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zbGlkZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpLFxuICAgICAgICBmaWx0ZXIoeCA9PiB4Lmxlbmd0aCAhPT0gMCksXG4gICAgICAgIG1hcCh0YWJsZU9mQ29udGVudFNsaWRlcyksXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoY3VycmVudFNsaWRlJCwgdG9jU2xpZGVzJClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKFtjdXJyZW50U2xpZGUsIHRvY1NsaWRlc10pID0+IHtcbiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnZm9yd2FyZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2NTbGlkZXMuZmluZCh0b2NTbGlkZSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBjb21wYXJlQ29vcmRpbmF0ZXModG9jU2xpZGUuY29vcmRpbmF0ZXMsIGN1cnJlbnRTbGlkZS5jb29yZGluYXRlcykgPT09IDE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRvY1NsaWRlcy5zbGljZSgpLnJldmVyc2UoKS5maW5kKHRvY1NsaWRlID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVDb29yZGluYXRlcyh0b2NTbGlkZS5jb29yZGluYXRlcywgY3VycmVudFNsaWRlLmNvb3JkaW5hdGVzKSA9PT0gLTE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIG5hdmlnYXRlUmVsYXRpdmUobW92ZTogbnVtYmVyLCBjb29yZGluYXRlc1RvS2VlcDogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxTbGlkZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRTbGlkZSQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5jdXJyZW50U2xpZGUpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpXG4gICAgICApO1xuXG4gICAgY29uc3Qgc2xpZGVzJCA9IHRoaXMuc2VsZWN0KHN0YXRlID0+IHN0YXRlLnNsaWRlcylcbiAgICAgIC5waXBlKFxuICAgICAgICBza2lwTmlsKCksXG4gICAgICAgIGZpbHRlcih4ID0+IHgubGVuZ3RoICE9PSAwKSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBkZXB0aCQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5jb29yZGluYXRlc01heERlcHRoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHNraXBOaWwoKVxuICAgICAgKTtcblxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHNsaWRlcyQsIGN1cnJlbnRTbGlkZSQsIGRlcHRoJClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKFtzbGlkZXMsIGN1cnJlbnQsIGRlcHRoXSkgPT4gY2FsY3VsYXRlQ29vcmRpbmF0ZXMoc2xpZGVzLCBjdXJyZW50LCBtb3ZlLCBjb29yZGluYXRlc1RvS2VlcCwgZGVwdGgpKSxcbiAgICAgICk7XG4gIH1cblxuICBuYXZpZ2F0ZUFic29sdXRlKHRhcmdldDogQ29vcmRpbmF0ZXMgfCBTbGlkZSB8IHVuZGVmaW5lZCwgbW9kZT86IHN0cmluZykge1xuICAgIGxldCBzbGlkZTogU2xpZGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgU2xpZGUpIHtcbiAgICAgIHNsaWRlID0gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzbGlkZSA9IHRoaXMuc3RhdGUuc2xpZGVzLmZpbmQoeCA9PiBlcXVhbENvb3JkaW5hdGVzKHRhcmdldCwgeC5jb29yZGluYXRlcykpO1xuICAgIH1cblxuICAgIGlmIChzbGlkZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1vZGVXaXRoRmFsbGJhY2s6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChtb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVXaXRoRmFsbGJhY2sgPSBtb2RlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5jdXJyZW50TW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlV2l0aEZhbGxiYWNrID0gdGhpcy5zdGF0ZS5jdXJyZW50TW9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZVdpdGhGYWxsYmFjayA9ICdzbGlkZSc7XG4gICAgfVxuXG4gICAgY29uc3QgbGluayA9IFsgYC8ke21vZGVXaXRoRmFsbGJhY2t9YCwgLi4uc2xpZGUuY29vcmRpbmF0ZXMgXTtcblxuICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShsaW5rLCB7IHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScgfSk7XG4gIH1cblxuICBuYXZpZ2F0ZVRvRmlyc3QocHJlZml4Pzogc3RyaW5nKSB7XG4gICAgdGhpcy5maXJzdFNsaWRlKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoc2xpZGUgPT4gdGhpcy5uYXZpZ2F0ZUFic29sdXRlKHNsaWRlLCBwcmVmaXgpKTtcbiAgfVxuXG4gIGZpcnN0U2xpZGUoKTogT2JzZXJ2YWJsZTxTbGlkZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zbGlkZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpLFxuICAgICAgICBmaWx0ZXIoc2xpZGVzID0+IHNsaWRlcy5sZW5ndGggPiAwKSxcbiAgICAgICAgbWFwKHNsaWRlcyA9PiBzbGlkZXNbMF0pXG4gICAgICApO1xuICB9XG5cbiAgaXNWYWxpZENvb3JkaW5hdGUoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGVzKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VudGF0aW9uLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zbGlkZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpLFxuICAgICAgICBmaWx0ZXIoc2xpZGVzID0+IHNsaWRlcy5sZW5ndGggPiAwKSxcbiAgICAgICAgbWFwKHNsaWRlcyA9PiBpc1ZhbGlkQ29vcmRpbmF0ZShzbGlkZXMsIGNvb3JkaW5hdGVzKSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvb3JkaW5hdGVzVG9TbGlkZShjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpOiBTbGlkZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc2xpZGVNYXBbY29vcmRpbmF0ZXMuam9pbignLicpXTtcbiAgfVxuXG4gIHNldEN1cnJlbnRNb2RlQW5kU2xpZGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpIHtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IHJvdXRlUGFyYW1zVG9Db29yZGluYXRlKHJvdXRlLnBhcmFtcyk7XG4gICAgY29uc3QgbW9kZTogTW9kZSA9IHJvdXRlLnVybFswXS5wYXRoIGFzIE1vZGU7XG4gICAgY29uc3Qgc2xpZGUgPSB0aGlzLmNvb3JkaW5hdGVzVG9TbGlkZShjb29yZGluYXRlcyk7XG5cbiAgICB0aGlzLmNvbW1hbmRzLnNldEN1cnJlbnRTbGlkZShzbGlkZSk7XG4gICAgdGhpcy5jb21tYW5kcy5zZXRDdXJyZW50TW9kZShtb2RlKTtc