value-color
Version:
Library for working with colors. Includes RGB and HSL creation, gradients, and built-in names.
184 lines (143 loc) • 30.2 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.complement = exports.toRGB = exports.toHSL = exports.darkCharcoal = exports.charcoal = exports.lightCharcoal = exports.darkGrey = exports.grey = exports.lightGrey = exports.white = exports.black = exports.darkBrown = exports.brown = exports.lightBrown = exports.darkPurple = exports.purple = exports.lightPurple = exports.darkBlue = exports.blue = exports.lightBlue = exports.darkGreen = exports.green = exports.lightGreen = exports.darkYellow = exports.yellow = exports.lightYellow = exports.darkOrange = exports.orange = exports.lightOrange = exports.darkRed = exports.red = exports.lightRed = exports.grayscale = exports.hsl = exports.hsla = exports.rgb = exports.rgba = exports.match = undefined;
var _throw = require("throw.flow");
var _throw2 = _interopRequireDefault(_throw);
var _Angle = require("./Angle");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const match = exports.match = match => value => {
if (value instanceof HSLAColor) {
return match.HSLA(value);
} else if (value instanceof RGBAColor) {
return match.RGBA(value);
} else if (value == null) {
return match._();
} else if (typeof value === "object") {
const { red, green, blue, alpha, hue, saturation, lightness } = value;
if (typeof red === "number" && typeof green === "number" && typeof blue === "number") {
if (typeof alpha === "number") {
return match.rgba(red, green, blue, alpha);
} else {
return match.rgb(red, green, blue);
}
} else if (typeof hue === "number" && typeof saturation === "number" && typeof lightness === "number") {
if (typeof alpha === "number") {
return match.hsla(hue, saturation, lightness, alpha);
} else {
return match.hsl(hue, saturation, lightness);
}
}
}
return match._();
};
class RGBAColor {
constructor(red, green, blue, alpha) {
this.red = red;
this.green = green;
this.blue = blue;
this.alpha = alpha;
}
static complement(red, green, blue, alpha) {
const { hue, saturation, lightness } = rgba2hsla(red, green, blue, alpha);
return HSLAColor.complement(hue, saturation, lightness, alpha);
}
}
class HSLAColor {
constructor(hue, saturation, lightness, alpha) {
this.hue = hue;
this.saturation = saturation;
this.lightness = lightness;
this.alpha = alpha;
}
static complement(hue, saturation, lightness, alpha) {
return new HSLAColor(hue + (0, _Angle.degrees)(180), saturation, lightness, alpha);
}
}
const rgba = exports.rgba = (red, green, blue, alpha) => new RGBAColor(red, green, blue, alpha);
const rgb = exports.rgb = (red, green, blue) => new RGBAColor(red, green, blue, 1);
const hsla = exports.hsla = (hue, saturation, lightness, alpha) => new HSLAColor(hue - (0, _Angle.turns)(Math.floor(hue / (2 * Math.PI))), saturation, lightness, alpha);
const hsl = exports.hsl = (hue, saturation, lightness) => hsla(hue, saturation, lightness, 1);
const grayscale = exports.grayscale = value => new HSLAColor(0, 0, 1 - value, 1);
const fmod = (f, n) => {
const integer = Math.floor(f);
return integer % n + f - integer;
};
const lightRed = exports.lightRed = rgb(239, 41, 41);
const red = exports.red = rgb(204, 0, 0);
const darkRed = exports.darkRed = rgb(164, 0, 0);
const lightOrange = exports.lightOrange = rgb(252, 175, 62);
const orange = exports.orange = rgb(245, 121, 0);
const darkOrange = exports.darkOrange = rgb(206, 92, 0);
const lightYellow = exports.lightYellow = rgb(255, 233, 79);
const yellow = exports.yellow = rgb(237, 212, 0);
const darkYellow = exports.darkYellow = rgb(196, 160, 0);
const lightGreen = exports.lightGreen = rgb(138, 226, 52);
const green = exports.green = rgb(115, 210, 22);
const darkGreen = exports.darkGreen = rgb(78, 154, 6);
const lightBlue = exports.lightBlue = rgb(114, 159, 207);
const blue = exports.blue = rgb(52, 101, 164);
const darkBlue = exports.darkBlue = rgb(32, 74, 135);
const lightPurple = exports.lightPurple = rgb(173, 127, 168);
const purple = exports.purple = rgb(117, 80, 123);
const darkPurple = exports.darkPurple = rgb(92, 53, 102);
const lightBrown = exports.lightBrown = rgb(233, 185, 110);
const brown = exports.brown = rgb(193, 125, 17);
const darkBrown = exports.darkBrown = rgb(143, 89, 2);
const black = exports.black = rgb(0, 0, 0);
const white = exports.white = rgb(255, 255, 255);
const lightGrey = exports.lightGrey = rgb(238, 238, 236);
const grey = exports.grey = rgb(211, 215, 207);
const darkGrey = exports.darkGrey = rgb(186, 189, 182);
const lightCharcoal = exports.lightCharcoal = rgb(136, 138, 133);
const charcoal = exports.charcoal = rgb(85, 87, 83);
const darkCharcoal = exports.darkCharcoal = rgb(46, 52, 54);
const hsla2rgba = (hue, saturation, lightness, alpha) => {
const chroma = (1 - Math.abs(2 * lightness - 1)) * saturation;
const h = hue / (0, _Angle.degrees)(60);
const x = chroma * (1 - Math.abs(fmod(h, 2 - 1)));
const [r, g, b] = h < 0 ? [0, 0, 0] : h < 1 ? [chroma, x, 0] : h < 2 ? [x, chroma, 0] : h < 3 ? [0, chroma, x] : h < 4 ? [0, x, chroma] : h < 5 ? [x, 0, chroma] : h < 6 ? [chroma, 0, x] : [0, 0, 0];
const m = lightness - chroma / 2;
const color = new RGBAColor(Math.round(255 * (r + m)), Math.round(255 * (g + m)), Math.round(255 * (b + m)), alpha);
return color;
};
const rgba2hsla = (red, green, blue, alpha) => {
const [r, g, b] = [red / 255, green / 255, blue / 255];
const max = Math.max(Math.max(r, g), b);
const min = Math.min(Math.min(r, g), b);
const delta = max - min;
const h = max === r ? fmod((g - b) / delta, 6) : max === g ? (b - r) / delta + 2 : (r - g) / delta + 4;
const hue = (0, _Angle.degrees)(60) * h;
const lightness = (max + min) / 2;
const saturation = lightness === 0 ? 0 : delta / (1 - Math.abs(2 * lightness - 1));
return new HSLAColor(hue, lightness, saturation, alpha);
};
const toHSL = exports.toHSL = match({
RGBA: ({ red, green, blue, alpha }) => rgba2hsla(red, green, blue, alpha),
rgba: rgba2hsla,
rgb: (red, green, blue) => rgba2hsla(red, green, blue, 1),
HSLA: hsla => hsla,
hsla: hsla,
hsl: hsl,
_: _throw2.default
});
const toRGB = exports.toRGB = match({
HSLA: ({ hue, saturation, lightness, alpha }) => hsla2rgba(hue, saturation, lightness, alpha),
hsla: hsla2rgba,
hsl: (hue, saturation, lightness) => hsla2rgba(hue, saturation, lightness, 1),
RGBA: rgba => rgba,
rgba: rgba,
rgb: rgb,
_: _throw2.default
});
const complement = exports.complement = match({
HSLA: ({ hue, saturation, lightness, alpha }) => HSLAColor.complement(hue, saturation, lightness, alpha),
hsla: HSLAColor.complement,
hsl: (hue, saturation, lightness) => HSLAColor.complement(hue, saturation, lightness, 1),
RGBA: ({ red, green, blue, alpha }) => RGBAColor.complement(red, green, blue, alpha),
rgba: RGBAColor.complement,
rgb: (red, green, blue) => RGBAColor.complement(red, green, blue, 1),
_: _throw2.default
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9Db2xvci5qcyJdLCJuYW1lcyI6WyJtYXRjaCIsInZhbHVlIiwiSFNMQUNvbG9yIiwiSFNMQSIsIlJHQkFDb2xvciIsIlJHQkEiLCJfIiwicmVkIiwiZ3JlZW4iLCJibHVlIiwiYWxwaGEiLCJodWUiLCJzYXR1cmF0aW9uIiwibGlnaHRuZXNzIiwicmdiYSIsInJnYiIsImhzbGEiLCJoc2wiLCJjb25zdHJ1Y3RvciIsImNvbXBsZW1lbnQiLCJyZ2JhMmhzbGEiLCJNYXRoIiwiZmxvb3IiLCJQSSIsImdyYXlzY2FsZSIsImZtb2QiLCJmIiwibiIsImludGVnZXIiLCJsaWdodFJlZCIsImRhcmtSZWQiLCJsaWdodE9yYW5nZSIsIm9yYW5nZSIsImRhcmtPcmFuZ2UiLCJsaWdodFllbGxvdyIsInllbGxvdyIsImRhcmtZZWxsb3ciLCJsaWdodEdyZWVuIiwiZGFya0dyZWVuIiwibGlnaHRCbHVlIiwiZGFya0JsdWUiLCJsaWdodFB1cnBsZSIsInB1cnBsZSIsImRhcmtQdXJwbGUiLCJsaWdodEJyb3duIiwiYnJvd24iLCJkYXJrQnJvd24iLCJibGFjayIsIndoaXRlIiwibGlnaHRHcmV5IiwiZ3JleSIsImRhcmtHcmV5IiwibGlnaHRDaGFyY29hbCIsImNoYXJjb2FsIiwiZGFya0NoYXJjb2FsIiwiaHNsYTJyZ2JhIiwiY2hyb21hIiwiYWJzIiwiaCIsIngiLCJyIiwiZyIsImIiLCJtIiwiY29sb3IiLCJyb3VuZCIsIm1heCIsIm1pbiIsImRlbHRhIiwidG9IU0wiLCJ0b1JHQiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOzs7O0FBQ0E7Ozs7QUE2Qk8sTUFBTUEsd0JBQVlBLEtBQUosSUFDbkJDLEtBRGtFLElBRTVEO0FBQ04sTUFBSUEsaUJBQWlCQyxTQUFyQixFQUFnQztBQUM5QixXQUFPRixNQUFNRyxJQUFOLENBQVdGLEtBQVgsQ0FBUDtBQUNELEdBRkQsTUFFTyxJQUFJQSxpQkFBaUJHLFNBQXJCLEVBQWdDO0FBQ3JDLFdBQU9KLE1BQU1LLElB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T0MsS0FBUCxFQUFjQyxJQUFkLEVBQW9CQyxLQUFwQixFQUFELEtBQ0pOLFVBQVVlLFVBQVYsQ0FBcUJaLEdBQXJCLEVBQTBCQyxLQUExQixFQUFpQ0MsSUFBakMsRUFBdUNDLEtBQXZDLENBUHFEO0FBUXZESSxRQUFNVixVQUFVZSxVQVJ1QztBQVN2REosT0FBSyxDQUFDUixHQUFELEVBQU1DLEtBQU4sRUFBYUMsSUFBYixLQUFzQkwsVUFBVWUsVUFBVixDQUFxQlosR0FBckIsRUFBMEJDLEtBQTFCLEVBQWlDQyxJQUFqQyxFQUF1QyxDQUF2QyxDQVQ0QjtBQVV2REg7QUFWdUQsQ0FBTixDQUE1QyIsImZpbGUiOiJDb2xvci5qcyIsInNvdXJjZVJvb3QiOiJzcmMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZmxvdyAqL1xuXG5pbXBvcnQgY3Jhc2ggZnJvbSBcInRocm93LmZsb3dcIlxuaW1wb3J0IHsgdHVybnMsIGRlZ3JlZXMgfSBmcm9tIFwiLi9BbmdsZVwiXG5pbXBvcnQgdHlwZSB7IEludCwgRmxvYXQgfSBmcm9tIFwiLi9OdW1iZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFJHQkEge1xuICByZWQ6IEludCxcbiAgZ3JlZW46IEludCxcbiAgYmx1ZTogSW50LFxuICBhbHBoYTogRmxvYXRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIU0xBIHtcbiAgaHVlOiBGbG9hdCxcbiAgc2F0dXJhdGlvbjogRmxvYXQsXG4gIGxpZ2h0bmVzczogRmxvYXQsXG4gIGFscGhhOiBGbG9hdFxufVxuXG5leHBvcnQgdHlwZSBDb2xvciA9IFJHQkEgfCBIU0xBXG5cbmludGVyZmFjZSBNYXRjaDxhPiB7XG4gIFJHQkE6IChjb2xvcjogUkdCQSkgPT4gYSxcbiAgSFNMQTogKGNvbG9yOiBIU0xBKSA9PiBhLFxuICByZ2I6IChyZWQ6IEludCwgZ3JlZW46IEludCwgYmx1ZTogSW50KSA9PiBhLFxuICByZ2JhOiAocmVkOiBJbnQsIGdyZWVuOiBJbnQsIGJsdWU6IEludCwgYWxwaGE6IEZsb2F0KSA9PiBhLFxuICBoc2w6IChodWU6IEZsb2F0LCBzYXR1cmF0aW9uOiBGbG9hdCwgbGlnaHRuZXNzOiBGbG9hdCkgPT4gYSxcbiAgaHNsYTogKGh1ZTogRmxvYXQsIHNhdHVyYXRpb246IEZsb2F0LCBsaWdodG5lc3M6IEZsb2F0LCBhbHBoYTogRmxvYXQpID0+IGEsXG4gIF86ICgpID0+IGFcbn1cblxuZXhwb3J0IGNvbnN0IG1hdGNoID0gPGE+KG1hdGNoOiBNYXRjaDxhPik6ICgodmFsdWU6IG1peGVkKSA9PiBhKSA9PiAoXG4gIHZhbHVlOiBtaXhlZFxuKTogYSA9PiB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhTTEFDb2xvcikge1xuICAgIHJldHVybiBtYXRjaC5IU0xBKHZhbHVlKVxuICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUkdCQUNvbG9yKSB7XG4gICAgcmV0dXJuIG1hdGNoLlJHQkEodmFsdWUpXG4gIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBtYXRjaC5fKClcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCB7IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhLCBodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcyB9ID0gdmFsdWVcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgcmVkID09PSBcIm51bWJlclwiICYmXG4gICAgICB0eXBlb2YgZ3JlZW4gPT09IFwibnVtYmVyXCIgJiZcbiAgICAgIHR5cGVvZiBibHVlID09PSBcIm51bWJlclwiXG4gICAgKSB7XG4gICAgICBpZiAodHlwZW9mIGFscGhhID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBtYXRjaC5yZ2JhKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoLnJnYihyZWQsIGdyZWVuLCBibHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgaHVlID09PSBcIm51bWJlclwiICYmXG4gICAgICB0eXBlb2Ygc2F0dXJhdGlvbiA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgdHlwZW9mIGxpZ2h0bmVzcyA9PT0gXCJudW1iZXJcIlxuICAgICkge1xuICAgICAgaWYgKHR5cGVvZiBhbHBoYSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gbWF0Y2guaHNsYShodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcywgYWxwaGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbWF0Y2guaHNsKGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaC5fKClcbn1cblxuY2xhc3MgUkdCQUNvbG9yIGltcGxlbWVudHMgUkdCQSB7XG4gIHJlZDogSW50XG4gIGdyZWVuOiBJbnRcbiAgYmx1ZTogSW50XG4gIGFscGhhOiBGbG9hdFxuXG4gIGNvbnN0cnVjdG9yKHJlZDogSW50LCBncmVlbjogSW50LCBibHVlOiBJbnQsIGFscGhhOiBGbG9hdCkge1xuICAgIHRoaXMucmVkID0gcmVkXG4gICAgdGhpcy5ncmVlbiA9IGdyZWVuXG4gICAgdGhpcy5ibHVlID0gYmx1ZVxuICAgIHRoaXMuYWxwaGEgPSBhbHBoYVxuICB9XG5cbiAgc3RhdGljIGNvbXBsZW1lbnQocmVkOiBJbnQsIGdyZWVuOiBJbnQsIGJsdWU6IEludCwgYWxwaGE6IEZsb2F0KTogQ29sb3Ige1xuICAgIGNvbnN0IHsgaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MgfSA9IHJnYmEyaHNsYShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSlcbiAgICByZXR1cm4gSFNMQUNvbG9yLmNvbXBsZW1lbnQoaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIGFscGhhKVxuICB9XG59XG5cbmNsYXNzIEhTTEFDb2xvciBpbXBsZW1lbnRzIEhTTEEge1xuICBodWU6IEZsb2F0XG4gIHNhdHVyYXRpb246IEZsb2F0XG4gIGxpZ2h0bmVzczogRmxvYXRcbiAgYWxwaGE6IEZsb2F0XG5cbiAgY29uc3RydWN0b3IoaHVlOiBGbG9hdCwgc2F0dXJhdGlvbjogRmxvYXQsIGxpZ2h0bmVzczogRmxvYXQsIGFscGhhOiBGbG9hdCkge1xuICAgIHRoaXMuaHVlID0gaHVlXG4gICAgdGhpcy5zYXR1cmF0aW9uID0gc2F0dXJhdGlvblxuICAgIHRoaXMubGlnaHRuZXNzID0gbGlnaHRuZXNzXG4gICAgdGhpcy5hbHBoYSA9IGFscGhhXG4gIH1cblxuICBzdGF0aWMgY29tcGxlbWVudChcbiAgICBodWU6IEZsb2F0LFxuICAgIHNhdHVyYXRpb246IEZsb2F0LFxuICAgIGxpZ2h0bmVzczogRmxvYXQsXG4gICAgYWxwaGE6IEZsb2F0XG4gICk6IEhTTEEge1xuICAgIHJldHVybiBuZXcgSFNMQUNvbG9yKGh1ZSArIGRlZ3JlZXMoMTgwKSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCBhbHBoYSlcbiAgfVxufVxuXG4vLyBDcmVhdGUgUkdCIGNvbG9ycyB3aXRoIGFuIGFscGhhIGNvbXBvbmVudCBmb3IgdHJhbnNwYXJlbmN5LlxuLy8gVGhlIGFscGhhIGNvbXBvbmVudCBpcyBzcGVjaWZpZWQgd2l0aCBudW1iZXJzIGJldHdlZW4gMCBhbmQgMVxuZXhwb3J0IGNvbnN0IHJnYmEgPSAocmVkOiBJbnQsIGdyZWVuOiBJbnQsIGJsdWU6IEludCwgYWxwaGE6IEZsb2F0KTogUkdCQSA9PlxuICBuZXcgUkdCQUNvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKVxuXG4vLyBDcmVhdGUgUkdCIGNvbG9ycyBmcm9tIG51bWJlcnMgYmV0d2VlbiAwIGFuZCAyNTUgaW5jbHVzaXZlXG5leHBvcnQgY29uc3QgcmdiID0gKHJlZDogSW50LCBncmVlbjogSW50LCBibHVlOiBJbnQpOiBSR0JBID0+XG4gIG5ldyBSR0JBQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgMSlcblxuLyoqXG4gKiBDcmVhdGUgW0hTTCBjb2xvcnNdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSFNMX2FuZF9IU1YpXG4gKiB3aXRoIGFuIGFscGhhIGNvbXBvbmVudCBmb3IgdHJhbnNwYXJlbmN5LlxuICovXG5leHBvcnQgY29uc3QgaHNsYSA9IChcbiAgaHVlOiBGbG9hdCxcbiAgc2F0dXJhdGlvbjogRmxvYXQsXG4gIGxpZ2h0bmVzczogRmxvYXQsXG4gIGFscGhhOiBGbG9hdFxuKTogSFNMQSA9PlxuICBuZXcgSFNMQUNvbG9yKFxuICAgIGh1ZSAtIHR1cm5zKE1hdGguZmxvb3IoaHVlIC8gKDIgKiBNYXRoLlBJKSkpLFxuICAgIHNhdHVyYXRpb24sXG4gICAgbGlnaHRuZXNzLFxuICAgIGFscGhhXG4gIClcblxuLyoqXG4gKiBDcmVhdGUgW0hTTCBjb2xvcnNdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSFNMX2FuZF9IU1YpLiBUaGlzIGdpdmVzXG4gKiB5b3UgYWNjZXNzIHRvIGNvbG9ycyBtb3JlIGxpa2UgYSBjb2xvciB3aGVlbCwgd2hlcmUgYWxsIGh1ZXMgYXJlIGFyYW5nZWQgaW4gYVxuICogY2lyY2xlIHRoYXQgeW91IHNwZWNpZnkgd2l0aCBhbmdsZXMgKHJhZGlhbnMpLlxuICogXG4gKiBgYGBqc1xuICogY29uc3QgcmVkID0gaHNsKGRlZ3JlZXMoMCksIDEsIDAuNSlcbiAqIGNvbnN0IGdyZWVuID0gaHNsKGRlZ3JlZXMoMTIwKSwgMSwgMC41KVxuICogY29uc3QgYmx1ZSA9IGhzbChkZWdyZWVzKDI0MCksIDEsIDAuNSlcbiAqIGNvbnN0IHBhc3RlbFJlZCA9IGhzbChkZWdyZWVzKDApLCAwLjcsIDAuNylcbiAqIGBgYFxuICogXG4gKiBUbyBjeWNsZSB0aHJvdWdoIGFsbCBjb2xvcnMsIGp1c3QgY3ljbGUgdGhyb3VnaCBkZWdyZWVzLiBUaGUgc2F0dXJhdGlvbiBsZXZlbFxuICogaXMgaG93IHZpYnJhbnQgdGhlIGNvbG9yIGlzLCBsaWtlIGEgZGlhbCBiZXR3ZWVuIGdyZXkgYW5kIGJyaWdodCBjb2xvcnMuIFRoZVxuICogbGlnaHRuZXNzIGxldmVsIGlzIGEgZGlhbCBiZXR3ZWVuIHdoaXRlIGFuZCBibGFjay5cbiAqL1xuZXhwb3J0IGNvbnN0IGhzbCA9IChodWU6IEZsb2F0LCBzYXR1cmF0aW9uOiBGbG9hdCwgbGlnaHRuZXNzOiBGbG9hdCk6IEhTTEEgPT5cbiAgaHNsYShodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcywgMSlcblxuLyoqXG4gKiBQcm9kdWNlIGEgZ3JheSBiYXNlZCBvbiB0aGUgaW5wdXQuIDAgaXMgd2hpdGUsIDEgaXMgYmxhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBncmF5c2NhbGUgPSAodmFsdWU6IEZsb2F0KTogQ29sb3IgPT5cbiAgbmV3IEhTTEFDb2xvcigwLCAwLCAxIC0gdmFsdWUsIDEpXG5cbmNvbnN0IGZtb2QgPSAoZjogRmxvYXQsIG46IEludCk6IEZsb2F0ID0+IHtcbiAgY29uc3QgaW50ZWdlciA9IE1hdGguZmxvb3IoZilcbiAgcmV0dXJuIGludGVnZXIgJSBuICsgZiAtIGludGVnZXJcbn1cblxuLyoqXG4gKiAjIyBCdWlsdC1pbiBDb2xvcnNcbiAqIFxuICogVGhlc2UgY29sb3JzIGNvbWUgZnJvbSB0aGUgW1RhbmdvIHBhbGV0dGVdKGh0dHA6Ly90YW5nby5mcmVlZGVza3RvcC5vcmcvVGFuZ29fSWNvbl9UaGVtZV9HdWlkZWxpbmVzKVxuICogd2hpY2ggcHJvdmlkZXMgYWVzdGhldGljYWxseSByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBjb2xvcnMuIEVhY2ggY29sb3IgYWxzb1xuICogY29tZXMgd2l0aCBhIGxpZ2h0IGFuZCBkYXJrIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBsaWdodFJlZCA9IHJnYigyMzksIDQxLCA0MSlcbmV4cG9ydCBjb25zdCByZWQgPSByZ2IoMjA0LCAwLCAwKVxuZXhwb3J0IGNvbnN0IGRhcmtSZWQgPSByZ2IoMTY0LCAwLCAwKVxuXG5leHBvcnQgY29uc3QgbGlnaHRPcmFuZ2UgPSByZ2IoMjUyLCAxNzUsIDYyKVxuZXhwb3J0IGNvbnN0IG9yYW5nZSA9IHJnYigyNDUsIDEyMSwgMClcbmV4cG9ydCBjb25zdCBkYXJrT3JhbmdlID0gcmdiKDIwNiwgOTIsIDApXG5cbmV4cG9ydCBjb25zdCBsaWdodFllbGxvdyA9IHJnYigyNTUsIDIzMywgNzkpXG5leHBvcnQgY29uc3QgeWVsbG93ID0gcmdiKDIzNywgMjEyLCAwKVxuZXhwb3J0IGNvbnN0IGRhcmtZZWxsb3cgPSByZ2IoMTk2LCAxNjAsIDApXG5cbmV4cG9ydCBjb25zdCBsaWdodEdyZWVuID0gcmdiKDEzOCwgMjI2LCA1MilcbmV4cG9ydCBjb25zdCBncmVlbiA9IHJnYigxMTUsIDIxMCwgMjIpXG5leHBvcnQgY29uc3QgZGFya0dyZWVuID0gcmdiKDc4LCAxNTQsIDYpXG5cbmV4cG9ydCBjb25zdCBsaWdodEJsdWUgPSByZ2IoMTE0LCAxNTksIDIwNylcbmV4cG9ydCBjb25zdCBibHVlID0gcmdiKDUyLCAxMDEsIDE2NClcbmV4cG9ydCBjb25zdCBkYXJrQmx1ZSA9IHJnYigzMiwgNzQsIDEzNSlcblxuZXhwb3J0IGNvbnN0IGxpZ2h0UHVycGxlID0gcmdiKDE3MywgMTI3LCAxNjgpXG5leHBvcnQgY29uc3QgcHVycGxlID0gcmdiKDExNywgODAsIDEyMylcbmV4cG9ydCBjb25zdCBkYXJrUHVycGxlID0gcmdiKDkyLCA1MywgMTAyKVxuXG5leHBvcnQgY29uc3QgbGlnaHRCcm93biA9IHJnYigyMzMsIDE4NSwgMTEwKVxuZXhwb3J0IGNvbnN0IGJyb3duID0gcmdiKDE5MywgMTI1LCAxNylcbmV4cG9ydCBjb25zdCBkYXJrQnJvd24gPSByZ2IoMTQzLCA4OSwgMilcblxuZXhwb3J0IGNvbnN0IGJsYWNrID0gcmdiKDAsIDAsIDApXG5leHBvcnQgY29uc3Qgd2hpdGUgPSByZ2IoMjU1LCAyNTUsIDI1NSlcblxuZXhwb3J0IGNvbnN0IGxpZ2h0R3JleSA9IHJnYigyMzgsIDIzOCwgMjM2KVxuZXhwb3J0IGNvbnN0IGdyZXkgPSByZ2IoMjExLCAyMTUsIDIwNylcbmV4cG9ydCBjb25zdCBkYXJrR3JleSA9IHJnYigxODYsIDE4OSwgMTgyKVxuXG5leHBvcnQgY29uc3QgbGlnaHRDaGFyY29hbCA9IHJnYigxMzYsIDEzOCwgMTMzKVxuZXhwb3J0IGNvbnN0IGNoYXJjb2FsID0gcmdiKDg1LCA4NywgODMpXG5leHBvcnQgY29uc3QgZGFya0NoYXJjb2FsID0gcmdiKDQ2LCA1MiwgNTQpXG5cbmNvbnN0IGhzbGEycmdiYSA9IChcbiAgaHVlOiBGbG9hdCxcbiAgc2F0dXJhdGlvbjogRmxvYXQsXG4gIGxpZ2h0bmVzczogRmxvYXQsXG4gIGFscGhhOiBGbG9hdFxuKTogUkdCQSA9PiB7XG4gIGNvbnN0IGNocm9tYSA9ICgxIC0gTWF0aC5hYnMoMiAqIGxpZ2h0bmVzcyAtIDEpKSAqIHNhdHVyYXRpb25cbiAgY29uc3QgaCA9IGh1ZSAvIGRlZ3JlZXMoNjApXG4gIGNvbnN0IHggPSBjaHJvbWEgKiAoMSAtIE1hdGguYWJzKGZtb2QoaCwgMiAtIDEpKSlcblxuICBjb25zdCBbciwgZywgYl0gPSBoIDwgMFxuICAgID8gWzAsIDAsIDBdXG4gICAgOiBoIDwgMVxuICAgICAgPyBbY2hyb21hLCB4LCAwXVxuICAgICAgOiBoIDwgMlxuICAgICAgICA/IFt4LCBjaHJvbWEsIDBdXG4gICAgICAgIDogaCA8IDNcbiAgICAgICAgICA/IFswLCBjaHJvbWEsIHhdXG4gICAgICAgICAgOiBoIDwgNFxuICAgICAgICAgICAgPyBbMCwgeCwgY2hyb21hXVxuICAgICAgICAgICAgOiBoIDwgNSA/IFt4LCAwLCBjaHJvbWFdIDogaCA8IDYgPyBbY2hyb21hLCAwLCB4XSA6IFswLCAwLCAwXVxuXG4gIGNvbnN0IG0gPSBsaWdodG5lc3MgLSBjaHJvbWEgLyAyXG5cbiAgY29uc3QgY29sb3IgPSBuZXcgUkdCQUNvbG9yKFxuICAgIE1hdGgucm91bmQoMjU1ICogKHIgKyBtKSksXG4gICAgTWF0aC5yb3VuZCgyNTUgKiAoZyArIG0pKSxcbiAgICBNYXRoLnJvdW5kKDI1NSAqIChiICsgbSkpLFxuICAgIGFscGhhXG4gIClcblxuICByZXR1cm4gY29sb3Jcbn1cblxuY29uc3QgcmdiYTJoc2xhID0gKHJlZDogSW50LCBncmVlbjogSW50LCBibHVlOiBJbnQsIGFscGhhOiBGbG9hdCk6IEhTTEEgPT4ge1xuICBjb25zdCBbciwgZywgYl0gPSBbcmVkIC8gMjU1LCBncmVlbiAvIDI1NSwgYmx1ZSAvIDI1NV1cbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgociwgZyksIGIpXG4gIGNvbnN0IG1pbiA9IE1hdGgubWluKE1hdGgubWluKHIsIGcpLCBiKVxuICBjb25zdCBkZWx0YSA9IG1heCAtIG1pblxuXG4gIGNvbnN0IGggPSBtYXggPT09IHJcbiAgICA/IGZtb2QoKGcgLSBiKSAvIGRlbHRhLCA2KVxuICAgIDogbWF4ID09PSBnID8gKGIgLSByKSAvIGRlbHRhICsgMiA6IChyIC0gZykgLyBkZWx0YSArIDRcbiAgY29uc3QgaHVlID0gZGVncmVlcyg2MCkgKiBoXG5cbiAgY29uc3QgbGlnaHRuZXNzID0gKG1heCArIG1pbikgLyAyXG4gIGNvbnN0IHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPT09IDBcbiAgICA/IDBcbiAgICA6IGRlbHRhIC8gKDEgLSBNYXRoLmFicygyICogbGlnaHRuZXNzIC0gMSkpXG5cbiAgcmV0dXJuIG5ldyBIU0xBQ29sb3IoaHVlLCBsaWdodG5lc3MsIHNhdHVyYXRpb24sIGFscGhhKVxufVxuXG4vKipcbiAqIENvbnZlcnQgZ2l2ZW4gY29sb3IgaW50byB0aGUgSFNMIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHRvSFNMOiAoY29sb3I6IENvbG9yKSA9PiBIU0xBID0gbWF0Y2goe1xuICBSR0JBOiAoeyByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSB9KSA9PiByZ2JhMmhzbGEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLFxuICByZ2JhOiByZ2JhMmhzbGEsXG4gIHJnYjogKHJlZCwgZ3JlZW4sIGJsdWUpID0+IHJnYmEyaHNsYShyZWQsIGdyZWVuLCBibHVlLCAxKSxcbiAgSFNMQTogaHNsYSA9PiBoc2xhLFxuICBoc2xhOiBoc2xhLFxuICBoc2w6IGhzbCxcbiAgXzogY3Jhc2hcbn0pXG5cbi8qKlxuICogQ29udmVydCBnaXZlbiBjb2xvciBpbnRvIHRoZSBSR0IgZm9ybWF0LlxuICovXG5leHBvcnQgY29uc3QgdG9SR0I6IChjb2xvcjogQ29sb3IpID0+IFJHQkEgPSBtYXRjaCh7XG4gIEhTTEE6ICh7IGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCBhbHBoYSB9KSA9PlxuICAgIGhzbGEycmdiYShodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcywgYWxwaGEpLFxuICBoc2xhOiBoc2xhMnJnYmEsXG4gIGhzbDogKGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzKSA9PiBoc2xhMnJnYmEoaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIDEpLFxuICBSR0JBOiByZ2JhID0+IHJnYmEsXG4gIHJnYmE6IHJnYmEsXG4gIHJnYjogcmdiLFxuICBfOiBjcmFzaFxufSlcblxuLyoqXG4gKiBQcm9kdWNlIGEgXCJjb21wbGVtZW50YXJ5IGNvbG9yXCIuIFRoZSB0d28gY29sb3JzIHdpbGxcbiAqIGFjY2VudCBlYWNoIG90aGVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHJvdGF0aW5nIHRoZSBodWUgYnkgMTgwZGVnO1xuICovXG5leHBvcnQgY29uc3QgY29tcGxlbWVudDogKGNvbG9yOiBDb2xvcikgPT4gQ29sb3IgPSBtYXRjaCh7XG4gIEhTTEE6ICh7IGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCBhbHBoYSB9KSA9PlxuICAgIEhTTEFDb2xvci5jb21wbGVtZW50KGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCBhbHBoYSksXG4gIGhzbGE6IEhTTEFDb2xvci5jb21wbGVtZW50LFxuICBoc2w6IChodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcykgPT5cbiAgICBIU0xBQ29sb3IuY29tcGxlbWVudChodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcywgMSksXG4gIFJHQkE6ICh7IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhIH0pID0+XG4gICAgUkdCQUNvbG9yLmNvbXBsZW1lbnQocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLFxuICByZ2JhOiBSR0JBQ29sb3IuY29tcGxlbWVudCxcbiAgcmdiOiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gUkdCQUNvbG9yLmNvbXBsZW1lbnQocmVkLCBncmVlbiwgYmx1ZSwgMSksXG4gIF86IGNyYXNoXG59KVxuIl19
;