UNPKG

@pepperi/lib

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.1.

318 lines 39.5 kB
const FLOAT_REGEX = /^\d+(\.\d+)?$/; const THREE_DIGIT_HEX_COLOR_REGEX = /^[0-9a-fA-F]{3}$/; const THREE_DIGIT_HEX_COLOR_WITH_HASH_REGEX = /^#[0-9a-fA-F]{3}$/; const SIX_DIGIT_HEX_COLOR_REGEX = /^[0-9a-fA-F]{6}$/; const SIX_DIGIT_HEX_COLOR_WITH_HASH_REGEX = /^#[0-9a-fA-F]{6}$/; /** * Convert hex string to 6 digits hex string. * @param str The string to convert. */ export function hex2sixDigitHex(str) { if (!str) { return null; } str = str.trim(); if (SIX_DIGIT_HEX_COLOR_WITH_HASH_REGEX.test(str)) { return str; } if (SIX_DIGIT_HEX_COLOR_REGEX.test(str)) { return '#' + str; } if (THREE_DIGIT_HEX_COLOR_WITH_HASH_REGEX.test(str)) { return '#' + str[1] + str[1] + str[2] + str[2] + str[3] + str[3]; } if (THREE_DIGIT_HEX_COLOR_REGEX.test(str)) { return '#' + str[0] + str[0] + str[1] + str[1] + str[2] + str[2]; } return null; } /** * Convert rgb color to 6 digits hex string. * @param color The rgb color to convert. */ export function rgb2sixDigitHex(color) { color.r = color.r.toString(16); color.g = color.g.toString(16); color.b = color.b.toString(16); if (color.r.length === 1) { color.r = '0' + color.r; } if (color.g.length === 1) { color.g = '0' + color.g; } if (color.b.length === 1) { color.b = '0' + color.b; } return '#' + color.r + color.g + color.b; } /** * Convert hex string to rgb color. * @param str The hex string to convert. */ export function hex2rgb(str) { const sixDigitHex = hex2sixDigitHex(str); if (sixDigitHex === null) { return null; } return { r: parseInt(sixDigitHex.slice(1, 3), 16), g: parseInt(sixDigitHex.slice(3, 5), 16), b: parseInt(sixDigitHex.slice(5, 7), 16) }; } export function rgbString2hsl(str) { const sep = str.indexOf(',') > -1 ? ',' : ' '; const rgbArr = str.substr(4).split(')')[0].split(sep); const r = rgbArr[0]; const g = rgbArr[1].substr(0, rgbArr[1].length).trim(); const b = rgbArr[2].substr(0, rgbArr[2].length).trim(); return rgb2hsl({ r, g, b }); } export function rgb2hsl({ r, g, b }) { r /= 255; g /= 255; b /= 255; // Find greatest and smallest channel values const cmin = Math.min(r, g, b); const cmax = Math.max(r, g, b); const delta = cmax - cmin; let h = 0; let s = 0; let l = 0; if (delta === 0) { h = 0; } else if (cmax === r) { h = ((g - b) / delta) % 6; } else if (cmax === g) { h = (b - r) / delta + 2; } else { h = (r - g) / delta + 4; } h = Math.round(h * 60); if (h < 0) { h += 360; } l = (cmax + cmin) / 2; s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1)); s = +(s * 100).toFixed(1); l = +(l * 100).toFixed(1); return { h, s, l }; } export function hslString2hsl(str) { const sep = str.indexOf(',') > -1 ? ',' : ' '; const hslArr = str.substr(4).split(')')[0].split(sep); let h = hslArr[0]; let s = hslArr[1].substr(0, hslArr[1].length).trim(); let l = hslArr[2].substr(0, hslArr[2].length).trim(); // Strip label and convert to degrees (if necessary) if (h.indexOf('deg') > -1) { h = h.substr(0, h.length - 3); } else if (h.indexOf('rad') > -1) { h = Math.round(h.substr(0, h.length - 3) * (180 / Math.PI)); } else if (h.indexOf('turn') > -1) { h = Math.round(h.substr(0, h.length - 4) * 360); } // Keep hue fraction of 360 if ending up over if (h >= 360) { h %= 360; } // Remove the % if (s.indexOf('%') > -1) { s = s.replace(/%/g, ''); } // Remove the % if (l.indexOf('%') > -1) { l = l.replace(/%/g, ''); } return { h, s, l }; } export function hsl2rgb({ h, s, l }) { let r; let g; let b; if (!isFinite(h)) { h = 0; } if (!isFinite(s)) { s = 0; } if (!isFinite(l)) { l = 0; } h /= 60; if (h < 0) { h = 6 - (-h % 6); } h %= 6; s = Math.max(0, Math.min(1, s / 100)); l = Math.max(0, Math.min(1, l / 100)); const c = (1 - Math.abs((2 * l) - 1)) * s; const x = c * (1 - Math.abs((h % 2) - 1)); if (h < 1) { r = c; g = x; b = 0; } else if (h < 2) { r = x; g = c; b = 0; } else if (h < 3) { r = 0; g = c; b = x; } else if (h < 4) { r = 0; g = x; b = c; } else if (h < 5) { r = x; g = 0; b = c; } else { r = c; g = 0; b = x; } const m = l - c / 2; r = Math.round((r + m) * 255); g = Math.round((g + m) * 255); b = Math.round((b + m) * 255); return { r, g, b }; } export function hex2hsl(str) { const sixDigitHex = hex2sixDigitHex(str); if (sixDigitHex === null) { return null; } const rgb = hex2rgb(sixDigitHex); if (rgb === null) { return null; } return rgb2hsl(rgb); } export function hsl2hex(hsl) { const rgb = hsl2rgb(hsl); return rgb2sixDigitHex(rgb); } export function relativeLuminance({ r, g, b }) { [r, g, b] = [r, g, b].map(c => { c = c / 255; if (c <= 0.03928) { return c / 12.92; } return Math.pow((c + 0.055) / 1.055, 2.4); }); return 0.2126 * r + 0.7152 * g + 0.0722 * b; } export function contrast(str1, str2) { const L1 = relativeLuminance(hex2rgb(str1)); const L2 = relativeLuminance(hex2rgb(str2)); if (L1 < L2) { return (L2 + 0.05) / (L1 + 0.05); } return (L1 + 0.05) / (L2 + 0.05); } export function findClosestAccessibleDarkerColor(adjustableColor, otherColor, contrastRatio) { let { h, s, l } = hex2hsl(adjustableColor); if (contrast(adjustableColor, otherColor) >= contrastRatio) { return { color: adjustableColor, lightness: l }; } let minColor = hsl2hex({ h, s, l: 0 }); if (contrast(minColor, otherColor) < contrastRatio) { return null; } let min = 0; let max = l; let maxColor = hsl2hex({ h, s, l }); let lastMinColor; let lastMaxColor; while (minColor !== lastMinColor || maxColor !== lastMaxColor) { lastMinColor = minColor; lastMaxColor = maxColor; l = (min + max) / 2; adjustableColor = hsl2hex({ h, s, l }); if (contrast(adjustableColor, otherColor) < contrastRatio) { max = l; maxColor = hsl2hex({ h, s, l }); } else { min = l; minColor = hsl2hex({ h, s, l }); } } return { color: minColor, lightness: min }; } export function findClosestAccessibleLighterColor(adjustableColor, otherColor, contrastRatio) { let { h, s, l } = hex2hsl(adjustableColor); if (contrast(adjustableColor, otherColor) >= contrastRatio) { return { color: adjustableColor, lightness: l }; } let maxColor = hsl2hex({ h, s, l: 100 }); if (contrast(maxColor, otherColor) < contrastRatio) { return null; } let min = l; let max = 100; let minColor = hsl2hex({ h, s, l }); let lastMinColor; let lastMaxColor; while (minColor !== lastMinColor || maxColor !== lastMaxColor) { lastMinColor = minColor; lastMaxColor = maxColor; l = (min + max) / 2; adjustableColor = hsl2hex({ h, s, l }); if (contrast(adjustableColor, otherColor) < contrastRatio) { min = l; minColor = hsl2hex({ h, s, l }); } else { max = l; maxColor = hsl2hex({ h, s, l }); } } return { color: maxColor, lightness: max }; } export function findClosestAccessibleColor(adjustableColor, otherColor, contrastRatio) { const closestDarkerColor = findClosestAccessibleDarkerColor(adjustableColor, otherColor, contrastRatio); const closestLighterColor = findClosestAccessibleLighterColor(adjustableColor, otherColor, contrastRatio); if (closestDarkerColor === null) { if (closestLighterColor === null) { return null; } return closestLighterColor.color; } if (closestLighterColor === null) { return closestDarkerColor.color; } const { l } = hex2hsl(adjustableColor); if (closestLighterColor.lightness - l < l - closestDarkerColor.lightness) { return closestLighterColor.color; } return closestDarkerColor.color; } export function convertHslToStringHsl(hsl) { return 'hsl(' + (hsl.h < 0 ? hsl.h + 360 : hsl.h) + ', ' + hsl.s + '%, ' + hsl.l + '%)'; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wZXBwZXJpLWxpYi9jb2xvci9jb2xvci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUM7QUFDcEMsTUFBTSwyQkFBMkIsR0FBRyxrQkFBa0IsQ0FBQztBQUN2RCxNQUFNLHFDQUFxQyxHQUFHLG1CQUFtQixDQUFDO0FBQ2xFLE1BQU0seUJBQXlCLEdBQUcsa0JBQWtCLENBQUM7QUFDckQsTUFBTSxtQ0FBbUMsR0FBRyxtQkFBbUIsQ0FBQztBQW1CaEU7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFXO0lBQ3ZDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDTixPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVqQixJQUFJLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUMvQyxPQUFPLEdBQUcsQ0FBQztLQUNkO0lBRUQsSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDckMsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDO0tBQ3BCO0lBRUQsSUFBSSxxQ0FBcUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDakQsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEU7SUFFRCxJQUFJLDJCQUEyQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN2QyxPQUFPLEdBQUcsR0FBRyxH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QUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV0QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ1AsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ1Q7U0FBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDVDtTQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNkLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNUO1NBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2QsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ1Q7U0FBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDVDtTQUFNO1FBQ0gsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFD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a0IsQ0FBQyxLQUFLLENBQUM7QUFDcEMsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxHQUFhO0lBQy9DLE9BQU8sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBGTE9BVF9SRUdFWCA9IC9eXFxkKyhcXC5cXGQrKT8kLztcclxuY29uc3QgVEhSRUVfRElHSVRfSEVYX0NPTE9SX1JFR0VYID0gL15bMC05YS1mQS1GXXszfSQvO1xyXG5jb25zdCBUSFJFRV9ESUdJVF9IRVhfQ09MT1JfV0lUSF9IQVNIX1JFR0VYID0gL14jWzAtOWEtZkEtRl17M30kLztcclxuY29uc3QgU0lYX0RJR0lUX0hFWF9DT0xPUl9SRUdFWCA9IC9eWzAtOWEtZkEtRl17Nn0kLztcclxuY29uc3QgU0lYX0RJR0lUX0hFWF9DT0xPUl9XSVRIX0hBU0hfUkVHRVggPSAvXiNbMC05YS1mQS1GXXs2fSQvO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZ2JDb2xvciB7XHJcbiAgICByPzogYW55O1xyXG4gICAgZz86IGFueTtcclxuICAgIGI/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSHNsQ29sb3Ige1xyXG4gICAgaD86IGFueTtcclxuICAgIHM/OiBhbnk7XHJcbiAgICBsPzogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENsb3Nlc3RDb2xvciB7XHJcbiAgICBjb2xvcjogc3RyaW5nO1xyXG4gICAgbGlnaHRuZXNzOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IGhleCBzdHJpbmcgdG8gNiBkaWdpdHMgaGV4IHN0cmluZy5cclxuICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaGV4MnNpeERpZ2l0SGV4KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RyID0gc3RyLnRyaW0oKTtcclxuXHJcbiAgICBpZiAoU0lYX0RJR0lUX0hFWF9DT0xPUl9XSVRIX0hBU0hfUkVHRVgudGVzdChzdHIpKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoU0lYX0RJR0lUX0hFWF9DT0xPUl9SRUdFWC50ZXN0KHN0cikpIHtcclxuICAgICAgICByZXR1cm4gJyMnICsgc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChUSFJFRV9ESUdJVF9IRVhfQ09MT1JfV0lUSF9IQVNIX1JFR0VYLnRlc3Qoc3RyKSkge1xyXG4gICAgICAgIHJldHVybiAnIycgKyBzdHJbMV0gKyBzdHJbMV0gKyBzdHJbMl0gKyBzdHJbMl0gKyBzdHJbM10gKyBzdHJbM107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFRIUkVFX0RJR0lUX0hFWF9DT0xPUl9SRUdFWC50ZXN0KHN0cikpIHtcclxuICAgICAgICByZXR1cm4gJyMnICsgc3RyWzBdICsgc3RyWzBdICsgc3RyWzFdICsgc3RyWzFdICsgc3RyWzJdICsgc3RyWzJdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCByZ2IgY29sb3IgdG8gNiBkaWdpdHMgaGV4IHN0cmluZy5cclxuICogQHBhcmFtIGNvbG9yIFRoZSByZ2IgY29sb3IgdG8gY29udmVydC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZ2Iyc2l4RGlnaXRIZXgoY29sb3I6IFJnYkNvbG9yKTogc3RyaW5nIHtcclxuICAgIGNvbG9yLnIgPSBjb2xvci5yLnRvU3RyaW5nKDE2KTtcclxuICAgIGNvbG9yLmcgPSBjb2xvci5nLnRvU3RyaW5nKDE2KTtcclxuICAgIGNvbG9yLmIgPSBjb2xvci5iLnRvU3RyaW5nKDE2KTtcclxuXHJcbiAgICBpZiAoY29sb3Iuci5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICBjb2xvci5yID0gJzAnICsgY29sb3IucjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sb3IuZy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICBjb2xvci5nID0gJzAnICsgY29sb3IuZztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sb3IuYi5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICBjb2xvci5iID0gJzAnICsgY29sb3IuYjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJyMnICsgY29sb3IuciArIGNvbG9yLmcgKyBjb2xvci5iO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBoZXggc3RyaW5nIHRvIHJnYiBjb2xvci5cclxuICogQHBhcmFtIHN0ciBUaGUgaGV4IHN0cmluZyB0byBjb252ZXJ0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhleDJyZ2Ioc3RyOiBzdHJpbmcpOiBSZ2JDb2xvciB7XHJcbiAgICBjb25zdCBzaXhEaWdpdEhleCA9IGhleDJzaXhEaWdpdEhleChzdHIpO1xyXG5cclxuICAgIGlmIChzaXhEaWdpdEhleCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcjogcGFyc2VJbnQoc2l4RGlnaXRIZXguc2xpY2UoMSwgMyksIDE2KSxcclxuICAgICAgICBnOiBwYXJzZUludChzaXhEaWdpdEhleC5zbGljZSgzLCA1KSwgMTYpLFxyXG4gICAgICAgIGI6IHBhcnNlSW50KHNpeERpZ2l0SGV4LnNsaWNlKDUsIDcpLCAxNilcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZ2JTdHJpbmcyaHNsKHN0cjogc3RyaW5nKTogSHNsQ29sb3Ige1xyXG4gICAgY29uc3Qgc2VwID0gc3RyLmluZGV4T2YoJywnKSA+IC0xID8gJywnIDogJyAnO1xyXG4gICAgY29uc3QgcmdiQXJyID0gc3RyLnN1YnN0cig0KS5zcGxpdCgnKScpWzBdLnNwbGl0KHNlcCk7XHJcblxyXG4gICAgY29uc3QgciA9IHJnYkFyclswXTtcclxuICAgIGNvbnN0IGcgPSByZ2JBcnJbMV0uc3Vic3RyKDAsIHJnYkFyclsxXS5sZW5ndGgpLnRyaW0oKTtcclxuICAgIGNvbnN0IGIgPSByZ2JBcnJbMl0uc3Vic3RyKDAsIHJnYkFyclsyXS5sZW5ndGgpLnRyaW0oKTtcclxuXHJcbiAgICByZXR1cm4gcmdiMmhzbCh7IHIsIGcsIGIgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZ2IyaHNsKHsgciwgZywgYiB9OiBSZ2JDb2xvcik6IEhzbENvbG9yIHtcclxuICAgIHIgLz0gMjU1O1xyXG4gICAgZyAvPSAyNTU7XHJcbiAgICBiIC89IDI1NTtcclxuXHJcbiAgICAvLyBGaW5kIGdyZWF0ZXN0IGFuZCBzbWFsbGVzdCBjaGFubmVsIHZhbHVlc1xyXG4gICAgY29uc3QgY21pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xyXG4gICAgY29uc3QgY21heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xyXG4gICAgY29uc3QgZGVsdGEgPSBjbWF4IC0gY21pbjtcclxuXHJcbiAgICBsZXQgaCA9IDA7XHJcbiAgICBsZXQgcyA9IDA7XHJcbiAgICBsZXQgbCA9IDA7XHJcblxyXG4gICAgaWYgKGRlbHRhID09PSAwKSB7XHJcbiAgICAgICAgaCA9IDA7XHJcbiAgICB9IGVsc2UgaWYgKGNtYXggPT09IHIpIHtcclxuICAgICAgICBoID0gKChnIC0gYikgLyBkZWx0YSkgJSA2O1xyXG4gICAgfSBlbHNlIGlmIChjbWF4ID09PSBnKSB7XHJcbiAgICAgICAgaCA9IChiIC0gcikgLyBkZWx0YSArIDI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGggPSAociAtIGcpIC8gZGVsdGEgKyA0O1xyXG4gICAgfVxyXG5cclxuICAgIGggPSBNYXRoLnJvdW5kKGggKiA2MCk7XHJcblxyXG4gICAgaWYgKGggPCAwKSB7XHJcbiAgICAgICAgaCArPSAzNjA7XHJcbiAgICB9XHJcblxyXG4gICAgbCA9IChjbWF4ICsgY21pbikgLyAyO1xyXG4gICAgcyA9IGRlbHRhID09PSAwID8gMCA6IGRlbHRhIC8gKDEgLSBNYXRoLmFicygyICogbCAtIDEpKTtcclxuICAgIHMgPSArKHMgKiAxMDApLnRvRml4ZWQoMSk7XHJcbiAgICBsID0gKyhsICogMTAwKS50b0ZpeGVkKDEpO1xyXG5cclxuICAgIHJldHVybiB7IGgsIHMsIGwgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhzbFN0cmluZzJoc2woc3RyOiBzdHJpbmcpOiBIc2xDb2xvciB7XHJcbiAgICBjb25zdCBzZXAgPSBzdHIuaW5kZXhPZignLCcpID4gLTEgPyAnLCcgOiAnICc7XHJcbiAgICBjb25zdCBoc2xBcnIgPSBzdHIuc3Vic3RyKDQpLnNwbGl0KCcpJylbMF0uc3BsaXQoc2VwKTtcclxuXHJcbiAgICBsZXQgaDogYW55ID0gaHNsQXJyWzBdO1xyXG4gICAgbGV0IHMgPSBoc2xBcnJbMV0uc3Vic3RyKDAsIGhzbEFyclsxXS5sZW5ndGgpLnRyaW0oKTtcclxuICAgIGxldCBsID0gaHNsQXJyWzJdLnN1YnN0cigwLCBoc2xBcnJbMl0ubGVuZ3RoKS50cmltKCk7XHJcblxyXG4gICAgLy8gU3RyaXAgbGFiZWwgYW5kIGNvbnZlcnQgdG8gZGVncmVlcyAoaWYgbmVjZXNzYXJ5KVxyXG4gICAgaWYgKGguaW5kZXhPZignZGVnJykgPiAtMSkge1xyXG4gICAgICAgIGggPSBoLnN1YnN0cigwLCBoLmxlbmd0aCAtIDMpO1xyXG4gICAgfSBlbHNlIGlmIChoLmluZGV4T2YoJ3JhZCcpID4gLTEpIHtcclxuICAgICAgICBoID0gTWF0aC5yb3VuZChoLnN1YnN0cigwLCBoLmxlbmd0aCAtIDMpICogKDE4MCAvIE1hdGguUEkpKTtcclxuICAgIH0gZWxzZSBpZiAoaC5pbmRleE9mKCd0dXJuJykgPiAtMSkge1xyXG4gICAgICAgIGggPSBNYXRoLnJvdW5kKGguc3Vic3RyKDAsIGgubGVuZ3RoIC0gNCkgKiAzNjApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEtlZXAgaHVlIGZyYWN0aW9uIG9mIDM2MCBpZiBlbmRpbmcgdXAgb3ZlclxyXG4gICAgaWYgKGggPj0gMzYwKSB7XHJcbiAgICAgICAgaCAlPSAzNjA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIHRoZSAlXHJcbiAgICBpZiAocy5pbmRleE9mKCclJykgPiAtMSkge1xyXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoLyUvZywgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbW92ZSB0aGUgJVxyXG4gICAgaWYgKGwuaW5kZXhPZignJScpID4gLTEpIHtcclxuICAgICAgICBsID0gbC5yZXBsYWNlKC8lL2csICcnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBoLCBzLCBsIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoc2wycmdiKHsgaCwgcywgbCB9OiBIc2xDb2xvcik6IFJnYkNvbG9yIHtcclxuICAgIGxldCByO1xyXG4gICAgbGV0IGc7XHJcbiAgICBsZXQgYjtcclxuXHJcbiAgICBpZiAoIWlzRmluaXRlKGgpKSB7XHJcbiAgICAgICAgaCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc0Zpbml0ZShzKSkge1xyXG4gICAgICAgIHMgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXNGaW5pdGUobCkpIHtcclxuICAgICAgICBsID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBoIC89IDYwO1xyXG5cclxuICAgIGlmIChoIDwgMCkge1xyXG4gICAgICAgIGggPSA2IC0gKC1oICUgNik7XHJcbiAgICB9XHJcblxyXG4gICAgaCAlPSA2O1xyXG5cclxuICAgIHMgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBzIC8gMTAwKSk7XHJcbiAgICBsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgbCAvIDEwMCkpO1xyXG5cclxuICAgIGNvbnN0IGMgPSAoMSAtIE1hdGguYWJzKCgyICogbCkgLSAxKSkgKiBzO1xyXG4gICAgY29uc3QgeCA9IGMgKiAoMSAtIE1hdGguYWJzKChoICUgMikgLSAxKSk7XHJcblxyXG4gICAgaWYgKGggPCAxKSB7XHJcbiAgICAgICAgciA9IGM7XHJcbiAgICAgICAgZyA9IHg7XHJcbiAgICAgICAgYiA9IDA7XHJcbiAgICB9IGVsc2UgaWYgKGggPCAyKSB7XHJcbiAgICAgICAgciA9IHg7XHJcbiAgICAgICAgZyA9IGM7XHJcbiAgICAgICAgYiA9IDA7XHJcbiAgICB9IGVsc2UgaWYgKGggPCAzKSB7XHJcbiAgICAgICAgciA9IDA7XHJcbiAgICAgICAgZyA9IGM7XHJcbiAgICAgICAgYiA9IHg7XHJcbiAgICB9IGVsc2UgaWYgKGggPCA0KSB7XHJcbiAgICAgICAgciA9IDA7XHJcbiAgICAgICAgZyA9IHg7XHJcbiAgICAgICAgYiA9IGM7XHJcbiAgICB9IGVsc2UgaWYgKGggPCA1KSB7XHJcbiAgICAgICAgciA9IHg7XHJcbiAgICAgICAgZyA9IDA7XHJcbiAgICAgICAgYiA9IGM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHIgPSBjO1xyXG4gICAgICAgIGcgPSAwO1xyXG4gICAgICAgIGIgPSB4O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG0gPSBsIC0gYyAvIDI7XHJcbiAgICByID0gTWF0aC5yb3VuZCgociArIG0pICogMjU1KTtcclxuICAgIGcgPSBNYXRoLnJvdW5kKChnICsgbSkgKiAyNTUpO1xyXG4gICAgYiA9IE1hdGgucm91bmQoKGIgKyBtKSAqIDI1NSk7XHJcblxyXG4gICAgcmV0dXJuIHsgciwgZywgYiB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGV4MmhzbChzdHI6IHN0cmluZyk6IEhzbENvbG9yIHtcclxuICAgIGNvbnN0IHNpeERpZ2l0SGV4ID0gaGV4MnNpeERpZ2l0SGV4KHN0cik7XHJcblxyXG4gICAgaWYgKHNpeERpZ2l0SGV4ID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmdiID0gaGV4MnJnYihzaXhEaWdpdEhleCk7XHJcblxyXG4gICAgaWYgKHJnYiA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZ2IyaHNsKHJnYik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoc2wyaGV4KGhzbDogSHNsQ29sb3IpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmdiID0gaHNsMnJnYihoc2wpO1xyXG5cclxuICAgIHJldHVybiByZ2Iyc2l4RGlnaXRIZXgocmdiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlKHsgciwgZywgYiB9OiBSZ2JDb2xvcik6IG51bWJlciB7XHJcbiAgICBbciwgZywgYl0gPSBbciwgZywgYl0ubWFwKGMgPT4ge1xyXG4gICAgICAgIGMgPSBjIC8gMjU1O1xyXG5cclxuICAgICAgICBpZiAoYyA8PSAwLjAzOTI4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjIC8gMTIuOTI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gTWF0aC5wb3coKGMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiAwLjIxMjYgKiByICsgMC43MTUyICogZyArIDAuMDcyMiAqIGI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb250cmFzdChzdHIxOiBzdHJpbmcsIHN0cjI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBMMSA9IHJlbGF0aXZlTHVtaW5hbmNlKGhleDJyZ2Ioc3RyMSkpO1xyXG4gICAgY29uc3QgTDIgPSByZWxhdGl2ZUx1bWluYW5jZShoZXgycmdiKHN0cjIpKTtcclxuXHJcbiAgICBpZiAoTDEgPCBMMikge1xyXG4gICAgICAgIHJldHVybiAoTDIgKyAwLjA1KSAvIChMMSArIDAuMDUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoTDEgKyAwLjA1KSAvIChMMiArIDAuMDUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZENsb3Nlc3RBY2Nlc3NpYmxlRGFya2VyQ29sb3IoXHJcbiAgICBhZGp1c3RhYmxlQ29sb3I6IHN0cmluZywgb3RoZXJDb2xvcjogc3RyaW5nLCBjb250cmFzdFJhdGlvOiBudW1iZXIpOiBDbG9zZXN0Q29sb3Ige1xyXG4gICAgbGV0IHsgaCwgcywgbCB9ID0gaGV4MmhzbChhZGp1c3RhYmxlQ29sb3IpO1xyXG5cclxuICAgIGlmIChjb250cmFzdChhZGp1c3RhYmxlQ29sb3IsIG90aGVyQ29sb3IpID49IGNvbnRyYXN0UmF0aW8pIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjb2xvcjogYWRqdXN0YWJsZUNvbG9yLFxyXG4gICAgICAgICAgICBsaWdodG5lc3M6IGxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtaW5Db2xvciA9IGhzbDJoZXgoeyBoLCBzLCBsOiAwIH0pO1xyXG5cclxuICAgIGlmIChjb250cmFzdChtaW5Db2xvciwgb3RoZXJDb2xvcikgPCBjb250cmFzdFJhdGlvKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1pbiA9IDA7XHJcbiAgICBsZXQgbWF4ID0gbDtcclxuICAgIGxldCBtYXhDb2xvciA9IGhzbDJoZXgoeyBoLCBzLCBsIH0pO1xyXG4gICAgbGV0IGxhc3RNaW5Db2xvcjtcclxuICAgIGxldCBsYXN0TWF4Q29sb3I7XHJcblxyXG4gICAgd2hpbGUgKG1pbkNvbG9yICE9PSBsYXN0TWluQ29sb3IgfHwgbWF4Q29sb3IgIT09IGxhc3RNYXhDb2xvcikge1xyXG4gICAgICAgIGxhc3RNaW5Db2xvciA9IG1pbkNvbG9yO1xyXG4gICAgICAgIGxhc3RNYXhDb2xvciA9IG1heENvbG9yO1xyXG5cclxuICAgICAgICBsID0gKG1pbiArIG1heCkgLyAyO1xyXG4gICAgICAgIGFkanVzdGFibGVDb2xvciA9IGhzbDJoZXgoeyBoLCBzLCBsIH0pO1xyXG5cclxuICAgICAgICBpZiAoY29udHJhc3QoYWRqdXN0YWJsZUNvbG9yLCBvdGhlckNvbG9yKSA8IGNvbnRyYXN0UmF0aW8pIHtcclxuICAgICAgICAgICAgbWF4ID0gbDtcclxuICAgICAgICAgICAgbWF4Q29sb3IgPSBoc2wyaGV4KHsgaCwgcywgbCB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtaW4gPSBsO1xyXG4gICAgICAgICAgICBtaW5Db2xvciA9IGhzbDJoZXgoeyBoLCBzLCBsIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNvbG9yOiBtaW5Db2xvcixcclxuICAgICAgICBsaWdodG5lc3M6IG1pblxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDbG9zZXN0QWNjZXNzaWJsZUxpZ2h0ZXJDb2xvcihcclxuICAgIGFkanVzdGFibGVDb2xvcjogc3RyaW5nLCBvdGhlckNvbG9yOiBzdHJpbmcsIGNvbnRyYXN0UmF0aW86IG51bWJlcik6IENsb3Nlc3RDb2xvciB7XHJcbiAgICBsZXQgeyBoLCBzLCBsIH0gPSBoZXgyaHNsKGFkanVzdGFibGVDb2xvcik7XHJcblxyXG4gICAgaWYgKGNvbnRyYXN0KGFkanVzdGFibGVDb2xvciwgb3RoZXJDb2xvcikgPj0gY29udHJhc3RSYXRpbykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbG9yOiBhZGp1c3RhYmxlQ29sb3IsXHJcbiAgICAgICAgICAgIGxpZ2h0bmVzczogbFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1heENvbG9yID0gaHNsMmhleCh7IGgsIHMsIGw6IDEwMCB9KTtcclxuXHJcbiAgICBpZiAoY29udHJhc3QobWF4Q29sb3IsIG90aGVyQ29sb3IpIDwgY29udHJhc3RSYXRpbykge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtaW4gPSBsO1xyXG4gICAgbGV0IG1heCA9IDEwMDtcclxuICAgIGxldCBtaW5Db2xvciA9IGhzbDJoZXgoeyBoLCBzLCBsIH0pO1xyXG4gICAgbGV0IGxhc3RNaW5Db2xvcjtcclxuICAgIGxldCBsYXN0TWF4Q29sb3I7XHJcblxyXG4gICAgd2hpbGUgKG1pbkNvbG9yICE9PSBsYXN0TWluQ29sb3IgfHwgbWF4Q29sb3IgIT09IGxhc3RNYXhDb2xvcikge1xyXG4gICAgICAgIGxhc3RNaW5Db2xvciA9IG1pbkNvbG9yO1xyXG4gICAgICAgIGxhc3RNYXhDb2xvciA9IG1heENvbG9yO1xyXG5cclxuICAgICAgICBsID0gKG1pbiArIG1heCkgLyAyO1xyXG4gICAgICAgIGFkanVzdGFibGVDb2xvciA9IGhzbDJoZXgoeyBoLCBzLCBsIH0pO1xyXG5cclxuICAgICAgICBpZiAoY29udHJhc3QoYWRqdXN0YWJsZUNvbG9yLCBvdGhlckNvbG9yKSA8IGNvbnRyYXN0UmF0aW8pIHtcclxuICAgICAgICAgICAgbWluID0gbDtcclxuICAgICAgICAgICAgbWluQ29sb3IgPSBoc2wyaGV4KHsgaCwgcywgbCB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXggPSBsO1xyXG4gICAgICAgICAgICBtYXhDb2xvciA9IGhzbDJoZXgoeyBoLCBzLCBsIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNvbG9yOiBtYXhDb2xvcixcclxuICAgICAgICBsaWdodG5lc3M6IG1heFxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDbG9zZXN0QWNjZXNzaWJsZUNvbG9yKFxyXG4gICAgYWRqdXN0YWJsZUNvbG9yOiBzdHJpbmcsIG90aGVyQ29sb3I6IHN0cmluZywgY29udHJhc3RSYXRpbzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNsb3Nlc3REYXJrZXJDb2xvcjogQ2xvc2VzdENvbG9yID1cclxuICAgICAgICBmaW5kQ2xvc2VzdEFjY2Vzc2libGVEYXJrZXJDb2xvcihhZGp1c3RhYmxlQ29sb3IsIG90aGVyQ29sb3IsIGNvbnRyYXN0UmF0aW8pO1xyXG4gICAgY29uc3QgY2xvc2VzdExpZ2h0ZXJDb2xvcjogQ2xvc2VzdENvbG9yID1cclxuICAgICAgICBmaW5kQ2xvc2VzdEFjY2Vzc2libGVMaWdodGVyQ29sb3IoYWRqdXN0YWJsZUNvbG9yLCBvdGhlckNvbG9yLCBjb250cmFzdFJhdGlvKTtcclxuXHJcbiAgICBpZiAoY2xvc2VzdERhcmtlckNvbG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKGNsb3Nlc3RMaWdodGVyQ29sb3IgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2xvc2VzdExpZ2h0ZXJDb2xvci5jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2xvc2VzdExpZ2h0ZXJDb2xvciA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBjbG9zZXN0RGFya2VyQ29sb3IuY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyBsIH0gPSBoZXgyaHNsKGFkanVzdGFibGVDb2xvcik7XHJcblxyXG4gICAgaWYgKGNsb3Nlc3RMaWdodGVyQ29sb3IubGlnaHRuZXNzIC0gbCA8IGwgLSBjbG9zZXN0RGFya2VyQ29sb3IubGlnaHRuZXNzKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsb3Nlc3RMaWdodGVyQ29sb3IuY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsb3Nlc3REYXJrZXJDb2xvci5jb2xvcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRIc2xUb1N0cmluZ0hzbChoc2w6IEhzbENvbG9yKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAnaHNsKCcgKyAoaHNsLmggPCAwID8gaHNsLmggKyAzNjAgOiBoc2wuaCkgKyAnLCAnICsgaHNsLnMgKyAnJSwgJyArIGhzbC5sICsgJyUpJztcclxufVxyXG4iXX0=