UNPKG

@davvidess/angular-split

Version:

Angular UI library to split views and allow dragging to resize areas using CSS flexbox layout.

316 lines 29.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @param {?} event * @return {?} */ export function getPointFromEvent(event) { // TouchEvent if (((/** @type {?} */ (event))).changedTouches !== undefined && ((/** @type {?} */ (event))).changedTouches.length > 0) { return { x: ((/** @type {?} */ (event))).changedTouches[0].clientX, y: ((/** @type {?} */ (event))).changedTouches[0].clientY, }; } // MouseEvent else if (((/** @type {?} */ (event))).clientX !== undefined && ((/** @type {?} */ (event))).clientY !== undefined) { return { x: ((/** @type {?} */ (event))).clientX, y: ((/** @type {?} */ (event))).clientY, }; } return null; } /** * @param {?} elRef * @param {?} direction * @return {?} */ export function getElementPixelSize(elRef, direction) { /** @type {?} */ const rect = ((/** @type {?} */ (elRef.nativeElement))).getBoundingClientRect(); return direction === 'horizontal' ? rect.width : rect.height; } /** * @param {?} v * @return {?} */ export function getInputBoolean(v) { return typeof v === 'boolean' ? v : v === 'false' ? false : true; } /** * @template T * @param {?} v * @param {?} defaultValue * @return {?} */ export function getInputPositiveNumber(v, defaultValue) { if (v === null || v === undefined) return defaultValue; v = Number(v); return !isNaN(v) && v >= 0 ? v : defaultValue; } /** * @param {?} unit * @param {?} sizes * @return {?} */ export function isUserSizesValid(unit, sizes) { // All sizes have to be not null and total should be 100 if (unit === 'percent') { /** @type {?} */ const total = sizes.reduce((/** * @param {?} total * @param {?} s * @return {?} */ (total, s) => (s !== null ? total + s : total)), 0); return sizes.every((/** * @param {?} s * @return {?} */ (s) => s !== null)) && total > 99.9 && total < 100.1; } // A size at null is mandatory but only one. if (unit === 'pixel') { return sizes.filter((/** * @param {?} s * @return {?} */ (s) => s === null)).length === 1; } } /** * @param {?} a * @return {?} */ export function getAreaMinSize(a) { if (a.size === null) { return null; } if (a.component.lockSize === true) { return a.size; } if (a.component.minSize === null) { return null; } if (a.component.minSize > a.size) { return a.size; } return a.component.minSize; } /** * @param {?} a * @return {?} */ export function getAreaMaxSize(a) { if (a.size === null) { return null; } if (a.component.lockSize === true) { return a.size; } if (a.component.maxSize === null) { return null; } if (a.component.maxSize < a.size) { return a.size; } return a.component.maxSize; } /** * @param {?} unit * @param {?} sideAreas * @param {?} pixels * @param {?} allAreasSizePixel * @return {?} */ export function getGutterSideAbsorptionCapacity(unit, sideAreas, pixels, allAreasSizePixel) { return sideAreas.reduce((/** * @param {?} acc * @param {?} area * @return {?} */ (acc, area) => { /** @type {?} */ const res = getAreaAbsorptionCapacity(unit, area, acc.remain, allAreasSizePixel); acc.list.push(res); acc.remain = res.pixelRemain; return acc; }), { remain: pixels, list: [] }); } /** * @param {?} unit * @param {?} areaSnapshot * @param {?} pixels * @param {?} allAreasSizePixel * @return {?} */ function getAreaAbsorptionCapacity(unit, areaSnapshot, pixels, allAreasSizePixel) { // No pain no gain if (pixels === 0) { return { areaSnapshot, pixelAbsorb: 0, percentAfterAbsorption: areaSnapshot.sizePercentAtStart, pixelRemain: 0, }; } // Area start at zero and need to be reduced, not possible if (areaSnapshot.sizePixelAtStart === 0 && pixels < 0) { return { areaSnapshot, pixelAbsorb: 0, percentAfterAbsorption: 0, pixelRemain: pixels, }; } if (unit === 'percent') { return getAreaAbsorptionCapacityPercent(areaSnapshot, pixels, allAreasSizePixel); } if (unit === 'pixel') { return getAreaAbsorptionCapacityPixel(areaSnapshot, pixels, allAreasSizePixel); } } /** * @param {?} areaSnapshot * @param {?} pixels * @param {?} allAreasSizePixel * @return {?} */ function getAreaAbsorptionCapacityPercent(areaSnapshot, pixels, allAreasSizePixel) { /** @type {?} */ const tempPixelSize = areaSnapshot.sizePixelAtStart + pixels; /** @type {?} */ const tempPercentSize = (tempPixelSize / allAreasSizePixel) * 100 // ENLARGE AREA ; // ENLARGE AREA if (pixels > 0) { // If maxSize & newSize bigger than it > absorb to max and return remaining pixels if (areaSnapshot.area.maxSize !== null && tempPercentSize > areaSnapshot.area.maxSize) { // Use area.area.maxSize as newPercentSize and return calculate pixels remaining /** @type {?} */ const maxSizePixel = (areaSnapshot.area.maxSize / 100) * allAreasSizePixel; return { areaSnapshot, pixelAbsorb: maxSizePixel, percentAfterAbsorption: areaSnapshot.area.maxSize, pixelRemain: areaSnapshot.sizePixelAtStart + pixels - maxSizePixel, }; } return { areaSnapshot, pixelAbsorb: pixels, percentAfterAbsorption: tempPercentSize > 100 ? 100 : tempPercentSize, pixelRemain: 0, }; } // REDUCE AREA else if (pixels < 0) { // If minSize & newSize smaller than it > absorb to min and return remaining pixels if (areaSnapshot.area.minSize !== null && tempPercentSize < areaSnapshot.area.minSize) { // Use area.area.minSize as newPercentSize and return calculate pixels remaining /** @type {?} */ const minSizePixel = (areaSnapshot.area.minSize / 100) * allAreasSizePixel; return { areaSnapshot, pixelAbsorb: minSizePixel, percentAfterAbsorption: areaSnapshot.area.minSize, pixelRemain: areaSnapshot.sizePixelAtStart + pixels - minSizePixel, }; } // If reduced under zero > return remaining pixels else if (tempPercentSize < 0) { // Use 0 as newPercentSize and return calculate pixels remaining return { areaSnapshot, pixelAbsorb: -areaSnapshot.sizePixelAtStart, percentAfterAbsorption: 0, pixelRemain: pixels + areaSnapshot.sizePixelAtStart, }; } return { areaSnapshot, pixelAbsorb: pixels, percentAfterAbsorption: tempPercentSize, pixelRemain: 0, }; } } /** * @param {?} areaSnapshot * @param {?} pixels * @param {?} containerSizePixel * @return {?} */ function getAreaAbsorptionCapacityPixel(areaSnapshot, pixels, containerSizePixel) { /** @type {?} */ const tempPixelSize = areaSnapshot.sizePixelAtStart + pixels // ENLARGE AREA ; // ENLARGE AREA if (pixels > 0) { // If maxSize & newSize bigger than it > absorb to max and return remaining pixels if (areaSnapshot.area.maxSize !== null && tempPixelSize > areaSnapshot.area.maxSize) { return { areaSnapshot, pixelAbsorb: areaSnapshot.area.maxSize - areaSnapshot.sizePixelAtStart, percentAfterAbsorption: -1, pixelRemain: tempPixelSize - areaSnapshot.area.maxSize, }; } return { areaSnapshot, pixelAbsorb: pixels, percentAfterAbsorption: -1, pixelRemain: 0, }; } // REDUCE AREA else if (pixels < 0) { // If minSize & newSize smaller than it > absorb to min and return remaining pixels if (areaSnapshot.area.minSize !== null && tempPixelSize < areaSnapshot.area.minSize) { return { areaSnapshot, pixelAbsorb: areaSnapshot.area.minSize + pixels - tempPixelSize, percentAfterAbsorption: -1, pixelRemain: tempPixelSize - areaSnapshot.area.minSize, }; } // If reduced under zero > return remaining pixels else if (tempPixelSize < 0) { return { areaSnapshot, pixelAbsorb: -areaSnapshot.sizePixelAtStart, percentAfterAbsorption: -1, pixelRemain: pixels + areaSnapshot.sizePixelAtStart, }; } return { areaSnapshot, pixelAbsorb: pixels, percentAfterAbsorption: -1, pixelRemain: 0, }; } } /** * @param {?} unit * @param {?} item * @return {?} */ export function updateAreaSize(unit, item) { if (unit === 'percent') { item.areaSnapshot.area.size = item.percentAfterAbsorption; } else if (unit === 'pixel') { // Update size except for the wildcard size area if (item.areaSnapshot.area.size !== null) { item.areaSnapshot.area.size = item.areaSnapshot.sizePixelAtStart + item.pixelAbsorb; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF2dmlkZXNzL2FuZ3VsYXItc3BsaXQvIiwic291cmNlcyI6WyJsaWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFJQSxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBOEI7SUFDOUQsYUFBYTtJQUNiLElBQUksQ0FBQyxtQkFBWSxLQUFLLEVBQUEsQ0FBQyxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksQ0FBQyxtQkFBWSxLQUFLLEVBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3JHLE9BQU87WUFDTCxDQUFDLEVBQUUsQ0FBQyxtQkFBWSxLQUFLLEVBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ2hELENBQUMsRUFBRSxDQUFDLG1CQUFZLEtBQUssRUFBQSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87U0FDakQsQ0FBQTtLQUNGO0lBQ0QsYUFBYTtTQUNSLElBQUksQ0FBQyxtQkFBWSxLQUFLLEVBQUEsQ0FBQyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxtQkFBWSxLQUFLLEVBQUEsQ0FBQyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7UUFDL0YsT0FBTztZQUNMLENBQUMsRUFBRSxDQUFDLG1CQUFZLEtBQUssRUFBQSxDQUFDLENBQUMsT0FBTztZQUM5QixDQUFDLEVBQUUsQ0FBQyxtQkFBWSxLQUFLLEVBQUEsQ0FBQyxDQUFDLE9BQU87U0FDL0IsQ0FBQTtLQUNGO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDOzs7Ozs7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBaUIsRUFBRSxTQUFvQzs7VUFDbkYsSUFBSSxHQUFHLENBQUMsbUJBQWEsS0FBSyxDQUFDLGFBQWEsRUFBQSxDQUFDLENBQUMscUJBQXFCLEVBQUU7SUFFdkUsT0FBTyxTQUFTLEtB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LHNCQUFzQixFQUFFLENBQUMsQ0FBQztZQUMxQixXQUFXLEVBQUUsQ0FBQztTQUNmLENBQUE7S0FDRjtBQUNILENBQUM7Ozs7OztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBeUIsRUFBRSxJQUE2QjtJQUNyRixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQTtLQUMxRDtTQUFNLElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRTtRQUMzQixnREFBZ0Q7UUFDaEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUE7U0FDcEY7S0FDRjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcblxuaW1wb3J0IHsgSUFyZWEsIElQb2ludCwgSUFyZWFTbmFwc2hvdCwgSVNwbGl0U2lkZUFic29ycHRpb25DYXBhY2l0eSwgSUFyZWFBYnNvcnB0aW9uQ2FwYWNpdHkgfSBmcm9tICcuL2ludGVyZmFjZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvaW50RnJvbUV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IElQb2ludCB7XG4gIC8vIFRvdWNoRXZlbnRcbiAgaWYgKCg8VG91Y2hFdmVudD5ldmVudCkuY2hhbmdlZFRvdWNoZXMgIT09IHVuZGVmaW5lZCAmJiAoPFRvdWNoRXZlbnQ+ZXZlbnQpLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogKDxUb3VjaEV2ZW50PmV2ZW50KS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgeTogKDxUb3VjaEV2ZW50PmV2ZW50KS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZLFxuICAgIH1cbiAgfVxuICAvLyBNb3VzZUV2ZW50XG4gIGVsc2UgaWYgKCg8TW91c2VFdmVudD5ldmVudCkuY2xpZW50WCAhPT0gdW5kZWZpbmVkICYmICg8TW91c2VFdmVudD5ldmVudCkuY2xpZW50WSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICg8TW91c2VFdmVudD5ldmVudCkuY2xpZW50WCxcbiAgICAgIHk6ICg8TW91c2VFdmVudD5ldmVudCkuY2xpZW50WSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRQaXhlbFNpemUoZWxSZWY6IEVsZW1lbnRSZWYsIGRpcmVjdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJyk6IG51bWJlciB7XG4gIGNvbnN0IHJlY3QgPSAoPEhUTUxFbGVtZW50PmVsUmVmLm5hdGl2ZUVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gcmVjdC53aWR0aCA6IHJlY3QuaGVpZ2h0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnB1dEJvb2xlYW4odjogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nID8gdiA6IHYgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldElucHV0UG9zaXRpdmVOdW1iZXI8VD4odjogYW55LCBkZWZhdWx0VmFsdWU6IFQpOiBudW1iZXIgfCBUIHtcbiAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlXG5cbiAgdiA9IE51bWJlcih2KVxuICByZXR1cm4gIWlzTmFOKHYpICYmIHYgPj0gMCA/IHYgOiBkZWZhdWx0VmFsdWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXNlclNpemVzVmFsaWQodW5pdDogJ3BlcmNlbnQnIHwgJ3BpeGVsJywgc2l6ZXM6IEFycmF5PG51bWJlciB8IG51bGw+KTogYm9vbGVhbiB7XG4gIC8vIEFsbCBzaXplcyBoYXZlIHRvIGJlIG5vdCBudWxsIGFuZCB0b3RhbCBzaG91bGQgYmUgMTAwXG4gIGlmICh1bml0ID09PSAncGVyY2VudCcpIHtcbiAgICBjb25zdCB0b3RhbCA9IHNpemVzLnJlZHVjZSgodG90YWwsIHMpID0+IChzICE9PSBudWxsID8gdG90YWwgKyBzIDogdG90YWwpLCAwKVxuICAgIHJldHVybiBzaXplcy5ldmVyeSgocykgPT4gcyAhPT0gbnVsbCkgJiYgdG90YWwgPiA5OS45ICYmIHRvdGFsIDwgMTAwLjFcbiAgfVxuXG4gIC8vIEEgc2l6ZSBhdCBudWxsIGlzIG1hbmRhdG9yeSBidXQgb25seSBvbmUuXG4gIGlmICh1bml0ID09PSAncGl4ZWwnKSB7XG4gICAgcmV0dXJuIHNpemVzLmZpbHRlcigocykgPT4gcyA9PT0gbnVsbCkubGVuZ3RoID09PSAxXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFyZWFNaW5TaXplKGE6IElBcmVhKTogbnVsbCB8IG51bWJlciB7XG4gIGlmIChhLnNpemUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKGEuY29tcG9uZW50LmxvY2tTaXplID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGEuc2l6ZVxuICB9XG5cbiAgaWYgKGEuY29tcG9uZW50Lm1pblNpemUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKGEuY29tcG9uZW50Lm1pblNpemUgPiBhLnNpemUpIHtcbiAgICByZXR1cm4gYS5zaXplXG4gIH1cblxuICByZXR1cm4gYS5jb21wb25lbnQubWluU2l6ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJlYU1heFNpemUoYTogSUFyZWEpOiBudWxsIHwgbnVtYmVyIHtcbiAgaWYgKGEuc2l6ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAoYS5jb21wb25lbnQubG9ja1NpemUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gYS5zaXplXG4gIH1cblxuICBpZiAoYS5jb21wb25lbnQubWF4U2l6ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAoYS5jb21wb25lbnQubWF4U2l6ZSA8IGEuc2l6ZSkge1xuICAgIHJldHVybiBhLnNpemVcbiAgfVxuXG4gIHJldHVybiBhLmNvbXBvbmVudC5tYXhTaXplXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHdXR0ZXJTaWRlQWJzb3JwdGlvbkNhcGFjaXR5KFxuICB1bml0OiAncGVyY2VudCcgfCAncGl4ZWwnLFxuICBzaWRlQXJlYXM6IEFycmF5PElBcmVhU25hcHNob3Q+LFxuICBwaXhlbHM6IG51bWJlcixcbiAgYWxsQXJlYXNTaXplUGl4ZWw6IG51bWJlcixcbik6IElTcGxpdFNpZGVBYnNvcnB0aW9uQ2FwYWNpdHkge1xuICByZXR1cm4gc2lkZUFyZWFzLnJlZHVjZShcbiAgICAoYWNjLCBhcmVhKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBnZXRBcmVhQWJzb3JwdGlvbkNhcGFjaXR5KHVuaXQsIGFyZWEsIGFjYy5yZW1haW4sIGFsbEFyZWFzU2l6ZVBpeGVsKVxuICAgICAgYWNjLmxpc3QucHVzaChyZXMpXG4gICAgICBhY2MucmVtYWluID0gcmVzLnBpeGVsUmVtYWluXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSxcbiAgICB7IHJlbWFpbjogcGl4ZWxzLCBsaXN0OiBbXSB9LFxuICApXG59XG5cbmZ1bmN0aW9uIGdldEFyZWFBYnNvcnB0aW9uQ2FwYWNpdHkoXG4gIHVuaXQ6ICdwZXJjZW50JyB8ICdwaXhlbCcsXG4gIGFyZWFTbmFwc2hvdDogSUFyZWFTbmFwc2hvdCxcbiAgcGl4ZWxzOiBudW1iZXIsXG4gIGFsbEFyZWFzU2l6ZVBpeGVsOiBudW1iZXIsXG4pOiBJQXJlYUFic29ycHRpb25DYXBhY2l0eSB7XG4gIC8vIE5vIHBhaW4gbm8gZ2FpblxuICBpZiAocGl4ZWxzID09PSAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZWFTbmFwc2hvdCxcbiAgICAgIHBpeGVsQWJzb3JiOiAwLFxuICAgICAgcGVyY2VudEFmdGVyQWJzb3JwdGlvbjogYXJlYVNuYXBzaG90LnNpemVQZXJjZW50QXRTdGFydCxcbiAgICAgIHBpeGVsUmVtYWluOiAwLFxuICAgIH1cbiAgfVxuXG4gIC8vIEFyZWEgc3RhcnQgYXQgemVybyBhbmQgbmVlZCB0byBiZSByZWR1Y2VkLCBub3QgcG9zc2libGVcbiAgaWYgKGFyZWFTbmFwc2hvdC5zaXplUGl4ZWxBdFN0YXJ0ID09PSAwICYmIHBpeGVscyA8IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXJlYVNuYXBzaG90LFxuICAgICAgcGl4ZWxBYnNvcmI6IDAsXG4gICAgICBwZXJjZW50QWZ0ZXJBYnNvcnB0aW9uOiAwLFxuICAgICAgcGl4ZWxSZW1haW46IHBpeGVscyxcbiAgICB9XG4gIH1cblxuICBpZiAodW5pdCA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgcmV0dXJuIGdldEFyZWFBYnNvcnB0aW9uQ2FwYWNpdHlQZXJjZW50KGFyZWFTbmFwc2hvdCwgcGl4ZWxzLCBhbGxBcmVhc1NpemVQaXhlbClcbiAgfVxuXG4gIGlmICh1bml0ID09PSAncGl4ZWwnKSB7XG4gICAgcmV0dXJuIGdldEFyZWFBYnNvcnB0aW9uQ2FwYWNpdHlQaXhlbChhcmVhU25hcHNob3QsIHBpeGVscywgYWxsQXJlYXNTaXplUGl4ZWwpXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QXJlYUFic29ycHRpb25DYXBhY2l0eVBlcmNlbnQoXG4gIGFyZWFTbmFwc2hvdDogSUFyZWFTbmFwc2hvdCxcbiAgcGl4ZWxzOiBudW1iZXIsXG4gIGFsbEFyZWFzU2l6ZVBpeGVsOiBudW1iZXIsXG4pOiBJQXJlYUFic29ycHRpb25DYXBhY2l0eSB7XG4gIGNvbnN0IHRlbXBQaXhlbFNpemUgPSBhcmVhU25hcHNob3Quc2l6ZVBpeGVsQXRTdGFydCArIHBpeGVsc1xuICBjb25zdCB0ZW1wUGVyY2VudFNpemUgPSAodGVtcFBpeGVsU2l6ZSAvIGFsbEFyZWFzU2l6ZVBpeGVsKSAqIDEwMFxuXG4gIC8vIEVOTEFSR0UgQVJFQVxuXG4gIGlmIChwaXhlbHMgPiAwKSB7XG4gICAgLy8gSWYgbWF4U2l6ZSAmIG5ld1NpemUgYmlnZ2VyIHRoYW4gaXQgPiBhYnNvcmIgdG8gbWF4IGFuZCByZXR1cm4gcmVtYWluaW5nIHBpeGVsc1xuICAgIGlmIChhcmVhU25hcHNob3QuYXJlYS5tYXhTaXplICE9PSBudWxsICYmIHRlbXBQZXJjZW50U2l6ZSA+IGFyZWFTbmFwc2hvdC5hcmVhLm1heFNpemUpIHtcbiAgICAgIC8vIFVzZSBhcmVhLmFyZWEubWF4U2l6ZSBhcyBuZXdQZXJjZW50U2l6ZSBhbmQgcmV0dXJuIGNhbGN1bGF0ZSBwaXhlbHMgcmVtYWluaW5nXG4gICAgICBjb25zdCBtYXhTaXplUGl4ZWwgPSAoYXJlYVNuYXBzaG90LmFyZWEubWF4U2l6ZSAvIDEwMCkgKiBhbGxBcmVhc1NpemVQaXhlbFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJlYVNuYXBzaG90LFxuICAgICAgICBwaXhlbEFic29yYjogbWF4U2l6ZVBpeGVsLFxuICAgICAgICBwZXJjZW50QWZ0ZXJBYnNvcnB0aW9uOiBhcmVhU25hcHNob3QuYXJlYS5tYXhTaXplLFxuICAgICAgICBwaXhlbFJlbWFpbjogYXJlYVNuYXBzaG90LnNpemVQaXhlbEF0U3RhcnQgKyBwaXhlbHMgLSBtYXhTaXplUGl4ZWwsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhcmVhU25hcHNob3QsXG4gICAgICBwaXhlbEFic29yYjogcGl4ZWxzLFxuICAgICAgcGVyY2VudEFmdGVyQWJzb3JwdGlvbjogdGVtcFBlcmNlbnRTaXplID4gMTAwID8gMTAwIDogdGVtcFBlcmNlbnRTaXplLFxuICAgICAgcGl4ZWxSZW1haW46IDAsXG4gICAgfVxuICB9XG5cbiAgLy8gUkVEVUNFIEFSRUFcbiAgZWxzZSBpZiAocGl4ZWxzIDwgMCkge1xuICAgIC8vIElmIG1pblNpemUgJiBuZXdTaXplIHNtYWxsZXIgdGhhbiBpdCA+IGFic29yYiB0byBtaW4gYW5kIHJldHVybiByZW1haW5pbmcgcGl4ZWxzXG4gICAgaWYgKGFyZWFTbmFwc2hvdC5hcmVhLm1pblNpemUgIT09IG51bGwgJiYgdGVtcFBlcmNlbnRTaXplIDwgYXJlYVNuYXBzaG90LmFyZWEubWluU2l6ZSkge1xuICAgICAgLy8gVXNlIGFyZWEuYXJlYS5taW5TaXplIGFzIG5ld1BlcmNlbnRTaXplIGFuZCByZXR1cm4gY2FsY3VsYXRlIHBpeGVscyByZW1haW5pbmdcbiAgICAgIGNvbnN0IG1pblNpemVQaXhlbCA9IChhcmVhU25hcHNob3QuYXJlYS5taW5TaXplIC8gMTAwKSAqIGFsbEFyZWFzU2l6ZVBpeGVsXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmVhU25hcHNob3QsXG4gICAgICAgIHBpeGVsQWJzb3JiOiBtaW5TaXplUGl4ZWwsXG4gICAgICAgIHBlcmNlbnRBZnRlckFic29ycHRpb246IGFyZWFTbmFwc2hvdC5hcmVhLm1pblNpemUsXG4gICAgICAgIHBpeGVsUmVtYWluOiBhcmVhU25hcHNob3Quc2l6ZVBpeGVsQXRTdGFydCArIHBpeGVscyAtIG1pblNpemVQaXhlbCxcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgcmVkdWNlZCB1bmRlciB6ZXJvID4gcmV0dXJuIHJlbWFpbmluZyBwaXhlbHNcbiAgICBlbHNlIGlmICh0ZW1wUGVyY2VudFNpemUgPCAwKSB7XG4gICAgICAvLyBVc2UgMCBhcyBuZXdQZXJjZW50U2l6ZSBhbmQgcmV0dXJuIGNhbGN1bGF0ZSBwaXhlbHMgcmVtYWluaW5nXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmVhU25hcHNob3QsXG4gICAgICAgIHBpeGVsQWJzb3JiOiAtYXJlYVNuYXBzaG90LnNpemVQaXhlbEF0U3RhcnQsXG4gICAgICAgIHBlcmNlbnRBZnRlckFic29ycHRpb246IDAsXG4gICAgICAgIHBpeGVsUmVtYWluOiBwaXhlbHMgKyBhcmVhU25hcHNob3Quc2l6ZVBpeGVsQXRTdGFydCxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZWFTbmFwc2hvdCxcbiAgICAgIHBpeGVsQWJzb3JiOiBwaXhlbHMsXG4gICAgICBwZXJjZW50QWZ0ZXJBYnNvcnB0aW9uOiB0ZW1wUGVyY2VudFNpemUsXG4gICAgICBwaXhlbFJlbWFpbjogMCxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QXJlYUFic29ycHRpb25DYXBhY2l0eVBpeGVsKFxuICBhcmVhU25hcHNob3Q6IElBcmVhU25hcHNob3QsXG4gIHBpeGVsczogbnVtYmVyLFxuICBjb250YWluZXJTaXplUGl4ZWw6IG51bWJlcixcbik6IElBcmVhQWJzb3JwdGlvbkNhcGFjaXR5IHtcbiAgY29uc3QgdGVtcFBpeGVsU2l6ZSA9IGFyZWFTbmFwc2hvdC5zaXplUGl4ZWxBdFN0YXJ0ICsgcGl4ZWxzXG5cbiAgLy8gRU5MQVJHRSBBUkVBXG5cbiAgaWYgKHBpeGVscyA+IDApIHtcbiAgICAvLyBJZiBtYXhTaXplICYgbmV3U2l6ZSBiaWdnZXIgdGhhbiBpdCA+IGFic29yYiB0byBtYXggYW5kIHJldHVybiByZW1haW5pbmcgcGl4ZWxzXG4gICAgaWYgKGFyZWFTbmFwc2hvdC5hcmVhLm1heFNpemUgIT09IG51bGwgJiYgdGVtcFBpeGVsU2l6ZSA+IGFyZWFTbmFwc2hvdC5hcmVhLm1heFNpemUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFyZWFTbmFwc2hvdCxcbiAgICAgICAgcGl4ZWxBYnNvcmI6IGFyZWFTbmFwc2hvdC5hcmVhLm1heFNpemUgLSBhcmVhU25hcHNob3Quc2l6ZVBpeGVsQXRTdGFydCxcbiAgICAgICAgcGVyY2VudEFmdGVyQWJzb3JwdGlvbjogLTEsXG4gICAgICAgIHBpeGVsUmVtYWluOiB0ZW1wUGl4ZWxTaXplIC0gYXJlYVNuYXBzaG90LmFyZWEubWF4U2l6ZSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZWFTbmFwc2hvdCxcbiAgICAgIHBpeGVsQWJzb3JiOiBwaXhlbHMsXG4gICAgICBwZXJjZW50QWZ0ZXJBYnNvcnB0aW9uOiAtMSxcbiAgICAgIHBpeGVsUmVtYWluOiAwLFxuICAgIH1cbiAgfVxuXG4gIC8vIFJFRFVDRSBBUkVBXG4gIGVsc2UgaWYgKHBpeGVscyA8IDApIHtcbiAgICAvLyBJZiBtaW5TaXplICYgbmV3U2l6ZSBzbWFsbGVyIHRoYW4gaXQgPiBhYnNvcmIgdG8gbWluIGFuZCByZXR1cm4gcmVtYWluaW5nIHBpeGVsc1xuICAgIGlmIChhcmVhU25hcHNob3QuYXJlYS5taW5TaXplICE9PSBudWxsICYmIHRlbXBQaXhlbFNpemUgPCBhcmVhU25hcHNob3QuYXJlYS5taW5TaXplKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmVhU25hcHNob3QsXG4gICAgICAgIHBpeGVsQWJzb3JiOiBhcmVhU25hcHNob3QuYXJlYS5taW5TaXplICsgcGl4ZWxzIC0gdGVtcFBpeGVsU2l6ZSxcbiAgICAgICAgcGVyY2VudEFmdGVyQWJzb3JwdGlvbjogLTEsXG4gICAgICAgIHBpeGVsUmVtYWluOiB0ZW1wUGl4ZWxTaXplIC0gYXJlYVNuYXBzaG90LmFyZWEubWluU2l6ZSxcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgcmVkdWNlZCB1bmRlciB6ZXJvID4gcmV0dXJuIHJlbWFpbmluZyBwaXhlbHNcbiAgICBlbHNlIGlmICh0ZW1wUGl4ZWxTaXplIDwgMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXJlYVNuYXBzaG90LFxuICAgICAgICBwaXhlbEFic29yYjogLWFyZWFTbmFwc2hvdC5zaXplUGl4ZWxBdFN0YXJ0LFxuICAgICAgICBwZXJjZW50QWZ0ZXJBYnNvcnB0aW9uOiAtMSxcbiAgICAgICAgcGl4ZWxSZW1haW46IHBpeGVscyArIGFyZWFTbmFwc2hvdC5zaXplUGl4ZWxBdFN0YXJ0LFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYXJlYVNuYXBzaG90LFxuICAgICAgcGl4ZWxBYnNvcmI6IHBpeGVscyxcbiAgICAgIHBlcmNlbnRBZnRlckFic29ycHRpb246IC0xLFxuICAgICAgcGl4ZWxSZW1haW46IDAsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcmVhU2l6ZSh1bml0OiAncGVyY2VudCcgfCAncGl4ZWwnLCBpdGVtOiBJQXJlYUFic29ycHRpb25DYXBhY2l0eSkge1xuICBpZiAodW5pdCA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgaXRlbS5hcmVhU25hcHNob3QuYXJlYS5zaXplID0gaXRlbS5wZXJjZW50QWZ0ZXJBYnNvcnB0aW9uXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3BpeGVsJykge1xuICAgIC8vIFVwZGF0ZSBzaXplIGV4Y2VwdCBmb3IgdGhlIHdpbGRjYXJkIHNpemUgYXJlYVxuICAgIGlmIChpdGVtLmFyZWFTbmFwc2hvdC5hcmVhLnNpemUgIT09IG51bGwpIHtcbiAgICAgIGl0ZW0uYXJlYVNuYXBzaG90LmFyZWEuc2l6ZSA9IGl0ZW0uYXJlYVNuYXBzaG90LnNpemVQaXhlbEF0U3RhcnQgKyBpdGVtLnBpeGVsQWJzb3JiXG4gICAgfVxuICB9XG59XG4iXX0=