@w11k/ngx-present
Version:
Angular based Presentation Tool
236 lines • 19.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/slide-by-slide/slide-by-slide.functions.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { max, min } from '../core/utils';
/**
* @param {?} slides
* @param {?} currentSlide
* @param {?} move
* @param {?} coordinatesToKeep
* @param {?} coordinatesMaxDepth
* @return {?}
*/
export function calculateCoordinates(slides, currentSlide, move, coordinatesToKeep, coordinatesMaxDepth) {
if (move === 0) {
return currentSlide;
}
if (coordinatesToKeep === undefined) {
return slides[currentSlide.index + move];
}
/** @type {?} */
const currentCoordinates = currentSlide.coordinates;
/** @type {?} */
const coordinatesToKeepAbs = coordinatesToKeepAbsolute(currentCoordinates, coordinatesToKeep);
/** @type {?} */
const newCoordinates = currentCoordinates.slice(0, coordinatesToKeepAbs);
if (move > 0 && coordinatesToKeepAbs < currentCoordinates.length) {
newCoordinates.push(currentCoordinates[coordinatesToKeepAbs] + move);
}
else if (move > 0) {
newCoordinates.push(move);
}
else if (move < 0 && currentCoordinates[coordinatesToKeepAbs + 1] !== undefined && currentCoordinates[coordinatesToKeepAbs + 1] > 1) {
newCoordinates.push(currentCoordinates[coordinatesToKeepAbs] + move + 1);
}
else if (move < 0 && coordinatesToKeepAbs < currentCoordinates.length) {
newCoordinates.push(max(1, currentCoordinates[coordinatesToKeepAbs] + move));
}
else if (move < 0) {
newCoordinates.push(1);
}
if (move < 0) {
while (newCoordinates.length <= coordinatesMaxDepth) {
newCoordinates.push(1);
}
}
/** @type {?} */
let arrayToSearchIn;
if (move >= 0) {
arrayToSearchIn = slides.slice(currentSlide.index + 1);
}
else {
arrayToSearchIn = slides.slice(0, currentSlide.index).reverse();
}
/** @type {?} */
const nextSlide = arrayToSearchIn.find((/**
* @param {?} slide
* @return {?}
*/
slide => {
/** @type {?} */
const compared = compareCoordinates(slide.coordinates, newCoordinates);
if (move < 0) {
return compared <= 0;
}
else {
return compared >= 0;
}
}));
return nextSlide;
}
/**
* @param {?} coordinates
* @param {?} coordinatesToKeepRelative
* @return {?}
*/
export function coordinatesToKeepAbsolute(coordinates, coordinatesToKeepRelative) {
if (coordinatesToKeepRelative >= 0) {
return min(coordinatesToKeepRelative, coordinates.length);
}
return max(coordinates.length + coordinatesToKeepRelative, 0);
}
/** @type {?} */
export const routerParamsCoordinatePrefix = 'coordinate-';
/**
* @param {?} routeParams
* @return {?}
*/
export function routeParamsToCoordinate(routeParams) {
/** @type {?} */
const keys = Object.keys(routeParams);
/** @type {?} */
const coordinates = keys
.filter((/**
* @param {?} key
* @return {?}
*/
key => key.startsWith(routerParamsCoordinatePrefix)))
.map((/**
* @param {?} key
* @return {?}
*/
key => {
/** @type {?} */
const keyNumber = parseInt(key.substr(routerParamsCoordinatePrefix.length), 10);
return { key, keyNumber };
}))
.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => compareNumber(a.keyNumber, b.keyNumber)))
.map((/**
* @param {?} key
* @return {?}
*/
key => parseInt(routeParams[key.key], 10)));
return coordinates;
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function compareNumber(a, b) {
if (a !== undefined && b === undefined) {
return 1;
}
if (a === undefined && b !== undefined) {
return -1;
}
if (a === undefined && b === undefined) {
return 0;
}
if (a !== undefined && b !== undefined && a > b) {
return 1;
}
if (a !== undefined && b !== undefined && a < b) {
return -1;
}
return 0;
}
/**
* @param {?} c1
* @param {?} c2
* @return {?}
*/
export function equalCoordinates(c1, c2) {
return compareCoordinates(c1, c2) === 0;
}
/**
* @param {?} c1
* @param {?} c2
* @return {?}
*/
export function compareCoordinates(c1, c2) {
if (c1 === c2) {
return 0;
}
if (c1 === null || c1 === undefined) {
return -1;
}
if (c2 === null || c2 === undefined) {
return 1;
}
/** @type {?} */
const maxLength = max(c1.length, c2.length);
for (let i = 0; i < maxLength; i++) {
/** @type {?} */
const c1i = c1[i];
/** @type {?} */
const c2i = c2[i];
/** @type {?} */
const iResult = compareNumber(c1i, c2i);
if (iResult !== 0) {
return iResult;
}
}
return 0;
}
/**
* @param {?} slides
* @param {?} coordinates
* @return {?}
*/
export function isValidCoordinate(slides, coordinates) {
if (coordinates.length === 0) {
return false;
}
/** @type {?} */
let current = slides;
for (const coordinate of coordinates) {
/** @type {?} */
const tooLow = coordinate < 1;
/** @type {?} */
const tooHigh = Array.isArray(current) && coordinate - 1 >= current.length;
if (tooLow || tooHigh) {
return false;
}
/** @type {?} */
const next = current[coordinate - 1];
if (Array.isArray(next)) {
current = next;
}
else {
current = [];
}
}
return true;
}
/**
* @param {?} coordinates
* @param {?} separator
* @param {?=} length
* @return {?}
*/
export function coordinatesToString(coordinates, separator, length) {
return coordinates.slice(0, length).join(separator);
}
/**
* @param {?} slides
* @return {?}
*/
export function coordinateToSlideMap(slides) {
/** @type {?} */
const map = {};
for (const slide of slides) {
/** @type {?} */
const index = coordinatesToString(slide.coordinates, '.');
map[index] = slide;
}
return map;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtYnktc2xpZGUuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHcxMWsvbmd4LXByZXNlbnQvIiwic291cmNlcyI6WyJsaWIvc2xpZGUtYnktc2xpZGUvc2xpZGUtYnktc2xpZGUuZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQUV6QyxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBZSxFQUNmLFlBQW1CLEVBQ25CLElBQVksRUFDWixpQkFBcUMsRUFDckMsbUJBQTJCO0lBQzlELElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNkLE9BQU8sWUFBWSxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7UUFDbkMsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztLQUMxQzs7VUFFSyxrQkFBa0IsR0FBRyxZQUFZLENBQUMsV0FBVzs7VUFFN0Msb0JBQW9CLEdBQVcseUJBQXlCLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7O1VBRS9GLGNBQWMsR0FBZ0Isa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQztJQUVyRixJQUFJLElBQUksR0FBRyxDQUFDLElBQUksb0JBQW9CLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFO1FBQ2hFLGNBQWMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUN0RTtTQUFNLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtRQUNuQixjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzNCO1NBQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxL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RCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsV0FBd0IsRUFBRSxTQUFpQixFQUFFLE1BQWU7SUFDOUYsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEQsQ0FBQzs7Ozs7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBZTs7VUFDNUMsR0FBRyxHQUE2QixFQUFFO0lBRXhDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFOztjQUNwQixLQUFLLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUM7UUFDekQsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztLQUNwQjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvb3JkaW5hdGVzLCBTbGlkZSwgU2xpZGVzIH0gZnJvbSAnLi4vY29yZS9wcmVzZW50YXRpb24udHlwZXMnO1xuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb29yZGluYXRlcyhzbGlkZXM6IFNsaWRlW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNsaWRlOiBTbGlkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXNUb0tlZXA6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlc01heERlcHRoOiBudW1iZXIpOiBTbGlkZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChtb3ZlID09PSAwKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRTbGlkZTtcbiAgfVxuXG4gIGlmIChjb29yZGluYXRlc1RvS2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHNsaWRlc1tjdXJyZW50U2xpZGUuaW5kZXggKyBtb3ZlXTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRDb29yZGluYXRlcyA9IGN1cnJlbnRTbGlkZS5jb29yZGluYXRlcztcblxuICBjb25zdCBjb29yZGluYXRlc1RvS2VlcEFiczogbnVtYmVyID0gY29vcmRpbmF0ZXNUb0tlZXBBYnNvbHV0ZShjdXJyZW50Q29vcmRpbmF0ZXMsIGNvb3JkaW5hdGVzVG9LZWVwKTtcblxuICBjb25zdCBuZXdDb29yZGluYXRlczogQ29vcmRpbmF0ZXMgPSBjdXJyZW50Q29vcmRpbmF0ZXMuc2xpY2UoMCwgY29vcmRpbmF0ZXNUb0tlZXBBYnMpO1xuXG4gIGlmIChtb3ZlID4gMCAmJiBjb29yZGluYXRlc1RvS2VlcEFicyA8IGN1cnJlbnRDb29yZGluYXRlcy5sZW5ndGgpIHtcbiAgICBuZXdDb29yZGluYXRlcy5wdXNoKGN1cnJlbnRDb29yZGluYXRlc1tjb29yZGluYXRlc1RvS2VlcEFic10gKyBtb3ZlKTtcbiAgfSBlbHNlIGlmIChtb3ZlID4gMCkge1xuICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2gobW92ZSk7XG4gIH0gZWxzZSBpZiAobW92ZSA8IDAgJiYgY3VycmVudENvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzVG9LZWVwQWJzICsgMV0gIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q29vcmRpbmF0ZXNbY29vcmRpbmF0ZXNUb0tlZXBBYnMgKyAxXSA+IDEpIHtcbiAgICBuZXdDb29yZGluYXRlcy5wdXNoKGN1cnJlbnRDb29yZGluYXRlc1tjb29yZGluYXRlc1RvS2VlcEFic10gKyBtb3ZlICsgMSk7XG4gIH0gZWxzZSBpZiAobW92ZSA8IDAgJiYgY29vcmRpbmF0ZXNUb0tlZXBBYnMgPCBjdXJyZW50Q29vcmRpbmF0ZXMubGVuZ3RoKSB7XG4gICAgbmV3Q29vcmRpbmF0ZXMucHVzaChtYXgoMSwgY3VycmVudENvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzVG9LZWVwQWJzXSArIG1vdmUpKTtcbiAgfSBlbHNlIGlmIChtb3ZlIDwgMCkge1xuICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2goMSk7XG4gIH1cblxuICBpZiAobW92ZSA8IDApIHtcbiAgICB3aGlsZSAobmV3Q29vcmRpbmF0ZXMubGVuZ3RoIDw9IGNvb3JkaW5hdGVzTWF4RGVwdGgpIHtcbiAgICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2goMSk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGFycmF5VG9TZWFyY2hJbjogU2xpZGVbXTtcbiAgaWYgKG1vdmUgPj0gMCkge1xuICAgIGFycmF5VG9TZWFyY2hJbiA9IHNsaWRlcy5zbGljZShjdXJyZW50U2xpZGUuaW5kZXggKyAxKTtcbiAgfSBlbHNlIHtcbiAgICBhcnJheVRvU2VhcmNoSW4gPSBzbGlkZXMuc2xpY2UoMCwgY3VycmVudFNsaWRlLmluZGV4KS5yZXZlcnNlKCk7XG4gIH1cblxuICBjb25zdCBuZXh0U2xpZGUgPSBhcnJheVRvU2VhcmNoSW4uZmluZChzbGlkZSA9PiB7XG4gICAgY29uc3QgY29tcGFyZWQgPSBjb21wYXJlQ29vcmRpbmF0ZXMoc2xpZGUuY29vcmRpbmF0ZXMsIG5ld0Nvb3JkaW5hdGVzKTtcblxuICAgIGlmIChtb3ZlIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVkIDw9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjb21wYXJlZCA+PSAwO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5leHRTbGlkZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkaW5hdGVzVG9LZWVwQWJzb2x1dGUoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGVzLCBjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoY29vcmRpbmF0ZXNUb0tlZXBSZWxhdGl2ZSA+PSAwKSB7XG4gICAgcmV0dXJuIG1pbihjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlLCBjb29yZGluYXRlcy5sZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG1heChjb29yZGluYXRlcy5sZW5ndGggKyBjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlLCAwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJvdXRlclBhcmFtc0Nvb3JkaW5hdGVQcmVmaXggPSAnY29vcmRpbmF0ZS0nO1xuXG5leHBvcnQgZnVuY3Rpb24gcm91dGVQYXJhbXNUb0Nvb3JkaW5hdGUocm91dGVQYXJhbXM6IFBhcmFtcyk6IG51bWJlcltdIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJvdXRlUGFyYW1zKTtcblxuICBjb25zdCBjb29yZGluYXRlcyA9IGtleXNcbiAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aChyb3V0ZXJQYXJhbXNDb29yZGluYXRlUHJlZml4KSlcbiAgICAubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCBrZXlOdW1iZXIgPSBwYXJzZUludChrZXkuc3Vic3RyKHJvdXRlclBhcmFtc0Nvb3JkaW5hdGVQcmVmaXgubGVuZ3RoKSwgMTApO1xuXG4gICAgICByZXR1cm4geyBrZXksIGtleU51bWJlciB9O1xuICAgIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IGNvbXBhcmVOdW1iZXIoYS5rZXlOdW1iZXIsIGIua2V5TnVtYmVyKSlcbiAgICAubWFwKGtleSA9PiBwYXJzZUludChyb3V0ZVBhcmFtc1trZXkua2V5XSwgMTApKTtcblxuICByZXR1cm4gY29vcmRpbmF0ZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXIoYTogbnVtYmVyIHwgdW5kZWZpbmVkLCBiOiBudW1iZXIgfCB1bmRlZmluZWQpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEgIT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhICE9PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkICYmIGEgPiBiKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoYSAhPT0gdW5kZWZpbmVkICYmIGIgIT09IHVuZGVmaW5lZCAmJiBhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxDb29yZGluYXRlcyhjMTogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkLCBjMjogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wYXJlQ29vcmRpbmF0ZXMoYzEsIGMyKSA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVDb29yZGluYXRlcyhjMTogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkLCBjMjogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkKTogLTEgfCAwIHwgMSB7XG4gIGlmIChjMSA9PT0gYzIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChjMSA9PT0gbnVsbCB8fMKgYzEgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG5cbiAgaWYgKGMyID09PSBudWxsIHx8wqBjMiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBtYXhMZW5ndGggPSBtYXgoYzEubGVuZ3RoLCBjMi5sZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4TGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjMWkgPSBjMVtpXTtcbiAgICBjb25zdCBjMmkgPSBjMltpXTtcblxuICAgIGNvbnN0IGlSZXN1bHQgPSBjb21wYXJlTnVtYmVyKGMxaSwgYzJpKTtcblxuICAgIGlmIChpUmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gaVJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDb29yZGluYXRlKHNsaWRlczogU2xpZGVzLCBjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpOiBib29sZWFuIHtcbiAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBjdXJyZW50OiBSZWN1cnNpdmVBcnJheTxTbGlkZT4gPSBzbGlkZXM7XG5cbiAgZm9yIChjb25zdCBjb29yZGluYXRlIG9mIGNvb3JkaW5hdGVzKSB7XG4gICAgY29uc3QgdG9vTG93ID0gY29vcmRpbmF0ZSA8IDE7XG4gICAgY29uc3QgdG9vSGlnaCA9IEFycmF5LmlzQXJyYXkoY3VycmVudCkgJiYgY29vcmRpbmF0ZSAtIDEgPj0gY3VycmVudC5sZW5ndGg7XG5cbiAgICBpZiAodG9vTG93IHx8IHRvb0hpZ2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0ID0gY3VycmVudFtjb29yZGluYXRlIC0gMV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAgIGN1cnJlbnQgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50ID0gW107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb29yZGluYXRlc1RvU3RyaW5nKGNvb3JkaW5hdGVzOiBDb29yZGluYXRlcywgc2VwYXJhdG9yOiBzdHJpbmcsIGxlbmd0aD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBjb29yZGluYXRlcy5zbGljZSgwLCBsZW5ndGgpLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkaW5hdGVUb1NsaWRlTWFwKHNsaWRlczogU2xpZGVbXSk6IHsgW2tleTogc3RyaW5nXTogU2xpZGUgfSB7XG4gIGNvbnN0IG1hcDogeyBba2V5OiBzdHJpbmddOiBTbGlkZSB9ID0ge307XG5cbiAgZm9yIChjb25zdCBzbGlkZSBvZiBzbGlkZXMpIHtcbiAgICBjb25zdCBpbmRleCA9IGNvb3JkaW5hdGVzVG9TdHJpbmcoc2xpZGUuY29vcmRpbmF0ZXMsICcuJyk7XG4gICAgbWFwW2luZGV4XSA9IHNsaWRlO1xuICB9XG5cbiAgcmV0dXJuIG1hcDtcbn1cbiJdfQ==