ngx-slice-kit
Version:
[](https://badge.fury.io/js/ngx-slice-kit)
134 lines • 21.3 kB
JavaScript
const defaultBaseRgb = `25,25,25`;
const defaultBackgroundRgb = `255,255,255`;
const defaultRegularRgb = `186,186,186`; // `66,66,66`;
const defaultPrimaryRgb = `0,85,255`; // `0,85,255`;
const defaultSuccessRgb = `39,174,96`; // `39,174,96`;
const defaultAccentRgb = `241,201,79`; // `255,168,38`;
const defaultWarnRgb = `211,50,39`; // `238,112,112`;
export const defaultColors = {
base: defaultBaseRgb,
base_text: defaultBackgroundRgb,
background: defaultBackgroundRgb,
regular: defaultRegularRgb,
regular_text: defaultBaseRgb,
primary: defaultPrimaryRgb,
primary_text: defaultBackgroundRgb,
success: defaultSuccessRgb,
success_text: defaultBackgroundRgb,
accent: defaultAccentRgb,
accent_text: defaultBackgroundRgb,
warn: defaultWarnRgb,
warn_text: defaultBackgroundRgb,
};
export const baseColors = [
`base`, `background`,
];
export const colors = [
`regular`, `primary`, `success`, `accent`, `warn`,
];
const alphaLimit = 100;
const alphaStep = 10;
export class ColorProperty {
constructor(cp) {
Object.assign(this, cp);
this.prop = `--${this.name}`;
// find color values
const rgbVal = this.value.split(sep(this.value)).map(i => parseInt(i, 10));
const bgVal = this.background.split(sep(this.background)).map(i => parseInt(i, 10));
const rgbMixin = MixinRgba(rgbVal, bgVal, this.alpha / 100);
const bgMixin = MixinRgba(bgVal, rgbVal, this.alpha / 100);
// declare rgb values
this.rgb = NumArrayToRgbString(rgbMixin);
this.hex = RgbaToHex(this.rgb);
this.background = NumArrayToRgbString(bgMixin);
// check if text value is available
if (this.text_value?.length > 0) {
const textVal = this.text_value.split(sep(this.text_value)).map(i => parseInt(i, 10));
const textMixin = MixinRgba(textVal, bgVal, 0.9);
this.text = NumArrayToRgbString(textMixin);
}
}
}
export class Theme {
constructor(t) {
Object.assign(this, defaultColors, t);
this.colors = new Set();
for (const color of [...baseColors, ...colors]) {
const rgb = this[color];
const textColor = `${color}_text`;
const colorProp = new ColorProperty({
name: color,
text_value: this[textColor],
alpha: alphaLimit,
value: rgb,
background: rgb === this.background ? this.base : this.background,
});
this.colors.add(colorProp);
}
}
props() {
const results = [];
for (const c of this.colors) {
results.push(c);
}
for (const color of [...baseColors, ...colors]) {
const rgb = this[color];
for (let alpha = alphaStep; alpha <= alphaLimit; alpha += alphaStep) {
results.push(new ColorProperty({
name: `${color}-a${alpha}`,
alpha,
value: rgb,
background: rgb === this.background ? this.base : this.background,
}));
}
}
return results;
}
}
const sep = (str) => {
return str?.indexOf(',') < 0 ? (str?.indexOf(', ') < 0 ? ' ' : ', ') : ',';
};
const trim = (str) => {
return str?.replace(/^\s+|\s+$/gm, '');
};
export const MixinRgba = (base, added, alpha) => {
const r3 = Math.round(((1 - alpha) * added[0]) + (alpha * base[0]));
const g3 = Math.round(((1 - alpha) * added[1]) + (alpha * base[1]));
const b3 = Math.round(((1 - alpha) * added[2]) + (alpha * base[2]));
return [r3, g3, b3];
};
export const NumArrayToRgbString = (rgb) => {
return `rgb(${rgb[0]},${rgb[1]},${rgb[2]})`;
};
export const RgbaToHex = (rgba) => {
if (!rgba) {
return '';
}
const inParts = rgba.substring(rgba.indexOf('(')).split(sep(rgba));
const r = parseInt(trim(inParts[0].substring(1)), 10);
const g = parseInt(trim(inParts[1]), 10);
const b = parseInt(trim(inParts[2]), 10);
const outParts = [
r.toString(16),
g.toString(16),
b.toString(16)
];
if (inParts.length > 3) {
const a = parseFloat(trim(inParts[3].substring(0, inParts[3].length - 1))).toFixed(2);
outParts.push(Math.round(a * 255).toString(16).substring(0, 2));
}
// Pad single-digit output values
outParts.forEach((part, i) => {
if (part.length === 1) {
outParts[i] = '0' + part;
}
});
return ('#' + outParts.join(''));
};
export const HexToRgb = (hex) => {
const r = parseInt(hex.substr(1, 2), 16);
const g = parseInt(hex.substr(3, 2), 16);
const b = parseInt(hex.substr(5, 2), 16);
return [r, g, b];
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1zbGljZS1raXQvc3JjL2xpYi9jb3JlL3RoZW1lL3RoZW1lLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztBQUNsQyxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztBQUMzQyxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxDQUFDLGNBQWM7QUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsQ0FBQyxjQUFjO0FBQ3BELE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLENBQUMsZUFBZTtBQUN0RCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxDQUFDLGdCQUFnQjtBQUN2RCxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsQ0FBQyxpQkFBaUI7QUFLckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHO0lBQ3pCLElBQUksRUFBRSxjQUFjO0lBQ3BCLFNBQVMsRUFBRSxvQkFBb0I7SUFDL0IsVUFBVSxFQUFFLG9CQUFvQjtJQUNoQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFlBQVksRUFBRSxjQUFjO0lBQzVCLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFlBQVksRUFBRSxvQkFBb0I7SUFDbEMsTUFBTSxFQUFFLGdCQUFnQjtJQUN4QixXQUFXLEVBQUUsb0JBQW9CO0lBQ2pDLElBQUksRUFBRSxjQUFjO0lBQ3BCLFNBQVMsRUFBRSxvQkFBb0I7Q0FDbEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN0QixNQUFNLEVBQUUsWUFBWTtDQUN2QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ2xCLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxF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QUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25FO0lBRUQsaUNBQWlDO0lBQ2pDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDekIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNuQixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztTQUM1QjtJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBVyxFQUFZLEVBQUU7SUFDOUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZGVmYXVsdEJhc2VSZ2IgPSBgMjUsMjUsMjVgO1xuY29uc3QgZGVmYXVsdEJhY2tncm91bmRSZ2IgPSBgMjU1LDI1NSwyNTVgO1xuY29uc3QgZGVmYXVsdFJlZ3VsYXJSZ2IgPSBgMTg2LDE4NiwxODZgOyAvLyBgNjYsNjYsNjZgO1xuY29uc3QgZGVmYXVsdFByaW1hcnlSZ2IgPSBgMCw4NSwyNTVgOyAvLyBgMCw4NSwyNTVgO1xuY29uc3QgZGVmYXVsdFN1Y2Nlc3NSZ2IgPSBgMzksMTc0LDk2YDsgLy8gYDM5LDE3NCw5NmA7XG5jb25zdCBkZWZhdWx0QWNjZW50UmdiID0gYDI0MSwyMDEsNzlgOyAvLyBgMjU1LDE2OCwzOGA7XG5jb25zdCBkZWZhdWx0V2FyblJnYiA9IGAyMTEsNTAsMzlgOyAvLyBgMjM4LDExMiwxMTJgO1xuXG5leHBvcnQgdHlwZSBUaGVtZUJhc2VDb2xvcnMgPSAnYmFzZScgfCAnYmFja2dyb3VuZCc7XG5leHBvcnQgdHlwZSBUaGVtZUNvbG9ycyA9ICdyZWd1bGFyJyB8ICdwcmltYXJ5JyB8ICdzdWNjZXNzJyB8ICdhY2NlbnQnIHwgJ3dhcm4nO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbG9ycyA9IHtcbiAgICBiYXNlOiBkZWZhdWx0QmFzZVJnYixcbiAgICBiYXNlX3RleHQ6IGRlZmF1bHRCYWNrZ3JvdW5kUmdiLFxuICAgIGJhY2tncm91bmQ6IGRlZmF1bHRCYWNrZ3JvdW5kUmdiLFxuICAgIHJlZ3VsYXI6IGRlZmF1bHRSZWd1bGFyUmdiLFxuICAgIHJlZ3VsYXJfdGV4dDogZGVmYXVsdEJhc2VSZ2IsXG4gICAgcHJpbWFyeTogZGVmYXVsdFByaW1hcnlSZ2IsXG4gICAgcHJpbWFyeV90ZXh0OiBkZWZhdWx0QmFja2dyb3VuZFJnYixcbiAgICBzdWNjZXNzOiBkZWZhdWx0U3VjY2Vzc1JnYixcbiAgICBzdWNjZXNzX3RleHQ6IGRlZmF1bHRCYWNrZ3JvdW5kUmdiLFxuICAgIGFjY2VudDogZGVmYXVsdEFjY2VudFJnYixcbiAgICBhY2NlbnRfdGV4dDogZGVmYXVsdEJhY2tncm91bmRSZ2IsXG4gICAgd2FybjogZGVmYXVsdFdhcm5SZ2IsXG4gICAgd2Fybl90ZXh0OiBkZWZhdWx0QmFja2dyb3VuZFJnYixcbn07XG5cbmV4cG9ydCBjb25zdCBiYXNlQ29sb3JzID0gW1xuICAgIGBiYXNlYCwgYGJhY2tncm91bmRgLFxuXTtcblxuZXhwb3J0IGNvbnN0IGNvbG9ycyA9IFtcbiAgICBgcmVndWxhcmAsIGBwcmltYXJ5YCwgYHN1Y2Nlc3NgLCBgYWNjZW50YCwgYHdhcm5gLFxuXTtcblxuY29uc3QgYWxwaGFMaW1pdCA9IDEwMDtcbmNvbnN0IGFscGhhU3RlcCA9IDEwO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JQcm9wZXJ0eSB7XG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmc7XG4gICAgcHVibGljIHRleHRfdmFsdWU/OiBzdHJpbmc7XG4gICAgcHVibGljIGJhY2tncm91bmQ6IHN0cmluZztcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0ZXh0Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBwcm9wPzogc3RyaW5nO1xuICAgIHB1YmxpYyBhbHBoYT86IG51bWJlcjtcbiAgICBwdWJsaWMgcmdiPzogc3RyaW5nO1xuICAgIHB1YmxpYyBoZXg/OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihjcD86IENvbG9yUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjcCk7XG4gICAgICAgIHRoaXMucHJvcCA9IGAtLSR7dGhpcy5uYW1lfWA7XG5cbiAgICAgICAgLy8gZmluZCBjb2xvciB2YWx1ZXNcbiAgICAgICAgY29uc3QgcmdiVmFsID0gdGhpcy52YWx1ZS5zcGxpdChzZXAodGhpcy52YWx1ZSkpLm1hcChpID0+IHBhcnNlSW50KGksIDEwKSk7XG4gICAgICAgIGNvbnN0IGJnVmFsID0gdGhpcy5iYWNrZ3JvdW5kLnNwbGl0KHNlcCh0aGlzLmJhY2tncm91bmQpKS5tYXAoaSA9PiBwYXJzZUludChpLCAxMCkpO1xuICAgICAgICBjb25zdCByZ2JNaXhpbiA9IE1peGluUmdiYShyZ2JWYWwsIGJnVmFsLCB0aGlzLmFscGhhIC8gMTAwKTtcbiAgICAgICAgY29uc3QgYmdNaXhpbiA9IE1peGluUmdiYShiZ1ZhbCwgcmdiVmFsLCB0aGlzLmFscGhhIC8gMTAwKTtcblxuICAgICAgICAvLyBkZWNsYXJlIHJnYiB2YWx1ZXNcbiAgICAgICAgdGhpcy5yZ2IgPSBOdW1BcnJheVRvUmdiU3RyaW5nKHJnYk1peGluKTtcbiAgICAgICAgdGhpcy5oZXggPSBSZ2JhVG9IZXgodGhpcy5yZ2IpO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBOdW1BcnJheVRvUmdiU3RyaW5nKGJnTWl4aW4pO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRleHQgdmFsdWUgaXMgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLnRleHRfdmFsdWU/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRWYWwgPSB0aGlzLnRleHRfdmFsdWUuc3BsaXQoc2VwKHRoaXMudGV4dF92YWx1ZSkpLm1hcChpID0+IHBhcnNlSW50KGksIDEwKSk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0TWl4aW4gPSBNaXhpblJnYmEodGV4dFZhbCwgYmdWYWwsIDAuOSk7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSBOdW1BcnJheVRvUmdiU3RyaW5nKHRleHRNaXhpbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUaGVtZSB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcblxuICAgIC8vIHRoZXJlIGdvZXMgUkdCIGNvbG9ycyBwYWxldHRlIHN0cmluZyB2YWx1ZXNcbiAgICBwdWJsaWMgYmFzZT86IHN0cmluZztcbiAgICBwdWJsaWMgYmFja2dyb3VuZD86IHN0cmluZztcbiAgICBwdWJsaWMgcmVndWxhcj86IHN0cmluZztcbiAgICBwdWJsaWMgcHJpbWFyeT86IHN0cmluZztcbiAgICBwdWJsaWMgc3VjY2Vzcz86IHN0cmluZztcbiAgICBwdWJsaWMgYWNjZW50Pzogc3RyaW5nO1xuICAgIHB1YmxpYyB3YXJuPzogc3RyaW5nO1xuICAgIC8vIHRleHQga2V5c1xuICAgIHB1YmxpYyBiYXNlX3RleHQ/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlZ3VsYXJfdGV4dD86IHN0cmluZztcbiAgICBwdWJsaWMgcHJpbWFyeV90ZXh0Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBzdWNjZXNzX3RleHQ/OiBzdHJpbmc7XG4gICAgcHVibGljIGFjY2VudF90ZXh0Pzogc3RyaW5nO1xuICAgIHB1YmxpYyB3YXJuX3RleHQ/OiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgY29sb3JzPzogU2V0PENvbG9yUHJvcGVydHk+O1xuXG4gICAgY29uc3RydWN0b3IodD86IFRoZW1lKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGVmYXVsdENvbG9ycywgdCk7XG5cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBuZXcgU2V0PENvbG9yUHJvcGVydHk+KCk7XG4gICAgICAgIGZvciAoY29uc3QgY29sb3Igb2YgWy4uLmJhc2VDb2xvcnMsIC4uLmNvbG9yc10pIHtcbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IHRoaXNbY29sb3JdO1xuXG4gICAgICAgICAgICBjb25zdCB0ZXh0Q29sb3IgPSBgJHtjb2xvcn1fdGV4dGA7XG4gICAgICAgICAgICBjb25zdCBjb2xvclByb3AgPSBuZXcgQ29sb3JQcm9wZXJ0eSh7XG4gICAgICAgICAgICAgICAgbmFtZTogY29sb3IsXG4gICAgICAgICAgICAgICAgdGV4dF92YWx1ZTogdGhpc1t0ZXh0Q29sb3JdLFxuICAgICAgICAgICAgICAgIGFscGhhOiBhbHBoYUxpbWl0LFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZ2IsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiID09PSB0aGlzLmJhY2tncm91bmQgPyB0aGlzLmJhc2UgOiB0aGlzLmJhY2tncm91bmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29sb3JzLmFkZChjb2xvclByb3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHByb3BzPygpOiBDb2xvclByb3BlcnR5W10ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY29sb3JzKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goYyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIFsuLi5iYXNlQ29sb3JzLCAuLi5jb2xvcnNdKSB7XG4gICAgICAgICAgICBjb25zdCByZ2IgPSB0aGlzW2NvbG9yXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgYWxwaGEgPSBhbHBoYVN0ZXA7IGFscGhhIDw9IGFscGhhTGltaXQ7IGFscGhhICs9IGFscGhhU3RlcCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChuZXcgQ29sb3JQcm9wZXJ0eSh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke2NvbG9yfS1hJHthbHBoYX1gLFxuICAgICAgICAgICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJnYixcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiID09PSB0aGlzLmJhY2tncm91bmQgPyB0aGlzLmJhc2UgOiB0aGlzLmJhY2tncm91bmQsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxufVxuXG5jb25zdCBzZXAgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBzdHI/LmluZGV4T2YoJywnKSA8IDAgPyAoc3RyPy5pbmRleE9mKCcsICcpIDwgMCA/ICcgJyA6ICcsICcpIDogJywnO1xufTtcblxuY29uc3QgdHJpbSA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIHN0cj8ucmVwbGFjZSgvXlxccyt8XFxzKyQvZ20sICcnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBNaXhpblJnYmEgPSAoYmFzZTogbnVtYmVyW10sIGFkZGVkOiBudW1iZXJbXSwgYWxwaGE6IG51bWJlcik6IG51bWJlcltdID0+IHtcbiAgICBjb25zdCByMyA9IE1hdGgucm91bmQoKCgxIC0gYWxwaGEpICogYWRkZWRbMF0pICsgKGFscGhhICogYmFzZVswXSkpO1xuICAgIGNvbnN0IGczID0gTWF0aC5yb3VuZCgoKDEgLSBhbHBoYSkgKiBhZGRlZFsxXSkgKyAoYWxwaGEgKiBiYXNlWzFdKSk7XG4gICAgY29uc3QgYjMgPSBNYXRoLnJvdW5kKCgoMSAtIGFscGhhKSAqIGFkZGVkWzJdKSArIChhbHBoYSAqIGJhc2VbMl0pKTtcbiAgICByZXR1cm4gW3IzLCBnMywgYjNdO1xufTtcblxuZXhwb3J0IGNvbnN0IE51bUFycmF5VG9SZ2JTdHJpbmcgPSAocmdiOiBudW1iZXJbXSk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIGByZ2IoJHtyZ2JbMF19LCR7cmdiWzFdfSwke3JnYlsyXX0pYDtcbn07XG5cbmV4cG9ydCBjb25zdCBSZ2JhVG9IZXggPSAocmdiYTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIXJnYmEpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGluUGFydHMgPSByZ2JhLnN1YnN0cmluZyhyZ2JhLmluZGV4T2YoJygnKSkuc3BsaXQoc2VwKHJnYmEpKTtcbiAgICBjb25zdCByID0gcGFyc2VJbnQodHJpbShpblBhcnRzWzBdLnN1YnN0cmluZygxKSksIDEwKTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQodHJpbShpblBhcnRzWzFdKSwgMTApO1xuICAgIGNvbnN0IGIgPSBwYXJzZUludCh0cmltKGluUGFydHNbMl0pLCAxMCk7XG4gICAgY29uc3Qgb3V0UGFydHMgPSBbXG4gICAgICAgIHIudG9TdHJpbmcoMTYpLFxuICAgICAgICBnLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgYi50b1N0cmluZygxNilcbiAgICBdO1xuXG4gICAgaWYgKGluUGFydHMubGVuZ3RoID4gMykge1xuICAgICAgICBjb25zdCBhOiBhbnkgPSBwYXJzZUZsb2F0KHRyaW0oaW5QYXJ0c1szXS5zdWJzdHJpbmcoMCwgaW5QYXJ0c1szXS5sZW5ndGggLSAxKSkpLnRvRml4ZWQoMik7XG4gICAgICAgIG91dFBhcnRzLnB1c2goTWF0aC5yb3VuZChhICogMjU1KS50b1N0cmluZygxNikuc3Vic3RyaW5nKDAsIDIpKTtcbiAgICB9XG5cbiAgICAvLyBQYWQgc2luZ2xlLWRpZ2l0IG91dHB1dCB2YWx1ZXNcbiAgICBvdXRQYXJ0cy5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgICAgIGlmIChwYXJ0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgb3V0UGFydHNbaV0gPSAnMCcgKyBwYXJ0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCcjJyArIG91dFBhcnRzLmpvaW4oJycpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBIZXhUb1JnYiA9IChoZXg6IHN0cmluZyk6IG51bWJlcltdID0+IHtcbiAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cigxLCAyKSwgMTYpO1xuICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXguc3Vic3RyKDMsIDIpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zdWJzdHIoNSwgMiksIDE2KTtcbiAgICByZXR1cm4gW3IsIGcsIGJdO1xufTtcbiJdfQ==