{"version":3,"sources":["../src/modules/constants.ts","../src/modules/invariant.ts","../src/modules/css-colors.ts","../src/modules/validators.ts","../src/format-hex.ts","../src/modules/utils.ts","../src/modules/hex-utils.ts","../src/converters/hex2rgb.ts","../src/converters/index.ts","../src/converters/rgb2hsl.ts","../src/converters/hex2hsl.ts","../src/converters/rgb2oklab.ts","../src/converters/hex2oklab.ts","../src/converters/oklab2oklch.ts","../src/converters/rgb2oklch.ts","../src/converters/hex2oklch.ts","../src/modules/hue2rgb.ts","../src/converters/hsl2rgb.ts","../src/converters/rgb2hex.ts","../src/converters/hsl2hex.ts","../src/converters/hsl2oklab.ts","../src/converters/hsl2oklch.ts","../src/converters/oklab2rgb.ts","../src/converters/oklab2hex.ts","../src/converters/oklab2hsl.ts","../src/converters/oklch2oklab.ts","../src/converters/oklch2rgb.ts","../src/converters/oklch2hex.ts","../src/converters/oklch2hsl.ts","../src/extract-color-parts.ts","../src/parse-css.ts","../src/apca.ts","../src/brightness-difference.ts","../src/chroma.ts","../src/color-difference.ts","../src/luminance.ts","../src/contrast.ts","../src/compare.ts","../src/format-css.ts","../src/modules/updater.ts","../src/darken.ts","../src/desaturate.ts","../src/grayscale.ts","../src/rotate.ts","../src/invert.ts","../src/lighten.ts","../src/mix.ts","../src/modules/parse-color.ts","../src/opacify.ts","../src/opacity.ts","../src/readable-color.ts","../src/saturate.ts","../src/transparentize.ts","../src/colorizr.ts","../src/convert.ts","../src/get-color-type.ts","../src/is-valid-color.ts","../src/name.ts","../src/p3.ts","../src/palette.ts","../src/random.ts","../src/readable-color-apca.ts","../src/scale.ts","../src/scheme.ts"],"sourcesContent":["import { ColorKeysTuple, ColorModelKey } from '~/types';\n\nexport const COLOR_KEYS: Record<ColorModelKey, ColorKeysTuple> = {\n  hsl: ['h', 's', 'l'],\n  oklab: ['l', 'a', 'b'],\n  oklch: ['l', 'c', 'h'],\n  rgb: ['r', 'g', 'b'],\n};\nexport const COLOR_MODELS: ColorModelKey[] = ['hsl', 'oklab', 'oklch', 'rgb'];\nexport const DEG2RAD = Math.PI / 180;\nexport const LAB_TO_LMS = {\n  l: [0.3963377773761749, 0.2158037573099136],\n  m: [-0.1055613458156586, -0.0638541728258133],\n  s: [-0.0894841775298119, -1.2914855480194092],\n};\nexport const LRGB_TO_LMS = {\n  l: [0.4122214708, 0.5363325363, 0.0514459929],\n  m: [0.2119034982, 0.6806995451, 0.1073969566],\n  s: [0.0883024619, 0.2817188376, 0.6299787005],\n};\nexport const LSM_TO_LAB = {\n  l: [0.2104542553, 0.793617785, 0.0040720468],\n  a: [1.9779984951, 2.428592205, 0.4505937099],\n  b: [0.0259040371, 0.7827717662, 0.808675766],\n};\nexport const LSM_TO_RGB = {\n  r: [4.0767416360759583, -3.3077115392580629, 0.2309699031821043],\n  g: [-1.2684379732850315, 2.6097573492876882, -0.341319376002657],\n  b: [-0.0041960761386756, -0.7034186179359362, 1.7076146940746117],\n};\nexport const SRGB_TO_P3 = [\n  [0.8224270476, 0.1775729524, 0],\n  [0.0331008087, 0.9668991913, 0],\n  [0.0170720188, 0.0723477973, 0.9105801839],\n];\nexport const PRECISION = 5;\nexport const RAD2DEG = 180 / Math.PI;\n\nexport const MESSAGES = {\n  alpha: 'alpha must be a number between 0 and 1',\n  alphaAdjustment: 'alpha must be a number between -1 and 1',\n  amount: 'amount must be a number between 0 and 100',\n  colorRequired: 'color is required',\n  degreesRange: 'degrees must be a number between -360 and 360',\n  hueArgs: 'point, chroma and h are required',\n  hueRange: 'hue must be a number between 0 and 360',\n  input: 'input is required',\n  inputHex: 'input is required and must be a hex',\n  inputNumber: 'input is required and must be a number',\n  inputString: 'input is required and must be a string',\n  invalid: 'invalid input',\n  invalidColor: 'invalid color',\n  invalidCSS: 'invalid CSS string',\n  invalidHex: 'invalid hex',\n  invalidKey: 'invalid key',\n  invalidModel: 'invalid model',\n  invalidRange: 'color value out of range',\n  left: 'left is required and must be a string',\n  lightnessRange: 'lightness must be a number between 0 and 1',\n  options: 'invalid options',\n  paletteSize: 'palette size must be at least 2',\n  ratioRange: 'ratio must be a number between 0 and 1',\n  right: 'right is required and must be a string',\n  threshold: 'threshold must be a number between 0 and 255',\n  thresholdNormalized: 'threshold must be a number between 0 and 1',\n} as const;\n\nexport const MONOCHROMATIC_LIGHTNESS_MAX = 80;\n","/**\n * Assert a condition and throw an error if false.\n *\n * @param condition - The condition to assert.\n * @param message - The error message if condition is false.\n * @throws Error with name 'colorizr' if condition is false.\n */\nexport function invariant(condition: boolean, message: string): asserts condition {\n  if (condition) {\n    return;\n  }\n\n  if (process.env.NODE_ENV !== 'production') {\n    if (message === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  const error = !message\n    ? new Error(\n        'Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.',\n      )\n    : new Error(message);\n\n  error.name = 'colorizr';\n\n  throw error;\n}\n","/**\n * CSS named colors\n */\n\nexport type CSSColor = keyof typeof cssColors;\n\nexport const cssColors = {\n  aliceblue: '#f0f8ff',\n  antiquewhite: '#faebd7',\n  aqua: '#00ffff',\n  aquamarine: '#7fffd4',\n  azure: '#f0ffff',\n  beige: '#f5f5dc',\n  bisque: '#ffe4c4',\n  black: '#000000',\n  blanchedalmond: '#ffebcd',\n  blue: '#0000ff',\n  blueviolet: '#8a2be2',\n  brown: '#a52a2a',\n  burlywood: '#deb887',\n  cadetblue: '#5f9ea0',\n  chartreuse: '#7fff00',\n  chocolate: '#d2691e',\n  coral: '#ff7f50',\n  cornflowerblue: '#6495ed',\n  cornsilk: '#fff8dc',\n  crimson: '#dc143c',\n  cyan: '#00ffff',\n  darkblue: '#00008b',\n  darkcyan: '#008b8b',\n  darkgoldenrod: '#b8860b',\n  darkgray: '#a9a9a9',\n  darkgreen: '#006400',\n  darkkhaki: '#bdb76b',\n  darkmagenta: '#8b008b',\n  darkolivegreen: '#556b2f',\n  darkorange: '#ff8c00',\n  darkorchid: '#9932cc',\n  darkred: '#8b0000',\n  darksalmon: '#e9967a',\n  darkseagreen: '#8fbc8f',\n  darkslateblue: '#483d8b',\n  darkslategray: '#2f4f4f',\n  darkslategrey: '#2f4f4f',\n  darkturquoise: '#00ced1',\n  darkviolet: '#9400d3',\n  deeppink: '#ff1493',\n  deepskyblue: '#00bfff',\n  dimgray: '#696969',\n  dimgrey: '#696969',\n  dodgerblue: '#1e90ff',\n  firebrick: '#b22222',\n  floralwhite: '#fffaf0',\n  forestgreen: '#228b22',\n  fuchsia: '#ff00ff',\n  gainsboro: '#dcdcdc',\n  ghostwhite: '#f8f8ff',\n  gold: '#ffd700',\n  goldenrod: '#daa520',\n  gray: '#808080',\n  grey: '#808080',\n  green: '#008000',\n  greenyellow: '#adff2f',\n  honeydew: '#f0fff0',\n  hotpink: '#ff69b4',\n  indianred: '#cd5c5c',\n  indigo: '#4b0082',\n  ivory: '#fffff0',\n  khaki: '#f0e68c',\n  lavender: '#e6e6fa',\n  lavenderblush: '#fff0f5',\n  lawngreen: '#7cfc00',\n  lemonchiffon: '#fffacd',\n  lightblue: '#add8e6',\n  lightcoral: '#f08080',\n  lightcyan: '#e0ffff',\n  lightgoldenrodyellow: '#fafad2',\n  lightgray: '#d3d3d3',\n  lightgreen: '#90ee90',\n  lightgrey: '#d3d3d3',\n  lightpink: '#ffb6c1',\n  lightsalmon: '#ffa07a',\n  lightseagreen: '#20b2aa',\n  lightskyblue: '#87cefa',\n  lightslategray: '#778899',\n  lightslategrey: '#778899',\n  lightsteelblue: '#b0c4de',\n  lightyellow: '#ffffe0',\n  lime: '#00ff00',\n  limegreen: '#32cd32',\n  linen: '#faf0e6',\n  magenta: '#ff00ff',\n  maroon: '#800000',\n  mediumaquamarine: '#66cdaa',\n  mediumblue: '#0000cd',\n  mediumorchid: '#ba55d3',\n  mediumpurple: '#9370db',\n  mediumseagreen: '#3cb371',\n  mediumslateblue: '#7b68ee',\n  mediumspringgreen: '#00fa9a',\n  mediumturquoise: '#48d1cc',\n  mediumvioletred: '#c71585',\n  midnightblue: '#191970',\n  mintcream: '#f5fffa',\n  mistyrose: '#ffe4e1',\n  moccasin: '#ffe4b5',\n  navajowhite: '#ffdead',\n  navy: '#000080',\n  oldlace: '#fdf5e6',\n  olive: '#808000',\n  olivedrab: '#6b8e23',\n  orange: '#ffa500',\n  orangered: '#ff4500',\n  orchid: '#da70d6',\n  palegoldenrod: '#eee8aa',\n  palegreen: '#98fb98',\n  paleturquoise: '#afeeee',\n  palevioletred: '#db7093',\n  papayawhip: '#ffefd5',\n  peachpuff: '#ffdab9',\n  peru: '#cd853f',\n  pink: '#ffc0cb',\n  plum: '#dda0dd',\n  powderblue: '#b0e0e6',\n  purple: '#800080',\n  rebeccapurple: '#663399',\n  red: '#ff0000',\n  rosybrown: '#bc8f8f',\n  royalblue: '#4169e1',\n  saddlebrown: '#8b4513',\n  salmon: '#fa8072',\n  sandybrown: '#f4a460',\n  seagreen: '#2e8b57',\n  seashell: '#fff5ee',\n  sienna: '#a0522d',\n  silver: '#c0c0c0',\n  skyblue: '#87ceeb',\n  slateblue: '#6a5acd',\n  slategray: '#708090',\n  slategrey: '#708090',\n  snow: '#fffafa',\n  springgreen: '#00ff7f',\n  steelblue: '#4682b4',\n  tan: '#d2b48c',\n  teal: '#008080',\n  thistle: '#d8bfd8',\n  tomato: '#ff6347',\n  turquoise: '#40e0d0',\n  violet: '#ee82ee',\n  wheat: '#f5deb3',\n  white: '#ffffff',\n  whitesmoke: '#f5f5f5',\n  yellow: '#ffff00',\n  yellowgreen: '#9acd32',\n};\n","import { COLOR_KEYS } from '~/modules/constants';\nimport { CSSColor, cssColors } from '~/modules/css-colors';\n\nimport { ColorModel, HEX, HSL, LAB, LCH, PlainObject, RGB } from '~/types';\n\nconst hexRegex = /^#(?:[\\da-f]{3,4}|[\\da-f]{6,8})$/i;\n\nexport function hasValidMatches(input: unknown): input is string[] {\n  return Array.isArray(input) && input.length === 6;\n}\n\nexport function isHex(input: unknown): input is HEX {\n  if (!isString(input)) {\n    return false;\n  }\n\n  return hexRegex.test(input);\n}\n\n/**\n * Check if an object contains HSL values\n * The input must be an object with keys 'h', 's', and 'l'\n * with values between 0 and 360 for hue or 0 and 100 for the others.\n */\nexport function isHSL(input: unknown): input is HSL {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  const entries = Object.entries(input);\n\n  return (\n    !!entries.length &&\n    entries.every(([key, value]) => {\n      if (key === 'h') {\n        return value >= 0 && value <= 360;\n      }\n\n      if (key === 'alpha') {\n        return value >= 0 && value <= 1;\n      }\n\n      return COLOR_KEYS.hsl.includes(key) && value >= 0 && value <= 100;\n    })\n  );\n}\n\n/**\n * Check if an object contains LAB values\n * The input must be an object with keys 'l', 'a', and 'b' with values between -1 and 1.\n */\nexport function isLAB(input: unknown): input is LAB {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  const entries = Object.entries(input);\n\n  return (\n    !!entries.length &&\n    entries.every(([key, value]) => {\n      if (key === 'l') {\n        return value >= 0 && value <= 100;\n      }\n\n      if (key === 'alpha') {\n        return value >= 0 && value <= 1;\n      }\n\n      return COLOR_KEYS.oklab.includes(key) && value >= -1 && value <= 1;\n    })\n  );\n}\n\n/**\n * Check if an object contains LAB values\n * The input must be an object with keys 'l', 'c', and 'h' with values between 0 and 360.\n */\nexport function isLCH(input: unknown): input is LCH {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  const entries = Object.entries(input);\n\n  return (\n    !!entries.length &&\n    entries.every(([key, value]) => {\n      if (key === 'l') {\n        return value >= 0 && value <= 100;\n      }\n\n      if (key === 'alpha') {\n        return value >= 0 && value <= 1;\n      }\n\n      return COLOR_KEYS.oklch.includes(key) && value >= 0 && value <= (key === 'h' ? 360 : 1);\n    })\n  );\n}\n\n/**\n * Check if the input is a CSS named color\n */\nexport function isNamedColor(input: unknown): input is CSSColor {\n  return isString(input) && Object.keys(cssColors).includes(input.toLowerCase());\n}\n\n/**\n * Check if the input is a number and not NaN\n */\nexport function isNumber(input: unknown): input is number {\n  return typeof input === 'number' && !Number.isNaN(input);\n}\n\n/**\n * Check if the input is a number within a specific range (inclusive)\n */\nexport function isNumberInRange(input: unknown, min: number, max: number): input is number {\n  return isNumber(input) && input >= min && input <= max;\n}\n\n/**\n * Check if the input is an object\n */\nexport function isPlainObject(input: unknown): input is PlainObject {\n  if (!input) {\n    return false;\n  }\n\n  const { toString } = Object.prototype;\n  const prototype = Object.getPrototypeOf(input);\n\n  return (\n    toString.call(input) === '[object Object]' &&\n    (prototype === null || prototype === Object.getPrototypeOf({}))\n  );\n}\n\n/**\n * Check if an object contains RGB values.\n * The input must be an object with keys 'r', 'g', and 'b' with values between 0 and 255.\n */\nexport function isRGB(input: unknown): input is RGB {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  const entries = Object.entries(input);\n\n  return (\n    !!entries.length &&\n    entries.every(([key, value]) => {\n      if (key === 'alpha') {\n        return value >= 0 && value <= 1;\n      }\n\n      return COLOR_KEYS.rgb.includes(key) && value >= 0 && value <= 255;\n    })\n  );\n}\n\n/**\n * Check if the input is a string\n */\nexport function isString(input: unknown, validate = true): input is string {\n  const isValid = typeof input === 'string';\n\n  if (validate) {\n    return isValid && !!input.trim().length;\n  }\n\n  return isValid;\n}\n\nexport function isValidColorModel<T extends ColorModel>(input: T): input is T {\n  return isHSL(input) || isRGB(input) || isLAB(input) || isLCH(input);\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex } from '~/modules/validators';\n\nimport { HEX } from '~/types';\n\n/**\n * Normalize a hex color string to 6 or 8 characters.\n *\n * @param input - The hex color string (3, 4, 6, or 8 characters).\n * @returns The normalized hex color string.\n */\nexport default function formatHex(input: string): HEX {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  let color = input.replace('#', '');\n\n  if (color.length === 3 || color.length === 4) {\n    const values = [...color];\n\n    color = '';\n\n    values.forEach(d => {\n      color += `${d}${d}`;\n    });\n  }\n\n  const hex = `#${color}`;\n\n  invariant(isHex(hex), MESSAGES.invalidHex);\n\n  return hex;\n}\n","import { COLOR_KEYS, COLOR_MODELS, MESSAGES, PRECISION } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport {\n  isHSL,\n  isLAB,\n  isLCH,\n  isNumber,\n  isPlainObject,\n  isRGB,\n  isValidColorModel,\n} from '~/modules/validators';\n\nimport {\n  ColorModel,\n  ColorModelKey,\n  ColorModelKeys,\n  ConverterParameters,\n  LAB,\n  LCH,\n  PlainObject,\n} from '~/types';\n\n/**\n * Add an alpha value to a color model.\n *\n * @param input - The color model object.\n * @param alpha - A number between 0 and 1 (values > 1 are divided by 100).\n * @returns The color model with alpha applied.\n */\nexport function addAlpha<T extends ColorModel>(input: T, alpha?: number): T {\n  invariant(isValidColorModel(input), MESSAGES.invalid);\n\n  let value = alpha;\n\n  if (value === undefined) {\n    return input;\n  }\n\n  /* v8 ignore next 3  -- @preserve */\n  if (value > 1) {\n    value /= 100;\n  }\n\n  if (value === 1) {\n    return input;\n  }\n\n  return { ...input, alpha: value };\n}\n\n/**\n * Clamp a value between a min and max.\n *\n * @param value - The value to clamp.\n * @param min - The minimum value (default: 0).\n * @param max - The maximum value (default: 100).\n * @returns The clamped value.\n */\nexport function clamp(value: number, min = 0, max = 100): number {\n  return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Constrain the degrees between 0 and 360.\n *\n * @param input - The base degrees value.\n * @param amount - The amount to add to the degrees.\n * @returns The constrained degrees value (0-360).\n */\nexport function constrainDegrees(input: number, amount: number): number {\n  invariant(isNumber(input), MESSAGES.inputNumber);\n\n  let value = input + amount;\n\n  if (value > 360) {\n    value %= 360;\n  }\n\n  if (value < 0) {\n    value += 360;\n  }\n\n  return Math.abs(value);\n}\n\n/**\n * Extract alpha from converter input.\n *\n * @param input - The converter parameters (object or tuple).\n * @returns The alpha value or undefined for tuple inputs.\n */\nexport function extractAlpha<T extends ColorModel>(\n  input: ConverterParameters<T>,\n): number | undefined {\n  if (Array.isArray(input)) {\n    return undefined;\n  }\n\n  return input.alpha;\n}\n\n/**\n * Limit values per type.\n *\n * @param input - The value to limit.\n * @param model - The color model ('hsl' or 'rgb').\n * @param key - The property key to limit.\n * @returns The limited value.\n */\nexport function limit<TModel extends Extract<ColorModelKey, 'hsl' | 'rgb'>>(\n  input: number,\n  model: TModel,\n  key: ColorModelKeys<TModel>,\n): number {\n  invariant(isNumber(input), MESSAGES.inputNumber);\n  invariant(COLOR_MODELS.includes(model), `${MESSAGES.invalidModel}${model ? `: ${model}` : ''}`);\n  invariant(COLOR_KEYS[model].includes(key), `${MESSAGES.invalidKey}${key ? `: ${key}` : ''}`);\n\n  switch (model) {\n    case 'hsl': {\n      invariant(COLOR_KEYS.hsl.includes(key), MESSAGES.invalidKey);\n\n      if (['l', 's'].includes(key)) {\n        return clamp(input);\n      }\n\n      return clamp(input, 0, 360);\n    }\n    case 'rgb': {\n      invariant(COLOR_KEYS.rgb.includes(key), MESSAGES.invalidKey);\n\n      return clamp(input, 0, 255);\n    }\n    /* v8 ignore next 3  -- @preserve */\n    default: {\n      throw new Error('Invalid inputs');\n    }\n  }\n}\n\n/**\n * Parse the input parameters for converters.\n *\n * @param input - The converter parameters (object or tuple).\n * @param model - The target color model.\n * @returns The parsed color model object.\n */\nexport function parseInput<T extends ColorModel>(\n  input: ConverterParameters<T>,\n  model: ColorModelKey,\n): T {\n  const keys = COLOR_KEYS[model];\n  const validator = {\n    hsl: isHSL,\n    oklab: isLAB,\n    oklch: isLCH,\n    rgb: isRGB,\n  };\n\n  invariant(isPlainObject(input) || Array.isArray(input), MESSAGES.invalid);\n\n  const value = Array.isArray(input)\n    ? ({ [keys[0]]: input[0], [keys[1]]: input[1], [keys[2]]: input[2] } as unknown as T)\n    : input;\n\n  invariant(validator[model](value), `${MESSAGES.invalidColor}: ${model}`);\n\n  return value;\n}\n\n/**\n * Creates an object composed of the picked source properties.\n *\n * @param input - The source object.\n * @param options - The property keys to pick.\n * @returns The new object with picked properties.\n */\nexport function pick(input: PlainObject, options: string[]): PlainObject {\n  if (!Array.isArray(options)) {\n    throw new TypeError('options must be an array');\n  }\n\n  return options\n    .filter(d => typeof input[d] !== 'undefined')\n    .reduce((acc: PlainObject, d) => {\n      acc[d] = input[d];\n\n      return acc;\n    }, {});\n}\n\n/**\n * Restrict the values to a certain number of digits.\n *\n * @param input - The LAB or LCH color model.\n * @param precision - The number of decimal places (default: 5).\n * @param forcePrecision - Whether to force the precision (default: true).\n * @returns The color model with restricted values.\n */\nexport function restrictValues<T extends LAB | LCH>(\n  input: T,\n  precision: number = PRECISION,\n  forcePrecision = true,\n): T {\n  const output = new Map(Object.entries(input));\n\n  for (const [key, value] of output.entries()) {\n    output.set(key, round(value, precision, forcePrecision));\n  }\n\n  return Object.fromEntries(output) as T;\n}\n\n/**\n * Round decimal numbers.\n *\n * @param input - The number to round.\n * @param precision - The number of decimal places (default: 2).\n * @param forcePrecision - Whether to force exact precision (default: true).\n * @returns The rounded number.\n */\nexport function round(input: number, precision = 2, forcePrecision = true): number {\n  if (!isNumber(input) || input === 0) {\n    return 0;\n  }\n\n  if (forcePrecision) {\n    const factor = 10 ** precision;\n\n    return Math.round(input * factor) / factor;\n  }\n\n  const absInput = Math.abs(input);\n\n  let digits = Math.abs(Math.ceil(Math.log(absInput) / Math.LN10));\n\n  if (digits === 0) {\n    digits = 2;\n  } else if (digits > precision) {\n    digits = precision;\n  }\n\n  let exponent = precision - (digits < 0 ? 0 : digits);\n\n  if (exponent <= 1 && precision > 1) {\n    exponent = 2;\n  } else if (exponent > precision || exponent === 0) {\n    exponent = precision;\n  }\n\n  const factor = 10 ** exponent;\n\n  return Math.round(input * factor) / factor;\n}\n\n/**\n * Log a warning in development mode.\n *\n * @param message - The warning message to log.\n */\nexport function warn(message: string): void {\n  if (process.env.NODE_ENV !== 'production') {\n    // eslint-disable-next-line no-console\n    console.warn(`[colorizr] ${message}`);\n  }\n}\n\n/**\n * Pre-computed step keys for each step count (3-20).\n *\n * Based on Tailwind CSS color scale conventions:\n * - Standard keys: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950\n * - 500 is typically the \"base\" color\n * - Lower numbers = lighter, higher numbers = darker (in light mode)\n *\n * Keys are symmetrically distributed to maintain visual balance.\n */\nconst STEP_KEYS: Record<number, number[]> = {\n  3: [100, 500, 900],\n  4: [100, 400, 600, 900],\n  5: [100, 300, 500, 700, 900],\n  6: [100, 200, 400, 600, 800, 900],\n  7: [100, 200, 400, 500, 600, 800, 900],\n  8: [100, 200, 300, 500, 600, 700, 800, 900],\n  9: [100, 200, 300, 400, 500, 600, 700, 800, 900],\n  10: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],\n  11: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950],\n  12: [50, 100, 150, 200, 300, 400, 500, 600, 700, 800, 900, 950],\n  13: [50, 100, 150, 200, 300, 400, 500, 600, 700, 800, 850, 900, 950],\n  14: [50, 100, 150, 200, 250, 300, 400, 500, 600, 700, 800, 850, 900, 950],\n  15: [50, 100, 150, 200, 250, 300, 400, 500, 600, 700, 750, 800, 850, 900, 950],\n  16: [50, 100, 150, 200, 250, 300, 350, 400, 500, 600, 700, 750, 800, 850, 900, 950],\n  17: [50, 100, 150, 200, 250, 300, 350, 400, 500, 600, 650, 700, 750, 800, 850, 900, 950],\n  18: [50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 600, 650, 700, 750, 800, 850, 900, 950],\n  19: [\n    50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950,\n  ],\n  20: [\n    50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950,\n    1000,\n  ],\n};\n\n/**\n * Get the step keys for a given step count.\n *\n * @param steps - The number of steps (clamped to 3-20).\n * @returns The array of step keys.\n */\nexport function getScaleStepKeys(steps: number): number[] {\n  const value = clamp(Math.round(steps), 3, 20);\n\n  return STEP_KEYS[value];\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isHex, isNumber, isNumberInRange } from '~/modules/validators';\n\nimport { HEX } from '~/types';\n\n/**\n * Add an alpha value to a hex string.\n *\n * @param input - The hex color string.\n * @param alpha - A number between 0 and 1.\n * @returns The hex color string with alpha.\n */\nexport function addAlphaToHex(input: string, alpha: number): HEX {\n  invariant(isHex(input), MESSAGES.inputHex);\n  invariant(isNumberInRange(alpha, 0, 1), MESSAGES.alpha);\n\n  if (alpha >= 1) {\n    return removeAlphaFromHex(input);\n  }\n\n  return `${removeAlphaFromHex(input)}${convertAlphaToHex(alpha)}` as HEX;\n}\n\n/**\n * Convert an alpha value to a hex value.\n *\n * @param input - A number between 0 and 1 (values > 1 are divided by 100).\n * @returns The two-character hex string.\n */\nexport function convertAlphaToHex(input: number): string {\n  invariant(isNumber(input), MESSAGES.inputNumber);\n\n  let alpha = input;\n\n  if (input > 1) {\n    alpha /= 100;\n  }\n\n  return Math.round(alpha * 255)\n    .toString(16)\n    .padStart(2, '0');\n}\n\n/**\n * Extract the alpha value from a hex string.\n *\n * @param input - The hex color string.\n * @returns The alpha value (0-1), defaults to 1 if no alpha present.\n */\nexport function extractAlphaFromHex(input: string): number {\n  invariant(isHex(input), MESSAGES.inputString);\n\n  const alpha = input.substring(7, 9);\n\n  if (!alpha) {\n    return 1;\n  }\n\n  return round(parseInt(alpha, 16) / 255);\n}\n\n/**\n * Convert a hexadecimal string to a number.\n *\n * @param input - The hexadecimal string.\n * @returns The numeric value.\n */\nexport function hexadecimalToNumber(input: string): number {\n  return round(parseInt(input, 16));\n}\n\n/**\n * Remove the alpha value from a hex string.\n *\n * @param input - The hex color string.\n * @returns The hex color string without alpha.\n */\nexport function removeAlphaFromHex(input: string): HEX {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  if (input.length === 5) {\n    return input.substring(0, 4) as HEX;\n  }\n\n  return input.substring(0, 7) as HEX;\n}\n","import formatHex from '~/format-hex';\nimport { MESSAGES } from '~/modules/constants';\nimport { extractAlphaFromHex } from '~/modules/hex-utils';\nimport { invariant } from '~/modules/invariant';\nimport { addAlpha } from '~/modules/utils';\nimport { isHex } from '~/modules/validators';\n\nimport { RGB } from '~/types';\n\n/**\n * Convert HEX to RGB.\n *\n * @param input - The hex color string.\n * @returns The RGB color object.\n */\nexport default function hex2rgb(input: string): RGB {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  const hex = formatHex(input).slice(1);\n  const alpha = extractAlphaFromHex(input);\n\n  return addAlpha(\n    {\n      r: parseInt(hex.charAt(0) + hex.charAt(1), 16),\n      g: parseInt(hex.charAt(2) + hex.charAt(3), 16),\n      b: parseInt(hex.charAt(4) + hex.charAt(5), 16),\n    },\n    alpha,\n  );\n}\n","export { default as hex2hsl } from '~/converters/hex2hsl';\nexport { default as hex2oklab } from '~/converters/hex2oklab';\nexport { default as hex2oklch } from '~/converters/hex2oklch';\nexport { default as hex2rgb } from '~/converters/hex2rgb';\n\nexport { default as hsl2hex } from '~/converters/hsl2hex';\nexport { default as hsl2oklab } from '~/converters/hsl2oklab';\nexport { default as hsl2oklch } from '~/converters/hsl2oklch';\nexport { default as hsl2rgb } from '~/converters/hsl2rgb';\n\nexport { default as oklab2hex } from '~/converters/oklab2hex';\nexport { default as oklab2hsl } from '~/converters/oklab2hsl';\nexport { default as oklab2oklch } from '~/converters/oklab2oklch';\nexport { default as oklab2rgb } from '~/converters/oklab2rgb';\n\nexport { default as oklch2hex } from '~/converters/oklch2hex';\nexport { default as oklch2hsl } from '~/converters/oklch2hsl';\nexport { default as oklch2oklab } from '~/converters/oklch2oklab';\nexport { default as oklch2rgb } from '~/converters/oklch2rgb';\n\nexport { default as rgb2hex } from '~/converters/rgb2hex';\nexport { default as rgb2hsl } from '~/converters/rgb2hsl';\nexport { default as rgb2oklab } from '~/converters/rgb2oklab';\nexport { default as rgb2oklch } from '~/converters/rgb2oklch';\n","import { addAlpha, extractAlpha, limit, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, RGB } from '~/types';\n\n/**\n * Convert RGB to HSL.\n *\n * @param input - The RGB color object or tuple.\n * @returns The HSL color object.\n */\nexport default function rgb2hsl(input: ConverterParameters<RGB>): HSL {\n  const value = parseInput(input, 'rgb');\n  const alpha = extractAlpha(input);\n\n  const rLimit = limit(value.r, 'rgb', 'r') / 255;\n  const gLimit = limit(value.g, 'rgb', 'g') / 255;\n  const bLimit = limit(value.b, 'rgb', 'b') / 255;\n\n  const min = Math.min(rLimit, gLimit, bLimit);\n  const max = Math.max(rLimit, gLimit, bLimit);\n  const delta = max - min;\n\n  let h = 0;\n  let s;\n  const l = (max + min) / 2;\n  let rate;\n\n  switch (max) {\n    case rLimit:\n      rate = !delta ? 0 : (gLimit - bLimit) / delta;\n      h = 60 * rate;\n      break;\n    case gLimit:\n      rate = (bLimit - rLimit) / delta;\n      h = 60 * rate + 120;\n      break;\n    case bLimit:\n      rate = (rLimit - gLimit) / delta;\n      h = 60 * rate + 240;\n      break;\n    /* v8 ignore next 2  -- @preserve */\n    default:\n      break;\n  }\n\n  if (h < 0) {\n    h = 360 + h;\n  }\n\n  if (min === max) {\n    s = 0;\n  } else {\n    s = l < 0.5 ? delta / (2 * l) : delta / (2 - 2 * l);\n  }\n\n  return addAlpha(\n    {\n      h: Math.abs(+(h % 360).toFixed(2)),\n      s: +(s * 100).toFixed(2),\n      l: +(l * 100).toFixed(2),\n    },\n    alpha,\n  );\n}\n","import hex2rgb from '~/converters/hex2rgb';\nimport rgb2hsl from '~/converters/rgb2hsl';\nimport { MESSAGES } from '~/modules/constants';\nimport { extractAlphaFromHex } from '~/modules/hex-utils';\nimport { invariant } from '~/modules/invariant';\nimport { addAlpha } from '~/modules/utils';\nimport { isHex } from '~/modules/validators';\n\nimport { HSL } from '~/types';\n\n/**\n * Convert HEX to HSL.\n *\n * @param input - The hex color string.\n * @returns The HSL color object.\n */\nexport default function hex2hsl(input: string): HSL {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  const alpha = extractAlphaFromHex(input);\n\n  return addAlpha(rgb2hsl(hex2rgb(input)), alpha);\n}\n","import { LRGB_TO_LMS, LSM_TO_LAB, PRECISION } from '~/modules/constants';\nimport { addAlpha, extractAlpha, parseInput, restrictValues } from '~/modules/utils';\n\nimport { ConverterParameters, LAB, RGB } from '~/types';\n\nconst { cbrt, sign } = Math;\n\nfunction rgb2lrgb(input: number) {\n  const abs = Math.abs(input);\n\n  if (abs < 0.04045) {\n    return input / 12.92;\n  }\n\n  return (sign(input) || 1) * ((abs + 0.055) / 1.055) ** 2.4;\n}\n\n/**\n * Convert RGB to OkLab.\n *\n * @param input - The RGB color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLab color object.\n */\nexport default function rgb2oklab(input: ConverterParameters<RGB>, precision = PRECISION): LAB {\n  const value = parseInput(input, 'rgb');\n  const alpha = extractAlpha(input);\n\n  const [lr, lg, lb] = [rgb2lrgb(value.r / 255), rgb2lrgb(value.g / 255), rgb2lrgb(value.b / 255)];\n  const l = cbrt(LRGB_TO_LMS.l[0] * lr + LRGB_TO_LMS.l[1] * lg + LRGB_TO_LMS.l[2] * lb);\n  const m = cbrt(LRGB_TO_LMS.m[0] * lr + LRGB_TO_LMS.m[1] * lg + LRGB_TO_LMS.m[2] * lb);\n  const s = cbrt(LRGB_TO_LMS.s[0] * lr + LRGB_TO_LMS.s[1] * lg + LRGB_TO_LMS.s[2] * lb);\n\n  const lab = restrictValues(\n    {\n      l: LSM_TO_LAB.l[0] * l + LSM_TO_LAB.l[1] * m - LSM_TO_LAB.l[2] * s,\n      a: LSM_TO_LAB.a[0] * l - LSM_TO_LAB.a[1] * m + LSM_TO_LAB.a[2] * s,\n      b: LSM_TO_LAB.b[0] * l + LSM_TO_LAB.b[1] * m - LSM_TO_LAB.b[2] * s,\n    },\n    precision,\n  );\n\n  return addAlpha(lab, alpha);\n}\n","import hex2rgb from '~/converters/hex2rgb';\nimport rgb2oklab from '~/converters/rgb2oklab';\nimport { MESSAGES } from '~/modules/constants';\nimport { extractAlphaFromHex } from '~/modules/hex-utils';\nimport { invariant } from '~/modules/invariant';\nimport { addAlpha } from '~/modules/utils';\nimport { isHex } from '~/modules/validators';\n\nimport { LAB } from '~/types';\n\n/**\n * Convert HEX to OkLab.\n *\n * @param input - The hex color string.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLab color object.\n */\nexport default function hex2oklab(input: string, precision?: number): LAB {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  const alpha = extractAlphaFromHex(input);\n\n  return addAlpha(rgb2oklab(hex2rgb(input), precision), alpha);\n}\n","import { RAD2DEG } from '~/modules/constants';\nimport { addAlpha, extractAlpha, parseInput, restrictValues, round } from '~/modules/utils';\n\nimport { ConverterParameters, LAB, LCH } from '~/types';\n\nconst { atan2, sqrt } = Math;\n\n/**\n * Convert OkLab to OkLCH.\n *\n * @param input - The OkLab color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLCH color object.\n */\nexport default function oklab2oklch(input: ConverterParameters<LAB>, precision?: number): LCH {\n  const { l, a, b } = restrictValues(parseInput(input, 'oklab'));\n  const alpha = extractAlpha(input);\n\n  const c = sqrt(a ** 2 + b ** 2);\n  let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n\n  if (round(c * 10000) === 0) {\n    h = 0;\n  }\n\n  return addAlpha(restrictValues({ l, c, h }, precision), alpha);\n}\n","import oklab2oklch from '~/converters/oklab2oklch';\nimport rgb2oklab from '~/converters/rgb2oklab';\nimport { addAlpha, extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, LCH, RGB } from '~/types';\n\n/**\n * Convert RGB to OkLCH.\n *\n * @param input - The RGB color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLCH color object.\n */\nexport default function rgb2oklch(input: ConverterParameters<RGB>, precision?: number): LCH {\n  const value = parseInput(input, 'rgb');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(oklab2oklch(rgb2oklab(value, precision), precision), alpha);\n}\n","import hex2rgb from '~/converters/hex2rgb';\nimport rgb2oklch from '~/converters/rgb2oklch';\nimport { MESSAGES } from '~/modules/constants';\nimport { extractAlphaFromHex } from '~/modules/hex-utils';\nimport { invariant } from '~/modules/invariant';\nimport { addAlpha } from '~/modules/utils';\nimport { isHex } from '~/modules/validators';\n\nimport { LCH } from '~/types';\n\n/**\n * Convert HEX to OkLCH.\n *\n * @param input - The hex color string.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLCH color object.\n */\nexport default function hex2oklch(input: string, precision?: number): LCH {\n  invariant(isHex(input), MESSAGES.inputHex);\n\n  const alpha = extractAlphaFromHex(input);\n\n  return addAlpha(rgb2oklch(hex2rgb(input), precision), alpha);\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isNumber } from '~/modules/validators';\n\n/**\n * Convert hue to RGB using chroma and median point.\n *\n * @param point - The median point value.\n * @param chroma - The chroma value.\n * @param h - The hue value (0-1).\n * @returns The RGB component value.\n */\nexport default function hue2rgb(point: number, chroma: number, h: number): number {\n  invariant(isNumber(point) && isNumber(chroma) && isNumber(h), MESSAGES.hueArgs);\n  let hue = h;\n\n  if (hue < 0) {\n    hue += 1;\n  }\n\n  if (hue > 1) {\n    hue -= 1;\n  }\n\n  if (hue < 1 / 6) {\n    return round(point + (chroma - point) * 6 * hue, 4);\n  }\n\n  if (hue < 1 / 2) {\n    return round(chroma, 4);\n  }\n\n  if (hue < 2 / 3) {\n    return round(point + (chroma - point) * (2 / 3 - hue) * 6, 4);\n  }\n\n  return round(point, 4);\n}\n","import hue2rgb from '~/modules/hue2rgb';\nimport { addAlpha, extractAlpha, parseInput, round } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, RGB } from '~/types';\n\n/**\n * Convert HSL to RGB.\n *\n * @param input - The HSL color object or tuple.\n * @returns The RGB color object.\n */\nexport default function hsl2rgb(input: ConverterParameters<HSL>): RGB {\n  const value = parseInput(input, 'hsl');\n  const alpha = extractAlpha(input);\n\n  const h = round(value.h) / 360;\n  const s = round(value.s) / 100;\n  const l = round(value.l) / 100;\n\n  let r;\n  let g;\n  let b;\n\n  let point;\n  let chroma;\n\n  if (s === 0) {\n    r = l;\n    g = l;\n    b = l;\n  } else {\n    chroma = l < 0.5 ? l * (1 + s) : l + s - l * s;\n    point = 2 * l - chroma;\n\n    r = hue2rgb(point, chroma, h + 1 / 3);\n    g = hue2rgb(point, chroma, h);\n    b = hue2rgb(point, chroma, h - 1 / 3);\n  }\n\n  return addAlpha(\n    {\n      r: Math.round(r * 255),\n      g: Math.round(g * 255),\n      b: Math.round(b * 255),\n    },\n    alpha,\n  );\n}\n","import { addAlphaToHex } from '~/modules/hex-utils';\nimport { extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HEX, RGB } from '~/types';\n\n/**\n * Convert RGB to HEX.\n *\n * @param input - The RGB color object or tuple.\n * @returns The hex color string.\n */\nexport default function rgb2hex(input: ConverterParameters<RGB>): HEX {\n  const rgb = parseInput(input, 'rgb');\n  const alpha = extractAlpha(input);\n\n  const hex: HEX = `#${[rgb.r, rgb.g, rgb.b]\n    .map(d => `0${Math.floor(d).toString(16)}`.slice(-2))\n    .join('')}`;\n\n  return alpha !== undefined && alpha < 1 ? addAlphaToHex(hex, alpha) : hex;\n}\n","import hsl2rgb from '~/converters/hsl2rgb';\nimport rgb2hex from '~/converters/rgb2hex';\nimport { addAlphaToHex } from '~/modules/hex-utils';\nimport { extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HEX, HSL } from '~/types';\n\n/**\n * Convert HSL to HEX.\n *\n * @param input - The HSL color object or tuple.\n * @returns The hex color string.\n */\nexport default function hsl2hex(input: ConverterParameters<HSL>): HEX {\n  const value = parseInput(input, 'hsl');\n  const alpha = extractAlpha(input);\n\n  const hex = rgb2hex(hsl2rgb(value));\n\n  return alpha !== undefined && alpha < 1 ? addAlphaToHex(hex, alpha) : hex;\n}\n","import hsl2rgb from '~/converters/hsl2rgb';\nimport rgb2oklab from '~/converters/rgb2oklab';\nimport { addAlpha, extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, LAB } from '~/types';\n\n/**\n * Convert HSL to OkLab.\n *\n * @param input - The HSL color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLab color object.\n */\nexport default function hsl2oklab(input: ConverterParameters<HSL>, precision?: number): LAB {\n  const value = parseInput(input, 'hsl');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(rgb2oklab(hsl2rgb(value), precision), alpha);\n}\n","import hsl2rgb from '~/converters/hsl2rgb';\nimport rgb2oklch from '~/converters/rgb2oklch';\nimport { addAlpha, extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, LCH } from '~/types';\n\n/**\n * Convert HSL to OkLCH.\n *\n * @param input - The HSL color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLCH color object.\n */\nexport default function hsl2oklch(input: ConverterParameters<HSL>, precision?: number): LCH {\n  const value = parseInput(input, 'hsl');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(rgb2oklch(hsl2rgb(value), precision), alpha);\n}\n","import { LAB_TO_LMS, LSM_TO_RGB } from '~/modules/constants';\nimport { addAlpha, clamp, extractAlpha, parseInput, round } from '~/modules/utils';\n\nimport { ConverterParameters, LAB, RGB } from '~/types';\n\nconst { abs } = Math;\n\nfunction lrgb2rgb(input: number) {\n  const absoluteNumber = abs(input);\n  const sign = input < 0 ? -1 : 1;\n\n  if (absoluteNumber > 0.0031308) {\n    return sign * (absoluteNumber ** (1 / 2.4) * 1.055 - 0.055);\n  }\n\n  return input * 12.92;\n}\n\n/**\n * Convert OkLab to RGB.\n *\n * @param input - The OkLab color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The RGB color object.\n */\nexport default function oklab2rgb(input: ConverterParameters<LAB>, precision = 0): RGB {\n  const { l: L, a: A, b: B } = parseInput(input, 'oklab');\n  const alpha = extractAlpha(input);\n\n  const l = (L + LAB_TO_LMS.l[0] * A + LAB_TO_LMS.l[1] * B) ** 3;\n  const m = (L + LAB_TO_LMS.m[0] * A + LAB_TO_LMS.m[1] * B) ** 3;\n  const s = (L + LAB_TO_LMS.s[0] * A + LAB_TO_LMS.s[1] * B) ** 3;\n\n  const r = 255 * lrgb2rgb(LSM_TO_RGB.r[0] * l + LSM_TO_RGB.r[1] * m + LSM_TO_RGB.r[2] * s);\n  const g = 255 * lrgb2rgb(LSM_TO_RGB.g[0] * l + LSM_TO_RGB.g[1] * m + LSM_TO_RGB.g[2] * s);\n  const b = 255 * lrgb2rgb(LSM_TO_RGB.b[0] * l + LSM_TO_RGB.b[1] * m + LSM_TO_RGB.b[2] * s);\n\n  return addAlpha(\n    {\n      r: clamp(round(r, precision), 0, 255),\n      g: clamp(round(g, precision), 0, 255),\n      b: clamp(round(b, precision), 0, 255),\n    },\n    alpha,\n  );\n}\n","import oklab2rgb from '~/converters/oklab2rgb';\nimport rgb2hex from '~/converters/rgb2hex';\nimport { addAlphaToHex } from '~/modules/hex-utils';\nimport { extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HEX, LAB } from '~/types';\n\n/**\n * Convert OkLab to HEX.\n *\n * @param input - The OkLab color object or tuple.\n * @returns The hex color string.\n */\nexport default function oklab2hex(input: ConverterParameters<LAB>): HEX {\n  const value = parseInput(input, 'oklab');\n  const alpha = extractAlpha(input);\n\n  const hex = rgb2hex(oklab2rgb(value));\n\n  return alpha !== undefined && alpha < 1 ? addAlphaToHex(hex, alpha) : hex;\n}\n","import oklab2rgb from '~/converters/oklab2rgb';\nimport rgb2hsl from '~/converters/rgb2hsl';\nimport { addAlpha, extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, LAB } from '~/types';\n\n/**\n * Convert OkLab to HSL.\n *\n * @param input - The OkLab color object or tuple.\n * @returns The HSL color object.\n */\nexport default function oklab2hsl(input: ConverterParameters<LAB>): HSL {\n  const value = parseInput(input, 'oklab');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(rgb2hsl(oklab2rgb(value)), alpha);\n}\n","/* eslint-disable prefer-const */\nimport { DEG2RAD } from '~/modules/constants';\nimport { addAlpha, extractAlpha, parseInput, restrictValues } from '~/modules/utils';\n\nimport { ConverterParameters, LAB, LCH } from '~/types';\n\nconst { sin, cos } = Math;\n\n/**\n * Convert OkLCH to OkLab.\n *\n * @param input - The OkLCH color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The OkLab color object.\n */\nexport default function oklch2oklab(input: ConverterParameters<LCH>, precision?: number): LAB {\n  /*\n  Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n  These formulas were invented by David Dalrymple to obtain maximum contrast without going\n  out of gamut if the parameters are in the range 0-1.\n\n  A saturation multiplier was added by Gregor Aisch\n  */\n  let { l, c, h } = parseInput(input, 'oklch');\n  const alpha = extractAlpha(input);\n\n  /* v8 ignore next 3  -- @preserve */\n  if (Number.isNaN(h) || h < 0) {\n    h = 0;\n  }\n\n  return addAlpha(\n    restrictValues({ l, a: c * cos(h * DEG2RAD), b: c * sin(h * DEG2RAD) }, precision),\n    alpha,\n  );\n}\n","import oklab2rgb from '~/converters/oklab2rgb';\nimport oklch2oklab from '~/converters/oklch2oklab';\nimport { addAlpha, extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, LCH, RGB } from '~/types';\n\n/**\n * Convert OkLCH to RGB.\n *\n * @param input - The OkLCH color object or tuple.\n * @param precision - The number of decimal places for the result.\n * @returns The RGB color object.\n */\nexport default function oklch2rgb(input: ConverterParameters<LCH>, precision = 0): RGB {\n  const value = parseInput(input, 'oklch');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(oklab2rgb(oklch2oklab(value), precision), alpha);\n}\n","import oklch2rgb from '~/converters/oklch2rgb';\nimport rgb2hex from '~/converters/rgb2hex';\nimport { addAlphaToHex } from '~/modules/hex-utils';\nimport { extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HEX, LCH } from '~/types';\n\n/**\n * Convert OkLCH to HEX.\n *\n * @param input - The OkLCH color object or tuple.\n * @returns The hex color string.\n */\nexport default function oklch2hex(input: ConverterParameters<LCH>): HEX {\n  const value = parseInput(input, 'oklch');\n  const alpha = extractAlpha(input);\n\n  const hex = rgb2hex(oklch2rgb(value));\n\n  return alpha !== undefined && alpha < 1 ? addAlphaToHex(hex, alpha) : hex;\n}\n","import oklch2rgb from '~/converters/oklch2rgb';\nimport rgb2hsl from '~/converters/rgb2hsl';\nimport { addAlpha, extractAlpha, parseInput } from '~/modules/utils';\n\nimport { ConverterParameters, HSL, LCH } from '~/types';\n\n/**\n * Convert OkLCH to HSL.\n *\n * @param input - The OkLCH color object or tuple.\n * @returns The HSL color object.\n */\nexport default function oklch2hsl(input: ConverterParameters<LCH>): HSL {\n  const value = parseInput(input, 'oklch');\n  const alpha = extractAlpha(input);\n\n  return addAlpha(rgb2hsl(oklch2rgb(value)), alpha);\n}\n","import hex2rgb from '~/converters/hex2rgb';\nimport { COLOR_KEYS, MESSAGES } from '~/modules/constants';\nimport { extractAlphaFromHex } from '~/modules/hex-utils';\nimport { invariant } from '~/modules/invariant';\nimport { hasValidMatches, isHex, isString } from '~/modules/validators';\n\nimport { ColorModelKey, PlainObject } from '~/types';\n\n// Regex components for parsing CSS color strings\nconst MODEL = '(rgb|hsl|oklab|oklch)a?';\nconst SEP = '(?:\\\\s*[,/]\\\\s*|\\\\s+)';\n// Accepts: numbers, percentages, 'none', and angle units (deg, grad, rad, turn)\nconst VALUE = '(none|[\\\\d%.-]+(?:deg|grad|rad|turn)?)';\n\nconst colorRegex = new RegExp(\n  `${MODEL}\\\\s*\\\\(\\\\s*${VALUE}${SEP}${VALUE}${SEP}${VALUE}(?:${SEP}${VALUE})?\\\\s*\\\\)`,\n  'i',\n);\n\nexport type ExtractColorPartsReturn = {\n  alpha?: number;\n  model: ColorModelKey;\n} & PlainObject<number>;\n\n/**\n * Convert angle value with units to degrees\n */\nfunction parseAngle(value: string): number {\n  const number_ = parseFloat(value);\n  let result: number;\n\n  if (value.endsWith('grad')) {\n    result = number_ * 0.9; // 400grad = 360deg\n  } else if (value.endsWith('rad')) {\n    result = number_ * (180 / Math.PI); // radians to degrees\n  } else if (value.endsWith('turn')) {\n    result = number_ * 360; // 1turn = 360deg\n  } else {\n    // 'deg' suffix or unitless - return as-is\n    result = number_;\n  }\n\n  // Round to 5 decimal places for consistency\n  return Math.round(result * 100000) / 100000;\n}\n\n/**\n * Extract the color parts from a CSS color string.\n * Hex colors are supported via conversion.\n *\n * @param input - The CSS color string.\n * @returns An object with the color model and component values.\n */\nexport default function extractColorParts(input: string): ExtractColorPartsReturn {\n  invariant(isString(input), MESSAGES.inputString);\n\n  if (isHex(input)) {\n    const keys = COLOR_KEYS.rgb;\n    const { r, g, b } = hex2rgb(input);\n    const alpha = extractAlphaFromHex(input);\n\n    return {\n      model: 'rgb' as ColorModelKey,\n      [keys[0]]: r,\n      [keys[1]]: g,\n      [keys[2]]: b,\n      alpha: alpha < 1 ? alpha : undefined,\n    } as ExtractColorPartsReturn;\n  }\n\n  const matches = colorRegex.exec(input);\n\n  invariant(hasValidMatches(matches), MESSAGES.invalidCSS);\n\n  const model = matches[1] as ColorModelKey;\n  const keys = COLOR_KEYS[model];\n  let alpha = matches[5] ? parseFloat(matches[5]) : 1;\n\n  if (alpha > 1) {\n    alpha /= 100;\n  }\n\n  // Parse values and convert percentages/angles for color models\n  const parseValue = (value: string, index: number): number => {\n    // Handle 'none' keyword - treated as 0 for rendering (CSS Color Level 4)\n    if (value === 'none') {\n      return 0;\n    }\n\n    // Handle hue values with angle units (HSL index 0, OkLCH index 2)\n    const isHue = (model === 'hsl' && index === 0) || (model === 'oklch' && index === 2);\n\n    if (isHue) {\n      return parseAngle(value);\n    }\n\n    const parsedValue = parseFloat(value);\n    const isPercent = value.includes('%');\n\n    if (!isPercent) {\n      return parsedValue;\n    }\n\n    // Convert percentages based on color model and position\n    if (model === 'oklch') {\n      // oklch: L (0-100), C (0-0.4), H (0-360)\n      if (index === 1) {\n        // Chroma: 100% = 0.4\n        return (parsedValue * 0.4) / 100;\n      }\n    } else if (model === 'oklab') {\n      // oklab: L (0-100), a (-0.4 to 0.4), b (-0.4 to 0.4)\n      if (index === 1 || index === 2) {\n        // a/b: ±100% = ±0.4\n        return (parsedValue * 0.4) / 100;\n      }\n    }\n\n    return parsedValue;\n  };\n\n  const values = [parseValue(matches[2], 0), parseValue(matches[3], 1), parseValue(matches[4], 2)];\n\n  // Validate ranges for oklab/oklch after percentage conversion\n  if (model === 'oklab') {\n    // a and b must be in range -0.4 to 0.4\n    invariant(values[1] >= -0.4 && values[1] <= 0.4, MESSAGES.invalidRange);\n    invariant(values[2] >= -0.4 && values[2] <= 0.4, MESSAGES.invalidRange);\n  } else if (model === 'oklch') {\n    // chroma must be in range 0 to 0.4\n    invariant(values[1] >= 0 && values[1] <= 0.4, MESSAGES.invalidRange);\n  }\n\n  return {\n    model,\n    [keys[0]]: values[0],\n    [keys[1]]: values[1],\n    [keys[2]]: values[2],\n    alpha: alpha < 1 ? alpha : undefined,\n  } as ExtractColorPartsReturn;\n}\n","import * as converters from '~/converters';\nimport extractColorParts from '~/extract-color-parts';\nimport { MESSAGES, PRECISION } from '~/modules/constants';\nimport { CSSColor, cssColors } from '~/modules/css-colors';\nimport { convertAlphaToHex, extractAlphaFromHex, removeAlphaFromHex } from '~/modules/hex-utils';\nimport { invariant } from '~/modules/invariant';\nimport { addAlpha, round } from '~/modules/utils';\nimport { isHex, isNamedColor, isString } from '~/modules/validators';\n\nimport {\n  ColorModelKey,\n  ColorReturn,\n  ColorTuple,\n  ColorType,\n  HEX,\n  HSL,\n  LAB,\n  LCH,\n  RGB,\n} from '~/types';\n\ntype ToHexFn = (input: ColorTuple) => HEX;\ntype ToHslFn = (input: ColorTuple) => HSL;\ntype ToOklabFn = (input: ColorTuple) => LAB;\ntype ToOklchFn = (input: ColorTuple) => LCH;\ntype ToRgbFn = (input: ColorTuple) => RGB;\n\nconst toHslConverters: Partial<Record<ColorModelKey, ToHslFn>> = {\n  oklab: converters.oklab2hsl,\n  oklch: converters.oklch2hsl,\n  rgb: converters.rgb2hsl,\n};\n\nconst toOklabConverters: Partial<Record<ColorModelKey, ToOklabFn>> = {\n  hsl: converters.hsl2oklab,\n  oklch: converters.oklch2oklab,\n  rgb: converters.rgb2oklab,\n};\n\nconst toOklchConverters: Partial<Record<ColorModelKey, ToOklchFn>> = {\n  hsl: converters.hsl2oklch,\n  oklab: converters.oklab2oklch,\n  rgb: converters.rgb2oklch,\n};\n\nconst toRgbConverters: Partial<Record<ColorModelKey, ToRgbFn>> = {\n  hsl: converters.hsl2rgb,\n  oklab: converters.oklab2rgb,\n  oklch: converters.oklch2rgb,\n};\n\nconst toHexConverters: Record<ColorModelKey, ToHexFn> = {\n  hsl: converters.hsl2hex,\n  oklab: converters.oklab2hex,\n  oklch: converters.oklch2hex,\n  rgb: converters.rgb2hex,\n};\n\n// Hex-to-format converters lookup\nconst fromHexConverters: Record<\n  Exclude<ColorType, 'hex'>,\n  (input: HEX) => HSL | LAB | LCH | RGB\n> = {\n  hsl: converters.hex2hsl,\n  oklab: converters.hex2oklab,\n  oklch: converters.hex2oklch,\n  rgb: converters.hex2rgb,\n};\n\n// Model-to-format converter tables lookup\nconst converterTables: Record<\n  Exclude<ColorType, 'hex'>,\n  Partial<Record<ColorModelKey, ToHslFn | ToOklabFn | ToOklchFn | ToRgbFn>>\n> = {\n  hsl: toHslConverters,\n  oklab: toOklabConverters,\n  oklch: toOklchConverters,\n  rgb: toRgbConverters,\n};\n\nfunction convertFromCSS(value: string, output: ColorType): HEX | HSL | LAB | LCH | RGB {\n  const { alpha, model, ...color } = extractColorParts(value);\n\n  // Normalize OkLab/OkLCH lightness\n  if (['oklab', 'oklch'].includes(model) && color.l > 1) {\n    color.l = round(color.l / 100, PRECISION);\n  }\n\n  const colorTuple = Object.values(color) as ColorTuple;\n\n  if (output === 'hex') {\n    const alphaPrefix = alpha ? convertAlphaToHex(alpha) : '';\n\n    return `${toHexConverters[model](colorTuple)}${alphaPrefix}` as HEX;\n  }\n\n  const converter = converterTables[output]?.[model];\n\n  // When converter is undefined, model matches output format, so color already has correct shape\n  return addAlpha(\n    converter ? converter(colorTuple) : (color as unknown as HSL | LAB | LCH | RGB),\n    alpha,\n  );\n}\n\nfunction convertFromHex(value: HEX, output: ColorType): HEX | HSL | LAB | LCH | RGB {\n  const alpha = extractAlphaFromHex(value);\n\n  if (output === 'hex') {\n    return `${removeAlphaFromHex(value)}${alpha !== 1 ? convertAlphaToHex(alpha) : ''}` as HEX;\n  }\n\n  return addAlpha(fromHexConverters[output](value), alpha);\n}\n\n/**\n * Parse a CSS color string and optionally convert to a specific format.\n *\n * @param input - The CSS color string.\n * @param format - Optional output color format.\n * @returns The parsed color in the specified format.\n */\nexport default function parseCSS<T extends ColorType>(input: string, format?: T): ColorReturn<T> {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const value = isNamedColor(input) ? cssColors[input.toLowerCase() as CSSColor] : input;\n  const output = format ?? (isHex(value) ? 'hex' : extractColorParts(value).model);\n\n  if (isHex(value)) {\n    return convertFromHex(value, output) as ColorReturn<T>;\n  }\n\n  return convertFromCSS(value, output) as ColorReturn<T>;\n}\n","import hex2rgb from '~/converters/hex2rgb';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\n// APCA W3 Constants (version 0.0.98G-4g)\n// Based on official SAPC-APCA implementation from Myndex/SAPC-APCA\nexport const APCA_VERSION = '0.0.98G-4g';\n\n// Exponents\nconst mainTRC = 2.4; // sRGB gamma (simpler than WCAG piecewise)\nconst normBG = 0.56; // Normal polarity: dark text on light bg\nconst normTXT = 0.57;\nconst revBG = 0.65; // Reverse polarity: light text on dark bg\nconst revTXT = 0.62;\n\n// sRGB coefficients\nconst sRco = 0.2126729;\nconst sGco = 0.7151522;\nconst sBco = 0.072175;\n\n// Black soft clamp\nconst blkThreshold = 0.022; // Threshold for soft clamp\nconst blkClamp = 1.414; // Clamp exponent\n\n// Scaling\nconst scaleBoW = 1.14; // Black on white scale\nconst scaleWoB = 1.14; // White on black scale\nconst loBoWOffset = 0.027; // Low contrast offset\nconst loWoBOffset = 0.027;\nconst loClip = 0.1; // Clip contrasts below |10|\nconst deltaYmin = 0.0005; // Minimum Y difference\n\n/**\n * Apply soft clamp to black levels.\n * Improves contrast prediction for very dark colors.\n */\nfunction softClamp(Y: number): number {\n  return Y > blkThreshold ? Y : Y + (blkThreshold - Y) ** blkClamp;\n}\n\n/**\n * Convert sRGB values to luminance (Y) for APCA.\n * Uses simple gamma 2.4, unlike WCAG's piecewise function.\n */\nfunction sRGBtoY(r: number, g: number, b: number): number {\n  return sRco * (r / 255) ** mainTRC + sGco * (g / 255) ** mainTRC + sBco * (b / 255) ** mainTRC;\n}\n\n/**\n * Calculate APCA contrast between foreground and background colors.\n *\n * APCA (Accessible Perceptual Contrast Algorithm) is polarity-aware:\n * - Positive values indicate dark text on light background\n * - Negative values indicate light text on dark background\n *\n * @param background - The background color string.\n * @param foreground - The foreground/text color string.\n * @returns Lc (Lightness contrast) value, roughly -108 to +106.\n */\nexport default function apcaContrast(background: string, foreground: string): number {\n  invariant(isString(background), MESSAGES.inputString);\n  invariant(isString(foreground), MESSAGES.inputString);\n\n  const bg = hex2rgb(parseCSS(background, 'hex'));\n  const fg = hex2rgb(parseCSS(foreground, 'hex'));\n\n  const txtY = softClamp(sRGBtoY(fg.r, fg.g, fg.b));\n  const bgY = softClamp(sRGBtoY(bg.r, bg.g, bg.b));\n\n  // Return 0 for extremely low ΔY\n  if (Math.abs(bgY - txtY) < deltaYmin) {\n    return 0;\n  }\n\n  // Calculate SAPC based on polarity\n  // Normal polarity: dark text on light background\n  // Reverse polarity: light text on dark background\n  const SAPC =\n    bgY > txtY\n      ? (bgY ** normBG - txtY ** normTXT) * scaleBoW\n      : (bgY ** revBG - txtY ** revTXT) * scaleWoB;\n\n  // Apply low contrast clipping and offset\n  if (Math.abs(SAPC) < loClip) {\n    return 0;\n  }\n\n  const Lc = SAPC > 0 ? (SAPC - loBoWOffset) * 100 : (SAPC + loWoBOffset) * 100;\n\n  return round(Lc, 5);\n}\n","import { MESSAGES, PRECISION } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\n/**\n * Get the brightness difference between 2 colors.\n *\n * @param left - The first color string.\n * @param right - The second color string.\n * @param precision - The decimal precision (default: 5).\n * @returns The brightness difference value.\n */\nexport default function brightnessDifference(\n  left: string,\n  right: string,\n  precision = PRECISION,\n): number {\n  invariant(isString(left), MESSAGES.left);\n  invariant(isString(right), MESSAGES.right);\n\n  const RGBLeft = parseCSS(left, 'rgb');\n  const RGBRight = parseCSS(right, 'rgb');\n\n  const brightnessLeft = (RGBLeft.r * 299 + RGBLeft.g * 587 + RGBLeft.b * 114) / 1000;\n  const brightnessRight = (RGBRight.r * 299 + RGBRight.g * 587 + RGBRight.b * 114) / 1000;\n\n  return round(Math.abs(brightnessRight - brightnessLeft), precision);\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\n/**\n * Get the chroma of a color.\n *\n * @param input - The input color string.\n * @returns The chroma value (0-1).\n */\nexport default function chroma(input: string): number {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const { r, g, b } = parseCSS(input, 'rgb');\n\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n\n  return round((max - min) / 255, 4);\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\n/**\n * Get the color difference between 2 colors.\n *\n * @param left - The first color string.\n * @param right - The second color string.\n * @returns The color difference value.\n */\nexport default function colorDifference(left: string, right: string): number {\n  invariant(isString(left), MESSAGES.left);\n  invariant(isString(right), MESSAGES.right);\n\n  const RGBLeft = parseCSS(left, 'rgb');\n  const RGBRight = parseCSS(right, 'rgb');\n\n  return (\n    Math.max(RGBLeft.r, RGBRight.r) -\n    Math.min(RGBLeft.r, RGBRight.r) +\n    (Math.max(RGBLeft.g, RGBRight.g) - Math.min(RGBLeft.g, RGBRight.g)) +\n    (Math.max(RGBLeft.b, RGBRight.b) - Math.min(RGBLeft.b, RGBRight.b))\n  );\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\n/**\n * Get the relative luminance of a color (WCAG definition).\n *\n * @param input - The input color string.\n * @returns The luminance value (0-1).\n */\nexport default function luminance(input: string): number {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const { r, g, b } = parseCSS(input, 'rgb');\n\n  const rgb = [r / 255, g / 255, b / 255];\n\n  for (let index = 0; index < rgb.length; index++) {\n    if (rgb[index] <= 0.04045) {\n      rgb[index] /= 12.92;\n    } else {\n      rgb[index] = ((rgb[index] + 0.055) / 1.055) ** 2.4;\n    }\n  }\n\n  return round(0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2], 4);\n}\n","import getLuminance from '~/luminance';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isString } from '~/modules/validators';\n\n/**\n * Get the contrast ratio between 2 colors.\n *\n * @param left - The first color string.\n * @param right - The second color string.\n * @returns The contrast ratio (1-21).\n */\nexport default function contrast(left: string, right: string): number {\n  invariant(isString(left), MESSAGES.left);\n  invariant(isString(right), MESSAGES.right);\n\n  const LuminanceLeft = getLuminance(left);\n  const LuminanceRight = getLuminance(right);\n\n  return round(\n    LuminanceLeft >= LuminanceRight\n      ? (LuminanceLeft + 0.05) / (LuminanceRight + 0.05)\n      : (LuminanceRight + 0.05) / (LuminanceLeft + 0.05),\n  );\n}\n","import getBrightnessDifference from '~/brightness-difference';\nimport getColorDifference from '~/color-difference';\nimport getContrast from '~/contrast';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isString } from '~/modules/validators';\n\nimport { Analysis } from '~/types';\n\n/**\n * Check 2 colors for WCAG compliance.\n *\n * @param left - The first color string.\n * @param right - The second color string.\n * @returns Analysis object with WCAG compliance information.\n */\nexport default function compare(left: string, right: string): Analysis {\n  invariant(isString(left), MESSAGES.left);\n  invariant(isString(right), MESSAGES.right);\n\n  const colorThreshold = 500;\n  const brightnessThreshold = 125;\n\n  const colorDifference = getColorDifference(left, right);\n  const contrast = getContrast(left, right);\n  const brightnessDifference = getBrightnessDifference(left, right);\n\n  const isBright = brightnessDifference >= brightnessThreshold;\n  const hasEnoughDifference = colorDifference >= colorThreshold;\n\n  let compliant = 0;\n\n  if (isBright && hasEnoughDifference) {\n    compliant = 2;\n  } else if (isBright || hasEnoughDifference) {\n    compliant = 1;\n  }\n\n  return {\n    brightnessDifference,\n    colorDifference,\n    compliant,\n    contrast,\n    largeAA: contrast >= 3,\n    largeAAA: contrast >= 4.5,\n    normalAA: contrast >= 4.5,\n    normalAAA: contrast >= 7,\n  };\n}\n","import * as converters from '~/converters';\nimport { MESSAGES, PRECISION } from '~/modules/constants';\nimport { CSSColor, cssColors } from '~/modules/css-colors';\nimport { convertAlphaToHex, removeAlphaFromHex } from '~/modules/hex-utils';\nimport { invariant } from '~/modules/invariant';\nimport { restrictValues, round } from '~/modules/utils';\nimport {\n  isHex,\n  isHSL,\n  isLAB,\n  isLCH,\n  isNamedColor,\n  isRGB,\n  isValidColorModel,\n} from '~/modules/validators';\n\nimport { ColorModel, ColorReturn, ColorType, HEX } from '~/types';\n\nexport interface FormatCSSOptions {\n  /**\n   * The alpha value of the color (0-1).\n   */\n  alpha?: number;\n  /**\n   * Output color format.\n   * @default 'hex'\n   */\n  format?: ColorType;\n  /**\n   * The number of digits of the output.\n   * @default 5\n   */\n  precision?: number;\n  /**\n   * The separator between the values.\n   *\n   * oklab and oklch always use space as a separator.\n   * @default ' '\n   */\n  separator?: string;\n}\n\nfunction getColorModel<T extends ColorModel | string>(input: T): ColorType {\n  if (isHex(input) || isNamedColor(input)) {\n    return 'hex';\n  }\n\n  if (isHSL(input)) {\n    return 'hsl';\n  }\n\n  if (isLAB(input)) {\n    return 'oklab';\n  }\n\n  if (isLCH(input)) {\n    return 'oklch';\n  }\n\n  if (isRGB(input)) {\n    return 'rgb';\n  }\n\n  throw new Error(MESSAGES.invalid);\n}\n\nfunction getColorValue<TInput extends ColorModel | string, TOutput extends ColorType>(\n  input: TInput,\n  output: TOutput,\n): ColorReturn<TOutput> {\n  const value = isNamedColor(input) ? cssColors[input.toLowerCase() as CSSColor] : input;\n  const from = getColorModel(value);\n\n  if (from === output) {\n    return value as ColorReturn<TOutput>;\n  }\n\n  const converterKey = `${from}2${output}` as keyof typeof converters;\n  const converter = (converters as Record<string, (x: any) => any>)[converterKey];\n\n  if (!converter) {\n    throw new Error(`Converter not found for ${from} to ${output}`);\n  }\n\n  return converter(value);\n}\n\n/**\n * Format a color model to a CSS color string.\n *\n * @param input - The color model or hex string.\n * @param options - Formatting options.\n * @returns The formatted CSS color string.\n */\nexport default function formatCSS<T extends ColorModel | HEX>(\n  input: T,\n  options: FormatCSSOptions = {},\n): string {\n  invariant(isHex(input) || isValidColorModel(input), MESSAGES.invalid);\n\n  const { alpha, format = 'hex', precision = PRECISION, separator: baseSeparator = ' ' } = options;\n\n  const opacity = alpha && alpha !== 1 ? `${round(alpha * 100)}%` : null;\n  let params = [];\n  let separator = baseSeparator;\n\n  switch (format) {\n    case 'hsl': {\n      const { h, s, l } = getColorValue(input, 'hsl');\n\n      params = [h, `${s}%`, `${l}%`];\n      break;\n    }\n    case 'oklab': {\n      separator = ' ';\n      const { l, a, b } = restrictValues(getColorValue(input, 'oklab'), precision);\n\n      params = [`${round(l * 100, precision)}%`, a, b];\n      break;\n    }\n    case 'oklch': {\n      separator = ' ';\n      const { l, c, h } = restrictValues(getColorValue(input, 'oklch'), precision);\n\n      params = [`${round(l * 100, precision)}%`, c, h];\n      break;\n    }\n    case 'rgb': {\n      const { r, g, b } = getColorValue(input, 'rgb');\n\n      params = [r, g, b];\n      break;\n    }\n    default: {\n      const hex = removeAlphaFromHex(getColorValue(input, 'hex'));\n\n      if (alpha && alpha !== 1) {\n        return `${hex}${convertAlphaToHex(alpha)}`;\n      }\n\n      return hex;\n    }\n  }\n\n  return `${format}(${params.join(separator)}${opacity ? ` / ${opacity}` : ''})`;\n}\n","import extractColorParts from '~/extract-color-parts';\nimport formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { clamp } from '~/modules/utils';\nimport { isHex, isNamedColor, isNumberInRange, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\nimport { ColorModelKeys, ColorType } from '~/types';\n\n/**\n * Create a function to update HSL color properties.\n *\n * @param key - The HSL property to update ('h', 's', or 'l').\n * @param operator - The operation to perform ('+' or '-').\n * @param format - The output color format.\n * @returns A function that takes a color and amount, returning the updated color.\n */\nexport default function updater(\n  key: ColorModelKeys<'hsl'>,\n  operator: '+' | '-',\n  format?: ColorType,\n) {\n  /**\n   * @param input - The input color string.\n   * @param amount - A number between 0 and 100.\n   * @returns The updated color string.\n   */\n  return (input: string, amount: number) => {\n    invariant(isString(input), MESSAGES.inputString);\n    invariant(isNumberInRange(amount, 0, 100), MESSAGES.amount);\n\n    const color = parseCSS(input, 'hsl');\n    const output = isHex(input) || isNamedColor(input) ? 'hex' : extractColorParts(input).model;\n\n    return formatCSS(\n      {\n        ...color,\n        [key]: clamp(color[key] + (operator === '+' ? amount : -amount), 0, 100),\n      },\n      { format: format ?? output },\n    );\n  };\n}\n","import updater from '~/modules/updater';\n\nimport { ColorType } from '~/types';\n\n/**\n * Decrease color lightness.\n *\n * @param input - The input color string.\n * @param amount - A number between 0 and 100.\n * @param format - The output color format.\n * @returns The darkened color string.\n */\nexport default function darken(input: string, amount: number, format?: ColorType): string {\n  return updater('l', '-', format)(input, amount);\n}\n","import updater from '~/modules/updater';\n\nimport { ColorType } from '~/types';\n\n/**\n * Decrease color saturation.\n *\n * @param input - The input color string.\n * @param amount - A number between 0 and 100.\n * @param format - The output color format.\n * @returns The desaturated color string.\n */\nexport default function desaturate(input: string, amount: number, format?: ColorType): string {\n  return updater('s', '-', format)(input, amount);\n}\n","import extractColorParts from '~/extract-color-parts';\nimport formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex, isNamedColor, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\nimport { ColorType } from '~/types';\n\n/**\n * Convert a color to grayscale using OkLCH (perceptually uniform).\n * Sets chroma to 0 while preserving lightness.\n *\n * @param input - The input color string.\n * @param format - The output color format.\n * @returns The grayscale color string.\n */\nexport default function grayscale(input: string, format?: ColorType): string {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const output = isHex(input) || isNamedColor(input) ? 'hex' : extractColorParts(input).model;\n  const lch = parseCSS(input, 'oklch');\n\n  return formatCSS({ ...lch, c: 0 }, { format: format ?? output, alpha: lch.alpha });\n}\n","import extractColorParts from '~/extract-color-parts';\nimport formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { constrainDegrees } from '~/modules/utils';\nimport { isHex, isNamedColor, isNumberInRange, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\nimport { ColorType } from '~/types';\n\n/**\n * Change the color hue by rotating it.\n *\n * @param input - The input color string.\n * @param degrees - A number between -360 and 360.\n * @param format - The output color format.\n * @returns The rotated color string.\n */\nexport default function rotate(input: string, degrees: number, format?: ColorType): string {\n  invariant(isString(input), MESSAGES.inputString);\n  invariant(isNumberInRange(degrees, -360, 360), MESSAGES.degreesRange);\n\n  const color = parseCSS(input, 'hsl');\n\n  const output = isHex(input) || isNamedColor(input) ? 'hex' : extractColorParts(input).model;\n\n  return formatCSS(\n    {\n      ...color,\n      h: constrainDegrees(color.h, degrees),\n    },\n    { format: format ?? output },\n  );\n}\n","import extractColorParts from '~/extract-color-parts';\nimport formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex, isNamedColor, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\nimport rotate from '~/rotate';\n\nimport { HEX } from '~/types';\n\n/**\n * Invert the color by rotating hue 180 degrees.\n *\n * @param input - The input color string.\n * @returns The inverted color string in the same format as input.\n */\nexport default function invert(input: string): string {\n  invariant(isString(input), MESSAGES.inputString);\n  const format = isHex(input) || isNamedColor(input) ? 'hex' : extractColorParts(input).model;\n  const hex = parseCSS(input, 'hex');\n\n  return formatCSS(rotate(hex, 180) as HEX, { format });\n}\n","import updater from '~/modules/updater';\n\nimport { ColorType } from '~/types';\n\n/**\n * Increase color lightness.\n *\n * @param input - The input color string.\n * @param amount - A number between 0 and 100.\n * @param format - The output color format.\n * @returns The lightened color string.\n */\nexport default function lighten(input: string, amount: number, format?: ColorType): string {\n  return updater('l', '+', format)(input, amount);\n}\n","import extractColorParts from '~/extract-color-parts';\nimport formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex, isNamedColor, isNumberInRange, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\nimport { ColorType } from '~/types';\n\n/**\n * Interpolate hue using shortest path around the color wheel.\n * Handles achromatic colors (chroma ≈ 0) by using the other color's hue.\n */\nfunction interpolateHue(h1: number, h2: number, c1: number, c2: number, ratio: number): number {\n  // If first color is achromatic, use second color's hue\n  if (c1 < 0.0001) {\n    return h2;\n  }\n\n  // If second color is achromatic, use first color's hue\n  if (c2 < 0.0001) {\n    return h1;\n  }\n\n  let diff = h2 - h1;\n\n  // Take shortest path around the color wheel\n  if (diff > 180) {\n    diff -= 360;\n  } else if (diff < -180) {\n    diff += 360;\n  }\n\n  let result = h1 + diff * ratio;\n\n  // Normalize to 0-360\n  if (result < 0) {\n    result += 360;\n  } else if (result >= 360) {\n    result -= 360;\n  }\n\n  return result;\n}\n\n/**\n * Mix two colors in OkLCH space (perceptually uniform).\n * Uses shortest-path hue interpolation.\n *\n * @param color1 - The first color string.\n * @param color2 - The second color string.\n * @param ratio - A number between 0 and 1 (0 = color1, 1 = color2).\n * @param format - Optional output color format.\n * @returns The mixed color string.\n */\nexport default function mix(\n  color1: string,\n  color2: string,\n  ratio: number = 0.5,\n  format?: ColorType,\n): string {\n  invariant(isString(color1), MESSAGES.inputString);\n  invariant(isString(color2), MESSAGES.inputString);\n  invariant(isNumberInRange(ratio, 0, 1), MESSAGES.ratioRange);\n\n  const output = isHex(color1) || isNamedColor(color1) ? 'hex' : extractColorParts(color1).model;\n\n  const lch1 = parseCSS(color1, 'oklch');\n  const lch2 = parseCSS(color2, 'oklch');\n\n  // Interpolate L and C linearly\n  const l = lch1.l + (lch2.l - lch1.l) * ratio;\n  const c = lch1.c + (lch2.c - lch1.c) * ratio;\n\n  // Interpolate H with the shortest path (handle achromatic colors)\n  const h = interpolateHue(lch1.h, lch2.h, lch1.c, lch2.c, ratio);\n\n  // Handle alpha if present\n  const alpha1 = lch1.alpha ?? 1;\n  const alpha2 = lch2.alpha ?? 1;\n  const alpha = alpha1 + (alpha2 - alpha1) * ratio;\n\n  return formatCSS({ l, c, h }, { format: format ?? output, alpha: alpha < 1 ? alpha : undefined });\n}\n","import * as converters from '~/converters';\nimport extractColorParts from '~/extract-color-parts';\nimport { MESSAGES } from '~/modules/constants';\nimport { addAlphaToHex } from '~/modules/hex-utils';\nimport { invariant } from '~/modules/invariant';\nimport { addAlpha, limit } from '~/modules/utils';\nimport { isHex, isHSL, isLAB, isLCH, isPlainObject, isRGB, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\nimport { Colors, HSL, LAB, LCH, RGB } from '~/types';\n\n/**\n * Parse a color input and return all color representations.\n *\n * @param color - The color as a string or color model object.\n * @returns An object containing all color formats and metadata.\n */\nexport default function parseColor(color: string | HSL | LAB | LCH | RGB): Colors {\n  invariant(!!color, MESSAGES.input);\n\n  const output: Partial<Colors> = {};\n\n  if (isString(color)) {\n    const { alpha = 1 } = extractColorParts(color);\n    const type = isHex(color) ? 'hex' : extractColorParts(color).model;\n\n    output.hex = addAlphaToHex(parseCSS(color, 'hex'), alpha);\n    output.hsl = addAlpha(parseCSS(color, 'hsl'), alpha);\n    output.oklab = addAlpha(parseCSS(color, 'oklab'), alpha);\n    output.oklch = addAlpha(parseCSS(color, 'oklch'), alpha);\n    output.rgb = addAlpha(parseCSS(color, 'rgb'), alpha);\n\n    output.alpha = alpha;\n    output.type = type;\n  } else if (isPlainObject(color)) {\n    const { alpha = 1 } = color;\n\n    if (isHSL(color)) {\n      output.hsl = {\n        h: limit(color.h, 'hsl', 'h'),\n        s: limit(color.s, 'hsl', 's'),\n        l: limit(color.l, 'hsl', 'l'),\n      };\n      output.rgb = converters.hsl2rgb(output.hsl);\n      output.oklab = converters.hsl2oklab(output.hsl);\n      output.oklch = converters.hsl2oklch(output.hsl);\n      output.type = 'hsl';\n    } else if (isLAB(color)) {\n      output.hsl = converters.oklab2hsl(color);\n      output.oklab = color;\n      output.oklch = converters.oklab2oklch(color);\n      output.rgb = converters.oklab2rgb(color);\n      output.type = 'oklab';\n    } else if (isLCH(color)) {\n      output.hsl = converters.oklch2hsl(color);\n      output.oklab = converters.oklch2oklab(color);\n      output.oklch = color;\n      output.rgb = converters.oklch2rgb(color);\n      output.type = 'oklch';\n    } else if (isRGB(color)) {\n      output.rgb = {\n        r: limit(color.r, 'rgb', 'r'),\n        g: limit(color.g, 'rgb', 'g'),\n        b: limit(color.b, 'rgb', 'b'),\n      };\n      output.hsl = converters.rgb2hsl(output.rgb);\n      output.oklab = converters.rgb2oklab(output.rgb);\n      output.oklch = converters.rgb2oklch(output.rgb);\n      output.type = 'rgb';\n    } else {\n      throw new Error('invalid color');\n    }\n\n    output.hex = addAlphaToHex(converters.hsl2hex(output.hsl), alpha);\n    output.hsl = addAlpha(output.hsl, alpha);\n    output.oklab = addAlpha(output.oklab, alpha);\n    output.oklch = addAlpha(output.oklch, alpha);\n    output.rgb = addAlpha(output.rgb, alpha);\n\n    output.alpha = alpha;\n  } else {\n    throw new Error(MESSAGES.input);\n  }\n\n  return output as Colors;\n}\n","import extractColorParts from '~/extract-color-parts';\nimport formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex, isNamedColor, isNumberInRange, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\nimport { ColorType } from '~/types';\n\n/**\n * Set the color opacity/alpha.\n *\n * @param input - The input color string.\n * @param alpha - A number between 0 and 1.\n * @param format - The output color format.\n * @returns The opacified color string.\n */\nexport default function opacify(input: string, alpha: number, format?: ColorType): string {\n  invariant(isString(input), MESSAGES.inputString);\n  invariant(isNumberInRange(alpha, 0, 1), MESSAGES.alpha);\n\n  const type = isHex(input) || isNamedColor(input) ? 'hex' : extractColorParts(input).model;\n  const rgb = parseCSS(input, 'rgb');\n\n  return formatCSS(rgb, { format: format ?? type, alpha });\n}\n","import extractColorParts from '~/extract-color-parts';\nimport { MESSAGES } from '~/modules/constants';\nimport { cssColors } from '~/modules/css-colors';\nimport { extractAlphaFromHex } from '~/modules/hex-utils';\nimport { invariant } from '~/modules/invariant';\nimport { isHex, isString } from '~/modules/validators';\n\n/**\n * Get the opacity/alpha value of a color.\n *\n * @param input - The input color string.\n * @returns The opacity value (0-1).\n */\nexport default function opacity(input: string): number {\n  invariant(isString(input), MESSAGES.inputString);\n\n  if (isHex(input)) {\n    return extractAlphaFromHex(input);\n  } else if (Object.keys(cssColors).includes(input)) {\n    return 1;\n  }\n\n  const { alpha } = extractColorParts(input);\n\n  if (!alpha) {\n    return 1;\n  }\n\n  return alpha;\n}\n","import apcaContrast from '~/apca';\nimport contrast from '~/contrast';\nimport hex2oklab from '~/converters/hex2oklab';\nimport hex2rgb from '~/converters/hex2rgb';\nimport luminance from '~/luminance';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\nexport type ReadableColorMethod = 'apca' | 'contrast' | 'oklab' | 'wcag' | 'yiq';\n\nexport interface ReadableColorOptions {\n  /**\n   * The dark color to return if the background is light.\n   * @default '#000000'\n   */\n  darkColor?: string;\n  /**\n   * The light color to return if the background is dark.\n   * @default '#ffffff'\n   */\n  lightColor?: string;\n  /**\n   * The method to use for determining contrast.\n   *\n   * - `yiq`: YIQ brightness formula (fast, simple)\n   * - `wcag`: WCAG 2.x relative luminance threshold\n   * - `contrast`: WCAG 2.x contrast ratio comparison\n   * - `oklab`: OkLab perceptual lightness threshold\n   * - `apca`: APCA contrast comparison (WCAG 3.0 candidate)\n   *\n   * @default 'yiq'\n   */\n  method?: ReadableColorMethod;\n  /**\n   * The threshold for threshold-based methods.\n   *\n   * - `yiq`: 0-255 (default: 128)\n   * - `wcag`: 0-1 (default: 0.5)\n   * - `oklab`: 0-1 (default: 0.5)\n   * - `contrast` and `apca`: ignored (comparison-based)\n   */\n  threshold?: number;\n}\n\n/**\n * Compare two contrast values and return the color with higher contrast.\n * Returns darkColor if equal (arbitrary but consistent).\n */\nfunction pickByContrast(\n  darkContrast: number,\n  lightContrast: number,\n  darkColor: string,\n  lightColor: string,\n): string {\n  return darkContrast >= lightContrast ? darkColor : lightColor;\n}\n\n/**\n * Get the most readable color (light or dark) for a given background.\n *\n * Supports multiple methods for determining contrast:\n * - `yiq`: Simple YIQ brightness formula (default, backwards compatible)\n * - `wcag`: WCAG 2.x relative luminance with threshold\n * - `contrast`: WCAG 2.x contrast ratio comparison\n * - `oklab`: OkLab perceptual lightness with threshold\n * - `apca`: APCA contrast comparison (WCAG 3.0 candidate)\n *\n * @param backgroundColor - The background color string.\n * @param options - Options for determining the readable color.\n * @returns The most readable color (light or dark).\n */\nexport default function readableColor(\n  backgroundColor: string,\n  options: ReadableColorOptions = {},\n): string {\n  const { darkColor = '#000000', lightColor = '#ffffff', method = 'yiq', threshold } = options;\n\n  invariant(isString(backgroundColor), MESSAGES.inputString);\n\n  switch (method) {\n    case 'yiq': {\n      const yiqThreshold = threshold ?? 128;\n\n      invariant(yiqThreshold >= 0 && yiqThreshold <= 255, MESSAGES.threshold);\n\n      const { r, g, b } = hex2rgb(parseCSS(backgroundColor, 'hex'));\n      const yiq = (r * 299 + g * 587 + b * 114) / 1000;\n\n      return yiq >= yiqThreshold ? darkColor : lightColor;\n    }\n    case 'wcag': {\n      const wcagThreshold = threshold ?? 0.5;\n\n      invariant(wcagThreshold >= 0 && wcagThreshold <= 1, MESSAGES.thresholdNormalized);\n\n      const lum = luminance(backgroundColor);\n\n      return lum >= wcagThreshold ? darkColor : lightColor;\n    }\n    case 'contrast': {\n      const darkContrast = contrast(darkColor, backgroundColor);\n      const lightContrast = contrast(lightColor, backgroundColor);\n\n      return pickByContrast(darkContrast, lightContrast, darkColor, lightColor);\n    }\n    case 'oklab': {\n      const oklabThreshold = threshold ?? 0.5;\n\n      invariant(oklabThreshold >= 0 && oklabThreshold <= 1, MESSAGES.thresholdNormalized);\n\n      const { l } = hex2oklab(parseCSS(backgroundColor, 'hex'));\n\n      return l >= oklabThreshold ? darkColor : lightColor;\n    }\n    case 'apca': {\n      const darkContrast = Math.abs(apcaContrast(backgroundColor, darkColor));\n      const lightContrast = Math.abs(apcaContrast(backgroundColor, lightColor));\n\n      return pickByContrast(darkContrast, lightContrast, darkColor, lightColor);\n    }\n    /* v8 ignore next 3 -- @preserve */\n    default: {\n      throw new Error(`Unknown method: ${method}`);\n    }\n  }\n}\n","import updater from '~/modules/updater';\n\nimport { ColorType } from '~/types';\n\n/**\n * Increase color saturation.\n *\n * @param input - The input color string.\n * @param amount - A number between 0 and 100.\n * @param format - The output color format.\n * @returns The saturated color string.\n */\nexport default function saturate(input: string, amount: number, format?: ColorType): string {\n  return updater('s', '+', format)(input, amount);\n}\n","import formatCSS from '~/format-css';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { clamp, round } from '~/modules/utils';\nimport { isNumberInRange, isString } from '~/modules/validators';\nimport opacity from '~/opacity';\nimport parseCSS from '~/parse-css';\n\nimport { ColorType } from '~/types';\n\n/**\n * Increase the color transparency.\n *\n * @param input - The input color string.\n * @param alpha - A number between -1 and 1. Positive values increase transparency, negative values decrease transparency.\n * @param format - The output color format.\n * @returns The transparentized color string.\n */\nexport default function transparentize(input: string, alpha: number, format?: ColorType): string {\n  invariant(isString(input), MESSAGES.inputString);\n  invariant(isNumberInRange(alpha, -1, 1), MESSAGES.alphaAdjustment);\n\n  const oklch = parseCSS(input, 'oklab');\n\n  const value = round(clamp(opacity(input) - alpha, 0, 1));\n\n  return formatCSS(oklch, { format, alpha: value });\n}\n","import brightnessDifference from '~/brightness-difference';\nimport chroma from '~/chroma';\nimport colorDifference from '~/color-difference';\nimport compare from '~/compare';\nimport contrast from '~/contrast';\nimport darken from '~/darken';\nimport desaturate from '~/desaturate';\nimport formatCSS from '~/format-css';\nimport grayscale from '~/grayscale';\nimport invert from '~/invert';\nimport lighten from '~/lighten';\nimport luminance from '~/luminance';\nimport mix from '~/mix';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport parseColor from '~/modules/parse-color';\nimport opacify from '~/opacify';\nimport opacity from '~/opacity';\nimport readableColor from '~/readable-color';\nimport rotate from '~/rotate';\nimport saturate from '~/saturate';\nimport transparentize from '~/transparentize';\n\nimport { Analysis, ColorType, HEX, HSL, LAB, LCH, RGB } from '~/types';\n\nexport interface ColorizrOptions {\n  /**\n   * Output color format.\n   *\n   * If not specified, the output will use the same format as the input color.\n   */\n  format?: ColorType;\n}\n\nexport default class Colorizr {\n  /** The alpha/opacity value (0-1). */\n  public alpha: number;\n  public hex: HEX;\n  public hsl: HSL;\n  public oklab: LAB;\n  public oklch: LCH;\n  public rgb: RGB;\n  public type: ColorType;\n\n  constructor(color: string | HSL | LAB | LCH | RGB, options: ColorizrOptions = {}) {\n    invariant(!!color, MESSAGES.colorRequired);\n\n    const { alpha, hex, hsl, oklab, oklch, rgb, type } = parseColor(color);\n\n    this.hex = hex;\n    this.hsl = hsl;\n    this.oklab = oklab;\n    this.oklch = oklch;\n    this.rgb = rgb;\n\n    this.alpha = alpha;\n    this.type = options.format ?? type;\n  }\n\n  /**\n   * Get CSS string\n   */\n  get css(): string {\n    return this.currentColor;\n  }\n\n  /**\n   * Get the red value\n   */\n  get red(): number {\n    return this.rgb.r;\n  }\n\n  /**\n   * Get the green value\n   */\n  get green(): number {\n    return this.rgb.g;\n  }\n\n  /**\n   * Get the blue value\n   */\n  get blue(): number {\n    return this.rgb.b;\n  }\n\n  /**\n   * Get the hue value\n   */\n  get hue(): number {\n    return this.hsl.h;\n  }\n\n  /**\n   * Get the saturation value\n   */\n  get saturation(): number {\n    return this.hsl.s;\n  }\n\n  /**\n   * Get the lightness value\n   */\n  get lightness(): number {\n    return this.hsl.l;\n  }\n\n  /**\n   * Get the luminance value\n   */\n  get luminance(): number {\n    return luminance(this.currentColor);\n  }\n\n  /**\n   * Get the chroma value\n   */\n  get chroma(): number {\n    return chroma(this.currentColor);\n  }\n\n  get opacity(): number {\n    return opacity(this.currentColor);\n  }\n\n  /**\n   * Get the most readable color (light or dark) for this color as a background.\n   */\n  get readableColor(): string {\n    return readableColor(this.currentColor);\n  }\n\n  private get currentColor(): string {\n    return formatCSS(this[this.type], { format: this.type, alpha: this.alpha });\n  }\n\n  /**\n   * Get the brightness difference between this color and another.\n   *\n   * @param input - The color to compare against.\n   * @returns The brightness difference value.\n   */\n  public brightnessDifference(input: string): number {\n    return brightnessDifference(this.currentColor, input);\n  }\n\n  /**\n   * Get the color difference between this color and another.\n   *\n   * @param input - The color to compare against.\n   * @returns The color difference value.\n   */\n  public colorDifference(input: string): number {\n    return colorDifference(this.currentColor, input);\n  }\n\n  /**\n   * Test 2 colors for WCAG compliance.\n   *\n   * @param input - The color to compare against.\n   * @returns Analysis object with compliance information.\n   */\n  public compare(input: string): Analysis {\n    return compare(this.currentColor, input);\n  }\n\n  /**\n   * Get the contrast ratio between this color and another.\n   *\n   * @param input - The color to compare against.\n   * @returns The contrast ratio.\n   */\n  public contrast(input: string): number {\n    return contrast(this.currentColor, input);\n  }\n\n  /**\n   * Format the color to a specific type.\n   *\n   * @param type - The color format to convert to.\n   * @param precision - The decimal precision for the output.\n   * @returns The formatted color string.\n   */\n  public format(type: ColorType, precision?: number): string {\n    return formatCSS(this.rgb, {\n      alpha: this.alpha,\n      format: type,\n      precision,\n    });\n  }\n\n  /**\n   * Increase lightness.\n   *\n   * @param amount - A number between 0 and 100.\n   * @returns The lightened color string.\n   */\n  public lighten(amount: number): string {\n    return lighten(this.currentColor, amount);\n  }\n\n  /**\n   * Decrease lightness.\n   *\n   * @param amount - A number between 0 and 100.\n   * @returns The darkened color string.\n   */\n  public darken(amount: number): string {\n    return darken(this.currentColor, amount);\n  }\n\n  /**\n   * Increase saturation.\n   *\n   * @param amount - A number between 0 and 100.\n   * @returns The saturated color string.\n   */\n  public saturate(amount: number): string {\n    return saturate(this.currentColor, amount);\n  }\n\n  /**\n   * Decrease saturation.\n   *\n   * @param amount - A number between 0 and 100.\n   * @returns The desaturated color string.\n   */\n  public desaturate(amount: number): string {\n    return desaturate(this.currentColor, amount);\n  }\n\n  /**\n   * Convert to grayscale.\n   *\n   * @returns The grayscale color string.\n   */\n  public grayscale(): string {\n    return grayscale(this.currentColor);\n  }\n\n  /**\n   * Invert color.\n   *\n   * @returns The inverted color string.\n   */\n  public invert(): string {\n    return invert(this.currentColor);\n  }\n\n  /**\n   * Mix with another color.\n   *\n   * @param color - The color to mix with.\n   * @param ratio - A number between 0 and 1 (0 = this color, 1 = input color).\n   * @returns The mixed color string.\n   */\n  public mix(color: string, ratio?: number): string {\n    return mix(this.currentColor, color, ratio);\n  }\n\n  /**\n   * Add opacity to the color.\n   *\n   * @param alpha - A number between 0 and 1.\n   * @returns The opacified color string.\n   */\n  public opacify(alpha: number = 0.9): string {\n    return opacify(this.currentColor, alpha, this.type);\n  }\n\n  /**\n   * Rotate color hue.\n   *\n   * @param degrees - A number between -360 and 360.\n   * @returns The rotated color string.\n   */\n  public rotate(degrees: number): string {\n    return rotate(this.currentColor, degrees);\n  }\n\n  /**\n   * Make the color more transparent.\n   *\n   * @param alpha - A number between -1 and 1.\n   * @returns The transparentized color string.\n   */\n  public transparentize(alpha: number = 0.1): string {\n    return transparentize(this.currentColor, alpha, this.type);\n  }\n}\n","import formatCSS from '~/format-css';\nimport parseCSS from '~/parse-css';\n\nimport { ColorType } from '~/types';\n\n/**\n * Convert a color string to another format.\n *\n * @param input - The input color string.\n * @param format - The output color format.\n * @returns The converted color string.\n */\nexport default function convert(input: string, format: ColorType): string {\n  const value = parseCSS(input, format);\n\n  return formatCSS(value, { format });\n}\n","import extractColorParts from '~/extract-color-parts';\nimport { isHex, isNamedColor, isString } from '~/modules/validators';\n\nimport { ColorTypeInput } from '~/types';\n\n/**\n * Detect the color type from a CSS color string.\n *\n * @param input - The color string to analyze.\n * @returns The detected color type ('hex', 'hsl', 'rgb', 'oklab', 'oklch', 'named'),\n *          or `null` if the input is not a valid color string.\n */\nexport default function getColorType(input: string): ColorTypeInput | null {\n  if (!isString(input)) {\n    return null;\n  }\n\n  if (isHex(input)) {\n    return 'hex';\n  }\n\n  if (isNamedColor(input)) {\n    return 'named';\n  }\n\n  try {\n    const { model } = extractColorParts(input);\n\n    return model;\n  } catch {\n    return null;\n  }\n}\n","import getColorType from '~/get-color-type';\n\nimport { ColorTypeInput } from '~/types';\n\n/**\n * Check if a string is a valid CSS color.\n * Optionally validate against a specific color type.\n *\n * @param input - The color string to validate.\n * @param type - Optional color type to check against.\n * @returns True if the input is a valid color (of the specified type, if given).\n */\nexport default function isValidColor(input: string, type?: ColorTypeInput): boolean {\n  const detectedType = getColorType(input);\n\n  if (detectedType === null) {\n    return false;\n  }\n\n  if (type === undefined) {\n    return true;\n  }\n\n  return detectedType === type;\n}\n","import { MESSAGES } from '~/modules/constants';\nimport { cssColors } from '~/modules/css-colors';\nimport { invariant } from '~/modules/invariant';\nimport { isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\n/**\n * Get the CSS color name of a color.\n * Returns the hex value if no matching name is found.\n *\n * @param input - The input color string.\n * @returns The CSS color name or hex value.\n */\nexport default function name(input: string): string {\n  invariant(isString(input), MESSAGES.inputString);\n\n  const hex = parseCSS(input, 'hex');\n\n  const [color] = Object.entries(cssColors).find(([, value]) => value === hex) || [];\n\n  return color ?? hex;\n}\n","import { oklch2oklab } from '~/converters';\nimport { LAB_TO_LMS, LSM_TO_RGB, MESSAGES, PRECISION, SRGB_TO_P3 } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { round } from '~/modules/utils';\nimport { isNumberInRange, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\n\nimport { ColorTuple, LCH } from '~/types';\n\nfunction isInP3Gamut(color: ColorTuple): boolean {\n  const epsilon = 0.000001;\n\n  return color.every(component => component >= 0 - epsilon && component <= 1 + epsilon);\n}\n\nfunction multiplyMatrix(matrix: number[][], vector: ColorTuple): ColorTuple {\n  return [\n    matrix[0][0] * vector[0] + matrix[0][1] * vector[1] + matrix[0][2] * vector[2],\n    matrix[1][0] * vector[0] + matrix[1][1] * vector[1] + matrix[1][2] * vector[2],\n    matrix[2][0] * vector[0] + matrix[2][1] * vector[1] + matrix[2][2] * vector[2],\n  ];\n}\n\nfunction oklabToLinearP3(L: number, a: number, b: number): ColorTuple {\n  const srgb = oklabToLinearSRGB(L, a, b);\n\n  return multiplyMatrix(SRGB_TO_P3, srgb);\n}\n\nfunction oklabToLinearSRGB(L: number, a: number, b: number): ColorTuple {\n  const l = (L + LAB_TO_LMS.l[0] * a + LAB_TO_LMS.l[1] * b) ** 3;\n  const m = (L + LAB_TO_LMS.m[0] * a + LAB_TO_LMS.m[1] * b) ** 3;\n  const s = (L + LAB_TO_LMS.s[0] * a + LAB_TO_LMS.s[1] * b) ** 3;\n\n  return [\n    LSM_TO_RGB.r[0] * l + LSM_TO_RGB.r[1] * m + LSM_TO_RGB.r[2] * s,\n    LSM_TO_RGB.g[0] * l + LSM_TO_RGB.g[1] * m + LSM_TO_RGB.g[2] * s,\n    LSM_TO_RGB.b[0] * l + LSM_TO_RGB.b[1] * m + LSM_TO_RGB.b[2] * s,\n  ];\n}\n\n/**\n * Get the maximum chroma for a given lightness and hue in the OkLCH color space.\n *\n * @param input - The input color string or LCH object.\n * @param precision - The number of decimal places for the result.\n * @returns The maximum chroma value within P3 gamut.\n */\nexport function getOkLCHMaxChroma(input: string | LCH, precision = PRECISION): number {\n  const { l, h } = isString(input) ? parseCSS(input, 'oklch') : input;\n\n  invariant(isNumberInRange(l, 0, 1), MESSAGES.lightnessRange);\n  invariant(isNumberInRange(h, 0, 360), MESSAGES.hueRange);\n\n  // Binary search parameters\n  const epsilon = 0.000001;\n  let low = 0;\n  let high = 0.5; // Increased max theoretical chroma\n\n  while (high - low > epsilon) {\n    const mid = (low + high) / 2;\n    const { l: L, a, b } = oklch2oklab({ l, c: mid, h }, 16);\n\n    const p3Color = oklabToLinearP3(L, a, b);\n\n    if (isInP3Gamut(p3Color)) {\n      low = mid;\n    } else {\n      high = mid;\n    }\n  }\n\n  return round(low, precision);\n}\n\n/**\n * Get an OkLCH color with maximum chroma in the P3 color space.\n *\n * @param input - The input color string or LCH object.\n * @returns The OkLCH color string with maximum chroma.\n */\nexport function getP3MaxColor(input: string | LCH): string {\n  const lch = isString(input) ? parseCSS(input, 'oklch') : input;\n\n  return `oklch(${lch.l} ${getOkLCHMaxChroma(lch)} ${lch.h})`;\n}\n","import convert from '~/convert';\nimport hex2hsl from '~/converters/hex2hsl';\nimport hsl2hex from '~/converters/hsl2hex';\nimport extractColorParts from '~/extract-color-parts';\nimport { MESSAGES, MONOCHROMATIC_LIGHTNESS_MAX } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex, isNamedColor, isPlainObject, isString } from '~/modules/validators';\nimport parseCSS from '~/parse-css';\nimport rotate from '~/rotate';\n\nimport { ColorType, HEX } from '~/types';\n\nexport interface PaletteOptions {\n  /**\n   * Output color format.\n   *\n   * If not specified, the output will use the same format as the input color.\n   */\n  format?: ColorType;\n  /**\n   * Adjusts the lightness of the base color before generating the palette.\n   *\n   * Value should be between 0 and 100.\n   */\n  lightness?: number;\n  /**\n   * Adjusts the saturation of the base color before generating the palette.\n   *\n   * Value should be between 0 and 100.\n   */\n  saturation?: number;\n  /**\n   * The number of colors to generate in the palette.\n   *\n   * Minimum value is 2.\n   * @default 6\n   */\n  size?: number;\n  /**\n   * Generate a monochromatic palette.\n   *\n   * For more options, use the `scale` function.\n   */\n  type?: 'monochromatic';\n}\n\n/**\n * Generate a color palette from a base color.\n *\n * @param input - The base color string.\n * @param options - Palette generation options.\n * @returns An array of color strings.\n */\nexport default function palette(input: string, options: PaletteOptions = {}): string[] {\n  invariant(isString(input), MESSAGES.inputString);\n  invariant(isPlainObject(options), MESSAGES.options);\n\n  const { format, lightness, saturation, size = 6, type } = options;\n\n  invariant(size >= 2, MESSAGES.paletteSize);\n\n  const hsl = parseCSS(input, 'hsl');\n  const colorFormat = isHex(input) || isNamedColor(input) ? 'hex' : extractColorParts(input).model;\n\n  const output: string[] = [];\n\n  if (type === 'monochromatic') {\n    const step = MONOCHROMATIC_LIGHTNESS_MAX / size;\n\n    for (let index = size; index > 0; index--) {\n      output.push(hsl2hex({ ...hsl, l: step * index }));\n    }\n  } else {\n    const step = 360 / size;\n\n    output.push(hsl2hex({ ...hsl, l: lightness ?? hsl.l, s: saturation ?? hsl.s }));\n\n    for (let index = 1; index < size; index++) {\n      const color = rotate(input, step * index, 'hex') as HEX;\n\n      output.push(hsl2hex({ ...hex2hsl(color), l: lightness ?? hsl.l, s: saturation ?? hsl.s }));\n    }\n  }\n\n  return output.map(color => convert(color, format ?? colorFormat));\n}\n","import formatCSS from '~/format-css';\nimport { clamp } from '~/modules/utils';\n\nimport { ColorType } from '~/types';\n\ninterface RandomOptions {\n  /**\n   * The color format to return.\n   * @default 'hex'\n   */\n  format?: ColorType;\n  /**\n   * Maximum hue value (0-360).\n   * @default 360\n   */\n  maxHue?: number;\n  /**\n   * Maximum lightness value (0-100).\n   * @default 90\n   */\n  maxLightness?: number;\n  /**\n   * Maximum saturation value (0-100).\n   * @default 100\n   */\n  maxSaturation?: number;\n  /**\n   * Minimum hue value (0-360).\n   * If minHue > maxHue, the range wraps around 0° (e.g., 330-30 for reds).\n   * @default 0\n   */\n  minHue?: number;\n  /**\n   * Minimum lightness value (0-100).\n   * @default 10\n   */\n  minLightness?: number;\n  /**\n   * Minimum saturation value (0-100).\n   * @default 10\n   */\n  minSaturation?: number;\n}\n\n/**\n * Generate a random number within a range.\n * Supports wrap-around for hue values (when min > max).\n */\nfunction randomInRange(min: number, max: number, wrapAt?: number): number {\n  if (wrapAt && min > max) {\n    // Handle wrap-around (e.g., hue 330-30 spans through 0)\n    const range = wrapAt - min + max;\n    const value = min + Math.floor(Math.random() * range);\n\n    return value >= wrapAt ? value - wrapAt : value;\n  }\n\n  return min + Math.floor(Math.random() * (max - min + 1));\n}\n\n/**\n * Generate a random color.\n *\n * @param options - Options to constrain the random color generation.\n * @returns The random color string.\n */\nexport default function random(options: RandomOptions = {}): string {\n  const { format = 'hex' } = options;\n\n  const minHue = clamp(options.minHue ?? 0, 0, 360);\n  const maxHue = clamp(options.maxHue ?? 360, 0, 360);\n  const minSaturation = clamp(options.minSaturation ?? 10, 0, 100);\n  const maxSaturation = clamp(options.maxSaturation ?? 100, 0, 100);\n  const minLightness = clamp(options.minLightness ?? 10, 0, 100);\n  const maxLightness = clamp(options.maxLightness ?? 90, 0, 100);\n\n  const hsl = {\n    h: randomInRange(minHue, maxHue, 360),\n    s: randomInRange(\n      Math.min(minSaturation, maxSaturation),\n      Math.max(minSaturation, maxSaturation),\n    ),\n    l: randomInRange(Math.min(minLightness, maxLightness), Math.max(minLightness, maxLightness)),\n  };\n\n  return formatCSS(hsl, { format });\n}\n","import apcaContrast from '~/apca';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isString } from '~/modules/validators';\n\nexport interface ReadableColorAPCAOptions {\n  /**\n   * The dark color to return if it has better contrast.\n   * @default '#000000'\n   */\n  darkColor?: string;\n  /**\n   * The light color to return if it has better contrast.\n   * @default '#ffffff'\n   */\n  lightColor?: string;\n}\n\n/**\n * Get the most readable color for a given background using APCA contrast.\n *\n * APCA (Accessible Perceptual Contrast Algorithm) is the contrast method\n * proposed for WCAG 3.0. It's polarity-aware and provides more accurate\n * contrast predictions than WCAG 2.x contrast ratio.\n *\n * This function compares the APCA contrast of both light and dark options\n * against the background and returns the one with higher absolute contrast.\n *\n * @param backgroundColor - The background color string.\n * @param options - Options for the light and dark colors.\n * @returns The most readable color (light or dark).\n */\nexport default function readableColorAPCA(\n  backgroundColor: string,\n  options: ReadableColorAPCAOptions = {},\n): string {\n  const { darkColor = '#000000', lightColor = '#ffffff' } = options;\n\n  invariant(isString(backgroundColor), MESSAGES.inputString);\n\n  const darkContrast = Math.abs(apcaContrast(backgroundColor, darkColor));\n  const lightContrast = Math.abs(apcaContrast(backgroundColor, lightColor));\n\n  // Return darkColor if equal (arbitrary but consistent)\n  return darkContrast >= lightContrast ? darkColor : lightColor;\n}\n","import formatCSS from '~/format-css';\nimport getColorType from '~/get-color-type';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { clamp, getScaleStepKeys, warn } from '~/modules/utils';\nimport { isNumber, isString } from '~/modules/validators';\nimport { getOkLCHMaxChroma } from '~/p3';\nimport parseCSS from '~/parse-css';\n\nimport type { ColorType, LCH } from '~/types';\n\ninterface GeneratePaletteOptions extends Required<\n  Pick<ScaleOptions, 'chromaCurve' | 'lightnessCurve' | 'maxLightness' | 'minLightness' | 'mode'>\n> {\n  baseChroma: number;\n  hue: number;\n  inputLightness: number | undefined;\n  keys: number[];\n  lock: number | undefined;\n}\n\nexport type ScaleMode = 'light' | 'dark';\n\nexport type ScaleVariant = 'deep' | 'neutral' | 'pastel' | 'subtle' | 'vibrant';\n\n/**\n * Options for generating a color scale.\n *\n * **Option Precedence:**\n * - `saturation` overrides `variant` if both are set\n * - `lock` affects palette calculation: steps are distributed relative to the locked position\n * - `mode` affects lightness direction: 'light' has lightest at low keys, 'dark' reverses this\n */\nexport interface ScaleOptions {\n  /**\n   * Controls chroma adjustment across lightness levels.\n   * Values between 0-1 interpolate between these behaviors.\n   *\n   * @default 0\n   */\n  chromaCurve?: number;\n  /**\n   * Output color format.\n   *\n   * Determines the format of the generated colors (e.g., HEX, RGB, OKLCH, etc.).\n   *\n   * If not specified, the output will match the format of the input color.\n   */\n  format?: ColorType;\n  /**\n   * The lightness tuning factor for the scale.\n   * - 1: Linear lightness distribution.\n   * - >1: Lighter tones are emphasized.\n   * - <1: Darker tones are emphasized.\n   * @default 1.5\n   */\n  lightnessCurve?: number;\n  /**\n   * Lock input color at specific step position.\n   *\n   * The input color will appear exactly at this step, and other steps\n   * will be calculated relative to this anchor point.\n   *\n   * Must be a valid step key for the current step count.\n   * Default step keys (11 steps): 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950.\n   * Step keys vary based on the `steps` option (3-20 steps supported).\n   */\n  lock?: number;\n  /**\n   * The maximum lightness value for the scale.\n   *\n   * Defines the upper bound for the lightest color in the palette.\n   *\n   * A number between 0 and 1.\n   * @default 0.97\n   */\n  maxLightness?: number;\n  /**\n   * The minimum lightness value for the scale.\n   *\n   * Defines the lower bound for the darkest color in the palette.\n   *\n   * A number between 0 and 1.\n   *\n   * @default 0.2\n   */\n  minLightness?: number;\n  /**\n   * Theme-aware lightness direction.\n   *\n   * - 'light': Low keys (50) are lightest, high keys (950) are darkest\n   * - 'dark': Low keys (50) are darkest, high keys (950) are lightest\n   *\n   * @default 'light'\n   */\n  mode?: ScaleMode;\n  /**\n   * Global saturation override (0-100).\n   *\n   * When set, overrides the chroma for all generated shades.\n   * Maps to chroma in OKLCH space.\n   *\n   * Overrides `variant` if both are set.\n   */\n  saturation?: number;\n  /**\n   * Number of steps in the scale (3-20).\n   *\n   * Controls how many color shades are generated.\n   *\n   * @default 11\n   */\n  steps?: number;\n  /**\n   * The variant of the scale.\n   * - 'deep': Generates rich and bold tones with significantly reduced lightness.\n   * - 'neutral': Generates muted tones by reducing chroma.\n   * - 'pastel': Produces soft and airy tones with significant chroma reduction.\n   * - 'subtle': Creates extremely desaturated tones, close to grayscale.\n   * - 'vibrant': Enhances chroma for bold and striking tones.\n   */\n  variant?: ScaleVariant;\n}\n\nconst chromaScale: Record<string, number> = {\n  deep: 0.8,\n  neutral: 0.5,\n  pastel: 0.3,\n  subtle: 0.2,\n  vibrant: 1.25,\n};\n\n/**\n * Generate the color palette for the scale.\n */\nfunction generatePalette(options: GeneratePaletteOptions): Record<number, LCH> {\n  const {\n    baseChroma,\n    chromaCurve,\n    hue,\n    inputLightness,\n    keys,\n    lightnessCurve,\n    lock,\n    maxLightness,\n    minLightness,\n    mode,\n  } = options;\n\n  const palette: Record<number, LCH> = {};\n\n  // Calculate lightness values\n  const lightnessMap: Record<number, number> = {};\n\n  if (lock !== undefined && inputLightness !== undefined) {\n    const lockIndex = keys.indexOf(lock);\n\n    lightnessMap[lock] = inputLightness;\n\n    // Keys before lock\n    if (lockIndex > 0) {\n      const target = mode === 'light' ? maxLightness : minLightness;\n\n      for (let index = 0; index < lockIndex; index++) {\n        const t = index / lockIndex;\n\n        lightnessMap[keys[index]] = target + (inputLightness - target) * t ** lightnessCurve;\n      }\n    }\n\n    // Keys after lock\n    const remaining = keys.length - 1 - lockIndex;\n\n    if (remaining > 0) {\n      const target = mode === 'light' ? minLightness : maxLightness;\n\n      for (let index = lockIndex + 1; index < keys.length; index++) {\n        const t = (index - lockIndex) / remaining;\n\n        lightnessMap[keys[index]] =\n          inputLightness + (target - inputLightness) * t ** lightnessCurve;\n      }\n    }\n  } else {\n    // Standard calculation (no lock)\n    for (let index = 0; index < keys.length; index++) {\n      const t = (index / (keys.length - 1)) ** lightnessCurve;\n\n      lightnessMap[keys[index]] =\n        mode === 'light'\n          ? maxLightness - (maxLightness - minLightness) * t\n          : minLightness + (maxLightness - minLightness) * t;\n    }\n  }\n\n  // Generate LCH colors\n  for (const key of keys) {\n    const lightness = lightnessMap[key];\n    const chroma = getStepChroma(lightness, baseChroma, chromaCurve);\n    const maxChroma = getOkLCHMaxChroma({ l: lightness, c: 0, h: hue });\n\n    palette[key] = { l: lightness, c: Math.min(chroma, maxChroma), h: hue };\n  }\n\n  return palette;\n}\n\n/**\n * Calculate chroma for a step, applying chromaCurve if set.\n */\nfunction getStepChroma(lightness: number, baseChroma: number, chromaCurve: number): number {\n  if (chromaCurve === 0) {\n    return baseChroma;\n  }\n\n  const parabolic = 4 * lightness * (1 - lightness);\n  const curveScale = 1 - chromaCurve * (1 - parabolic);\n\n  return baseChroma * curveScale;\n}\n\n/**\n * Generate a scale of colors based on the input color.\n *\n * This utility is ideal for designers and developers who need dynamic color\n * palettes for UI themes, design systems, or data visualization. Supports\n * multiple modes, scales, and variants for flexibility.\n *\n * @param input - The base color string.\n * @param options - Scale generation options.\n * @returns A record of step keys to color strings.\n */\nexport default function scale(input: string, options: ScaleOptions = {}): Record<number, string> {\n  invariant(isString(input), MESSAGES.inputString);\n  const {\n    chromaCurve = 0,\n    format,\n    lightnessCurve = 1.5,\n    lock: lockOption,\n    maxLightness = 0.97,\n    minLightness = 0.2,\n    mode = 'light',\n    saturation,\n    steps: stepsOption,\n    variant,\n  } = options;\n\n  invariant(\n    maxLightness > minLightness && maxLightness <= 1 && minLightness >= 0,\n    'maxLightness must be greater than minLightness and within the range [0, 1].',\n  );\n\n  const steps = stepsOption !== undefined ? clamp(Math.round(stepsOption), 3, 20) : 11;\n  const keys = getScaleStepKeys(steps);\n\n  // Validate lock option\n  let lock = lockOption;\n\n  if (lock !== undefined) {\n    if (!isNumber(lock) || !keys.includes(lock)) {\n      warn(`lock: ${lock} is not valid for steps: ${steps}, ignoring`);\n      lock = undefined;\n    }\n  }\n\n  const lch = parseCSS(input, 'oklch');\n\n  // Determine base chroma\n  let baseChroma: number;\n\n  if (saturation !== undefined) {\n    // saturation overrides: % of max P3 chroma at input's lightness\n    const maxChroma = getOkLCHMaxChroma(lch);\n\n    baseChroma = (clamp(saturation, 0, 100) / 100) * maxChroma;\n  } else if (variant && chromaScale[variant]) {\n    baseChroma = lch.c * chromaScale[variant];\n  } else {\n    baseChroma = lch.c;\n  }\n\n  const detectedType = getColorType(input);\n  let colorFormat: ColorType = 'hex';\n\n  if (detectedType) {\n    colorFormat = detectedType === 'named' ? 'hex' : detectedType;\n  }\n\n  // Generate the color palette\n  const palette = generatePalette({\n    baseChroma,\n    chromaCurve,\n    hue: lch.h,\n    inputLightness: lock !== undefined ? lch.l : undefined,\n    keys,\n    lightnessCurve,\n    lock,\n    maxLightness,\n    minLightness,\n    mode,\n  });\n\n  return Object.fromEntries(\n    Object.entries(palette).map(([key, value]) => [\n      key,\n      formatCSS(value, { format: format ?? colorFormat }),\n    ]),\n  );\n}\n","import convert from '~/convert';\nimport extractColorParts from '~/extract-color-parts';\nimport { MESSAGES } from '~/modules/constants';\nimport { invariant } from '~/modules/invariant';\nimport { isHex, isNamedColor, isString } from '~/modules/validators';\nimport rotate from '~/rotate';\n\nimport { ColorType } from '~/types';\n\nexport type Scheme =\n  | 'analogous'\n  | 'complementary'\n  | 'rectangle'\n  | 'split'\n  | 'split-complementary'\n  | 'square'\n  | 'tetradic'\n  | 'triadic';\n\nexport interface SchemeOptions {\n  /**\n   * Output color format.\n   *\n   * If not specified, the output will use the same format as the input color.\n   */\n  format?: ColorType;\n  /**\n   * The type of scheme to generate.\n   * @default 'complementary'\n   */\n  type?: Scheme;\n}\n\n/**\n * Get a color scheme based on the input color.\n *\n * @param input - The base color string.\n * @param typeOrOptions - The scheme type or options object.\n * @returns An array of color strings forming the scheme.\n */\nexport default function scheme(input: string, typeOrOptions?: Scheme | SchemeOptions): string[] {\n  invariant(isString(input), MESSAGES.inputString);\n  const { format, type = 'complementary' } = isString(typeOrOptions)\n    ? { type: typeOrOptions }\n    : (typeOrOptions ?? {});\n\n  const output = isHex(input) || isNamedColor(input) ? 'hex' : extractColorParts(input).model;\n\n  const colors: string[] = [];\n\n  switch (type) {\n    case 'analogous': {\n      colors.push(rotate(input, -30), input, rotate(input, 30));\n      break;\n    }\n    case 'complementary': {\n      colors.push(input, rotate(input, 180));\n      break;\n    }\n\n    case 'split':\n    case 'split-complementary': {\n      colors.push(input, rotate(input, 150), rotate(input, 210));\n      break;\n    }\n    case 'triadic': {\n      colors.push(input, rotate(input, 120), rotate(input, 240));\n      break;\n    }\n\n    case 'tetradic':\n    case 'rectangle': {\n      colors.push(input, rotate(input, 60), rotate(input, 180), rotate(input, 240));\n      break;\n    }\n    case 'square': {\n      colors.push(input, rotate(input, 90), rotate(input, 180), rotate(input, 270));\n      break;\n    }\n    default: {\n      throw new TypeError('invalid type');\n    }\n  }\n\n  return colors.map(color => convert(color, format ?? output));\n}\n"],"mappings":";;;;;;;;;AAEO,IAAM,aAAoD;AAAA,EAC/D,KAAK,CAAC,KAAK,KAAK,GAAG;AAAA,EACnB,OAAO,CAAC,KAAK,KAAK,GAAG;AAAA,EACrB,OAAO,CAAC,KAAK,KAAK,GAAG;AAAA,EACrB,KAAK,CAAC,KAAK,KAAK,GAAG;AACrB;AACO,IAAM,eAAgC,CAAC,OAAO,SAAS,SAAS,KAAK;AACrE,IAAM,UAAU,KAAK,KAAK;AAC1B,IAAM,aAAa;AAAA,EACxB,GAAG,CAAC,oBAAoB,kBAAkB;AAAA,EAC1C,GAAG,CAAC,qBAAqB,mBAAmB;AAAA,EAC5C,GAAG,CAAC,qBAAqB,mBAAmB;AAC9C;AACO,IAAM,cAAc;AAAA,EACzB,GAAG,CAAC,cAAc,cAAc,YAAY;AAAA,EAC5C,GAAG,CAAC,cAAc,cAAc,YAAY;AAAA,EAC5C,GAAG,CAAC,cAAc,cAAc,YAAY;AAC9C;AACO,IAAM,aAAa;AAAA,EACxB,GAAG,CAAC,cAAc,aAAa,YAAY;AAAA,EAC3C,GAAG,CAAC,cAAc,aAAa,YAAY;AAAA,EAC3C,GAAG,CAAC,cAAc,cAAc,WAAW;AAC7C;AACO,IAAM,aAAa;AAAA,EACxB,GAAG,CAAC,mBAAoB,oBAAqB,kBAAkB;AAAA,EAC/D,GAAG,CAAC,qBAAqB,mBAAoB,kBAAkB;AAAA,EAC/D,GAAG,CAAC,qBAAqB,qBAAqB,kBAAkB;AAClE;AACO,IAAM,aAAa;AAAA,EACxB,CAAC,cAAc,cAAc,CAAC;AAAA,EAC9B,CAAC,cAAc,cAAc,CAAC;AAAA,EAC9B,CAAC,cAAc,cAAc,YAAY;AAC3C;AACO,IAAM,YAAY;AAClB,IAAM,UAAU,MAAM,KAAK;AAE3B,IAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,cAAc;AAAA,EACd,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa;AAAA,EACb,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,qBAAqB;AACvB;AAEO,IAAM,8BAA8B;;;AC5DpC,SAAS,UAAU,WAAoB,SAAoC;AAChF,MAAI,WAAW;AACb;AAAA,EACF;AAEA,MAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,QAAI,YAAY,QAAW;AACzB,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,UACX,IAAI;AAAA,IACF;AAAA,EACF,IACA,IAAI,MAAM,OAAO;AAErB,QAAM,OAAO;AAEb,QAAM;AACR;;;ACrBO,IAAM,YAAY;AAAA,EACvB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EACf,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,eAAe;AAAA,EACf,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,EACb,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,WAAW;AAAA,EACX,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,KAAK;AAAA,EACL,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,aAAa;AACf;;;ACrJA,IAAM,WAAW;AAEV,SAAS,gBAAgB,OAAmC;AACjE,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAClD;AAEO,SAAS,MAAM,OAA8B;AAClD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,KAAK,KAAK;AAC5B;AAOO,SAAS,MAAM,OAA8B;AAClD,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAK;AAEpC,SACE,CAAC,CAAC,QAAQ,UACV,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9B,QAAI,QAAQ,KAAK;AACf,aAAO,SAAS,KAAK,SAAS;AAAA,IAChC;AAEA,QAAI,QAAQ,SAAS;AACnB,aAAO,SAAS,KAAK,SAAS;AAAA,IAChC;AAEA,WAAO,WAAW,IAAI,SAAS,GAAG,KAAK,SAAS,KAAK,SAAS;AAAA,EAChE,CAAC;AAEL;AAMO,SAAS,MAAM,OAA8B;AAClD,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAK;AAEpC,SACE,CAAC,CAAC,QAAQ,UACV,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9B,QAAI,QAAQ,KAAK;AACf,aAAO,SAAS,KAAK,SAAS;AAAA,IAChC;AAEA,QAAI,QAAQ,SAAS;AACnB,aAAO,SAAS,KAAK,SAAS;AAAA,IAChC;AAEA,WAAO,WAAW,MAAM,SAAS,GAAG,KAAK,SAAS,MAAM,SAAS;AAAA,EACnE,CAAC;AAEL;AAMO,SAAS,MAAM,OAA8B;AAClD,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAK;AAEpC,SACE,CAAC,CAAC,QAAQ,UACV,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9B,QAAI,QAAQ,KAAK;AACf,aAAO,SAAS,KAAK,SAAS;AAAA,IAChC;AAEA,QAAI,QAAQ,SAAS;AACnB,aAAO,SAAS,KAAK,SAAS;AAAA,IAChC;AAEA,WAAO,WAAW,MAAM,SAAS,GAAG,KAAK,SAAS,KAAK,UAAU,QAAQ,MAAM,MAAM;AAAA,EACvF,CAAC;AAEL;AAKO,SAAS,aAAa,OAAmC;AAC9D,SAAO,SAAS,KAAK,KAAK,OAAO,KAAK,SAAS,EAAE,SAAS,MAAM,YAAY,CAAC;AAC/E;AAKO,SAAS,SAAS,OAAiC;AACxD,SAAO,OAAO,UAAU,YAAY,CAAC,OAAO,MAAM,KAAK;AACzD;AAKO,SAAS,gBAAgB,OAAgB,KAAa,KAA8B;AACzF,SAAO,SAAS,KAAK,KAAK,SAAS,OAAO,SAAS;AACrD;AAKO,SAAS,cAAc,OAAsC;AAClE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,IAAI,OAAO;AAC5B,QAAM,YAAY,OAAO,eAAe,KAAK;AAE7C,SACE,SAAS,KAAK,KAAK,MAAM,sBACxB,cAAc,QAAQ,cAAc,OAAO,eAAe,CAAC,CAAC;AAEjE;AAMO,SAAS,MAAM,OAA8B;AAClD,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAK;AAEpC,SACE,CAAC,CAAC,QAAQ,UACV,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9B,QAAI,QAAQ,SAAS;AACnB,aAAO,SAAS,KAAK,SAAS;AAAA,IAChC;AAEA,WAAO,WAAW,IAAI,SAAS,GAAG,KAAK,SAAS,KAAK,SAAS;AAAA,EAChE,CAAC;AAEL;AAKO,SAAS,SAAS,OAAgB,WAAW,MAAuB;AACzE,QAAM,UAAU,OAAO,UAAU;AAEjC,MAAI,UAAU;AACZ,WAAO,WAAW,CAAC,CAAC,MAAM,KAAK,EAAE;AAAA,EACnC;AAEA,SAAO;AACT;AAEO,SAAS,kBAAwC,OAAsB;AAC5E,SAAO,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK;AACpE;;;ACrKe,SAAR,UAA2B,OAAoB;AACpD,YAAU,MAAM,KAAK,GAAG,SAAS,QAAQ;AAEzC,MAAI,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAEjC,MAAI,MAAM,WAAW,KAAK,MAAM,WAAW,GAAG;AAC5C,UAAM,SAAS,CAAC,GAAG,KAAK;AAExB,YAAQ;AAER,WAAO,QAAQ,OAAK;AAClB,eAAS,GAAG,CAAC,GAAG,CAAC;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,IAAI,KAAK;AAErB,YAAU,MAAM,GAAG,GAAG,SAAS,UAAU;AAEzC,SAAO;AACT;;;ACHO,SAAS,SAA+B,OAAU,OAAmB;AAC1E,YAAU,kBAAkB,KAAK,GAAG,SAAS,OAAO;AAEpD,MAAI,QAAQ;AAEZ,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAGA,MAAI,QAAQ,GAAG;AACb,aAAS;AAAA,EACX;AAEA,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,GAAG,OAAO,OAAO,MAAM;AAClC;AAUO,SAAS,MAAM,OAAe,MAAM,GAAG,MAAM,KAAa;AAC/D,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C;AASO,SAAS,iBAAiB,OAAe,QAAwB;AACtE,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAE/C,MAAI,QAAQ,QAAQ;AAEpB,MAAI,QAAQ,KAAK;AACf,aAAS;AAAA,EACX;AAEA,MAAI,QAAQ,GAAG;AACb,aAAS;AAAA,EACX;AAEA,SAAO,KAAK,IAAI,KAAK;AACvB;AAQO,SAAS,aACd,OACoB;AACpB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM;AACf;AAUO,SAAS,MACd,OACA,OACA,KACQ;AACR,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAC/C,YAAU,aAAa,SAAS,KAAK,GAAG,GAAG,SAAS,YAAY,GAAG,QAAQ,KAAK,KAAK,KAAK,EAAE,EAAE;AAC9F,YAAU,WAAW,KAAK,EAAE,SAAS,GAAG,GAAG,GAAG,SAAS,UAAU,GAAG,MAAM,KAAK,GAAG,KAAK,EAAE,EAAE;AAE3F,UAAQ,OAAO;AAAA,IACb,KAAK,OAAO;AACV,gBAAU,WAAW,IAAI,SAAS,GAAG,GAAG,SAAS,UAAU;AAE3D,UAAI,CAAC,KAAK,GAAG,EAAE,SAAS,GAAG,GAAG;AAC5B,eAAO,MAAM,KAAK;AAAA,MACpB;AAEA,aAAO,MAAM,OAAO,GAAG,GAAG;AAAA,IAC5B;AAAA,IACA,KAAK,OAAO;AACV,gBAAU,WAAW,IAAI,SAAS,GAAG,GAAG,SAAS,UAAU;AAE3D,aAAO,MAAM,OAAO,GAAG,GAAG;AAAA,IAC5B;AAAA;AAAA,IAEA,SAAS;AACP,YAAM,IAAI,MAAM,gBAAgB;AAAA,IAClC;AAAA,EACF;AACF;AASO,SAAS,WACd,OACA,OACG;AACH,QAAM,OAAO,WAAW,KAAK;AAC7B,QAAM,YAAY;AAAA,IAChB,KAAK;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK;AAAA,EACP;AAEA,YAAU,cAAc,KAAK,KAAK,MAAM,QAAQ,KAAK,GAAG,SAAS,OAAO;AAExE,QAAM,QAAQ,MAAM,QAAQ,KAAK,IAC5B,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,IACjE;AAEJ,YAAU,UAAU,KAAK,EAAE,KAAK,GAAG,GAAG,SAAS,YAAY,KAAK,KAAK,EAAE;AAEvE,SAAO;AACT;AA+BO,SAAS,eACd,OACA,YAAoB,WACpB,iBAAiB,MACd;AACH,QAAM,SAAS,IAAI,IAAI,OAAO,QAAQ,KAAK,CAAC;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3C,WAAO,IAAI,KAAK,MAAM,OAAO,WAAW,cAAc,CAAC;AAAA,EACzD;AAEA,SAAO,OAAO,YAAY,MAAM;AAClC;AAUO,SAAS,MAAM,OAAe,YAAY,GAAG,iBAAiB,MAAc;AACjF,MAAI,CAAC,SAAS,KAAK,KAAK,UAAU,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB;AAClB,UAAMA,UAAS,MAAM;AAErB,WAAO,KAAK,MAAM,QAAQA,OAAM,IAAIA;AAAA,EACtC;AAEA,QAAM,WAAW,KAAK,IAAI,KAAK;AAE/B,MAAI,SAAS,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,CAAC;AAE/D,MAAI,WAAW,GAAG;AAChB,aAAS;AAAA,EACX,WAAW,SAAS,WAAW;AAC7B,aAAS;AAAA,EACX;AAEA,MAAI,WAAW,aAAa,SAAS,IAAI,IAAI;AAE7C,MAAI,YAAY,KAAK,YAAY,GAAG;AAClC,eAAW;AAAA,EACb,WAAW,WAAW,aAAa,aAAa,GAAG;AACjD,eAAW;AAAA,EACb;AAEA,QAAM,SAAS,MAAM;AAErB,SAAO,KAAK,MAAM,QAAQ,MAAM,IAAI;AACtC;AAOO,SAAS,KAAK,SAAuB;AAC1C,MAAI,QAAQ,IAAI,aAAa,cAAc;AAEzC,YAAQ,KAAK,cAAc,OAAO,EAAE;AAAA,EACtC;AACF;AAYA,IAAM,YAAsC;AAAA,EAC1C,GAAG,CAAC,KAAK,KAAK,GAAG;AAAA,EACjB,GAAG,CAAC,KAAK,KAAK,KAAK,GAAG;AAAA,EACtB,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC3B,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAChC,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACrC,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC1C,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC/C,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACpD,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACzD,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC9D,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACnE,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACxE,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC7E,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAClF,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACvF,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC5F,IAAI;AAAA,IACF;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,EAC3F;AAAA,EACA,IAAI;AAAA,IACF;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACzF;AAAA,EACF;AACF;AAQO,SAAS,iBAAiB,OAAyB;AACxD,QAAM,QAAQ,MAAM,KAAK,MAAM,KAAK,GAAG,GAAG,EAAE;AAE5C,SAAO,UAAU,KAAK;AACxB;;;AC3SO,SAAS,cAAc,OAAe,OAAoB;AAC/D,YAAU,MAAM,KAAK,GAAG,SAAS,QAAQ;AACzC,YAAU,gBAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAEtD,MAAI,SAAS,GAAG;AACd,WAAO,mBAAmB,KAAK;AAAA,EACjC;AAEA,SAAO,GAAG,mBAAmB,KAAK,CAAC,GAAG,kBAAkB,KAAK,CAAC;AAChE;AAQO,SAAS,kBAAkB,OAAuB;AACvD,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAE/C,MAAI,QAAQ;AAEZ,MAAI,QAAQ,GAAG;AACb,aAAS;AAAA,EACX;AAEA,SAAO,KAAK,MAAM,QAAQ,GAAG,EAC1B,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACpB;AAQO,SAAS,oBAAoB,OAAuB;AACzD,YAAU,MAAM,KAAK,GAAG,SAAS,WAAW;AAE5C,QAAM,QAAQ,MAAM,UAAU,GAAG,CAAC;AAElC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,SAAS,OAAO,EAAE,IAAI,GAAG;AACxC;AAQO,SAAS,oBAAoB,OAAuB;AACzD,SAAO,MAAM,SAAS,OAAO,EAAE,CAAC;AAClC;AAQO,SAAS,mBAAmB,OAAoB;AACrD,YAAU,MAAM,KAAK,GAAG,SAAS,QAAQ;AAEzC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,MAAM,UAAU,GAAG,CAAC;AAAA,EAC7B;AAEA,SAAO,MAAM,UAAU,GAAG,CAAC;AAC7B;;;ACxEe,SAAR,QAAyB,OAAoB;AAClD,YAAU,MAAM,KAAK,GAAG,SAAS,QAAQ;AAEzC,QAAM,MAAM,UAAU,KAAK,EAAE,MAAM,CAAC;AACpC,QAAM,QAAQ,oBAAoB,KAAK;AAEvC,SAAO;AAAA,IACL;AAAA,MACE,GAAG,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;AAAA,MAC7C,GAAG,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;AAAA,MAC7C,GAAG,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;AAAA,IAC/C;AAAA,IACA;AAAA,EACF;AACF;;;AC7BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACUe,SAAR,QAAyB,OAAsC;AACpE,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,QAAM,QAAQ,aAAa,KAAK;AAEhC,QAAM,SAAS,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI;AAC5C,QAAM,SAAS,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI;AAC5C,QAAM,SAAS,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI;AAE5C,QAAM,MAAM,KAAK,IAAI,QAAQ,QAAQ,MAAM;AAC3C,QAAM,MAAM,KAAK,IAAI,QAAQ,QAAQ,MAAM;AAC3C,QAAM,QAAQ,MAAM;AAEpB,MAAI,IAAI;AACR,MAAI;AACJ,QAAM,KAAK,MAAM,OAAO;AACxB,MAAI;AAEJ,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,CAAC,QAAQ,KAAK,SAAS,UAAU;AACxC,UAAI,KAAK;AACT;AAAA,IACF,KAAK;AACH,cAAQ,SAAS,UAAU;AAC3B,UAAI,KAAK,OAAO;AAChB;AAAA,IACF,KAAK;AACH,cAAQ,SAAS,UAAU;AAC3B,UAAI,KAAK,OAAO;AAChB;AAAA;AAAA,IAEF;AACE;AAAA,EACJ;AAEA,MAAI,IAAI,GAAG;AACT,QAAI,MAAM;AAAA,EACZ;AAEA,MAAI,QAAQ,KAAK;AACf,QAAI;AAAA,EACN,OAAO;AACL,QAAI,IAAI,MAAM,SAAS,IAAI,KAAK,SAAS,IAAI,IAAI;AAAA,EACnD;AAEA,SAAO;AAAA,IACL;AAAA,MACE,GAAG,KAAK,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,MACjC,GAAG,EAAE,IAAI,KAAK,QAAQ,CAAC;AAAA,MACvB,GAAG,EAAE,IAAI,KAAK,QAAQ,CAAC;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;;;AC/Ce,SAAR,QAAyB,OAAoB;AAClD,YAAU,MAAM,KAAK,GAAG,SAAS,QAAQ;AAEzC,QAAM,QAAQ,oBAAoB,KAAK;AAEvC,SAAO,SAAS,QAAQ,QAAQ,KAAK,CAAC,GAAG,KAAK;AAChD;;;ACjBA,IAAM,EAAE,MAAM,KAAK,IAAI;AAEvB,SAAS,SAAS,OAAe;AAC/B,QAAMC,OAAM,KAAK,IAAI,KAAK;AAE1B,MAAIA,OAAM,SAAS;AACjB,WAAO,QAAQ;AAAA,EACjB;AAEA,UAAQ,KAAK,KAAK,KAAK,OAAOA,OAAM,SAAS,UAAU;AACzD;AASe,SAAR,UAA2B,OAAiC,YAAY,WAAgB;AAC7F,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,QAAM,QAAQ,aAAa,KAAK;AAEhC,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,SAAS,MAAM,IAAI,GAAG,GAAG,SAAS,MAAM,IAAI,GAAG,GAAG,SAAS,MAAM,IAAI,GAAG,CAAC;AAC/F,QAAM,IAAI,KAAK,YAAY,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC,IAAI,EAAE;AACpF,QAAM,IAAI,KAAK,YAAY,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC,IAAI,EAAE;AACpF,QAAM,IAAI,KAAK,YAAY,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC,IAAI,EAAE;AAEpF,QAAM,MAAM;AAAA,IACV;AAAA,MACE,GAAG,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI;AAAA,MACjE,GAAG,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI;AAAA,MACjE,GAAG,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI;AAAA,IACnE;AAAA,IACA;AAAA,EACF;AAEA,SAAO,SAAS,KAAK,KAAK;AAC5B;;;AC1Be,SAAR,UAA2B,OAAe,WAAyB;AACxE,YAAU,MAAM,KAAK,GAAG,SAAS,QAAQ;AAEzC,QAAM,QAAQ,oBAAoB,KAAK;AAEvC,SAAO,SAAS,UAAU,QAAQ,KAAK,GAAG,SAAS,GAAG,KAAK;AAC7D;;;AClBA,IAAM,EAAE,OAAO,KAAK,IAAI;AAST,SAAR,YAA6B,OAAiC,WAAyB;AAC5F,QAAM,EAAE,GAAG,GAAG,EAAE,IAAI,eAAe,WAAW,OAAO,OAAO,CAAC;AAC7D,QAAM,QAAQ,aAAa,KAAK;AAEhC,QAAM,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC;AAC9B,MAAI,KAAK,MAAM,GAAG,CAAC,IAAI,UAAU,OAAO;AAExC,MAAI,MAAM,IAAI,GAAK,MAAM,GAAG;AAC1B,QAAI;AAAA,EACN;AAEA,SAAO,SAAS,eAAe,EAAE,GAAG,GAAG,EAAE,GAAG,SAAS,GAAG,KAAK;AAC/D;;;ACbe,SAAR,UAA2B,OAAiC,WAAyB;AAC1F,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,QAAM,QAAQ,aAAa,KAAK;AAEhC,SAAO,SAAS,YAAY,UAAU,OAAO,SAAS,GAAG,SAAS,GAAG,KAAK;AAC5E;;;ACDe,SAAR,UAA2B,OAAe,WAAyB;AACxE,YAAU,MAAM,KAAK,GAAG,SAAS,QAAQ;AAEzC,QAAM,QAAQ,oBAAoB,KAAK;AAEvC,SAAO,SAAS,UAAU,QAAQ,KAAK,GAAG,SAAS,GAAG,KAAK;AAC7D;;;ACVe,SAAR,QAAyB,OAAeC,SAAgB,GAAmB;AAChF,YAAU,SAAS,KAAK,KAAK,SAASA,OAAM,KAAK,SAAS,CAAC,GAAG,SAAS,OAAO;AAC9E,MAAI,MAAM;AAEV,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,GAAG;AACX,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,IAAI,GAAG;AACf,WAAO,MAAM,SAASA,UAAS,SAAS,IAAI,KAAK,CAAC;AAAA,EACpD;AAEA,MAAI,MAAM,IAAI,GAAG;AACf,WAAO,MAAMA,SAAQ,CAAC;AAAA,EACxB;AAEA,MAAI,MAAM,IAAI,GAAG;AACf,WAAO,MAAM,SAASA,UAAS,UAAU,IAAI,IAAI,OAAO,GAAG,CAAC;AAAA,EAC9D;AAEA,SAAO,MAAM,OAAO,CAAC;AACvB;;;AC3Be,SAAR,QAAyB,OAAsC;AACpE,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,QAAM,QAAQ,aAAa,KAAK;AAEhC,QAAM,IAAI,MAAM,MAAM,CAAC,IAAI;AAC3B,QAAM,IAAI,MAAM,MAAM,CAAC,IAAI;AAC3B,QAAM,IAAI,MAAM,MAAM,CAAC,IAAI;AAE3B,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI;AACJ,MAAIC;AAEJ,MAAI,MAAM,GAAG;AACX,QAAI;AACJ,QAAI;AACJ,QAAI;AAAA,EACN,OAAO;AACL,IAAAA,UAAS,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI;AAC7C,YAAQ,IAAI,IAAIA;AAEhB,QAAI,QAAQ,OAAOA,SAAQ,IAAI,IAAI,CAAC;AACpC,QAAI,QAAQ,OAAOA,SAAQ,CAAC;AAC5B,QAAI,QAAQ,OAAOA,SAAQ,IAAI,IAAI,CAAC;AAAA,EACtC;AAEA,SAAO;AAAA,IACL;AAAA,MACE,GAAG,KAAK,MAAM,IAAI,GAAG;AAAA,MACrB,GAAG,KAAK,MAAM,IAAI,GAAG;AAAA,MACrB,GAAG,KAAK,MAAM,IAAI,GAAG;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACF;;;ACpCe,SAAR,QAAyB,OAAsC;AACpE,QAAM,MAAM,WAAW,OAAO,KAAK;AACnC,QAAM,QAAQ,aAAa,KAAK;AAEhC,QAAM,MAAW,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,EACtC,IAAI,OAAK,IAAI,KAAK,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EACnD,KAAK,EAAE,CAAC;AAEX,SAAO,UAAU,UAAa,QAAQ,IAAI,cAAc,KAAK,KAAK,IAAI;AACxE;;;ACPe,SAAR,QAAyB,OAAsC;AACpE,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,QAAM,QAAQ,aAAa,KAAK;AAEhC,QAAM,MAAM,QAAQ,QAAQ,KAAK,CAAC;AAElC,SAAO,UAAU,UAAa,QAAQ,IAAI,cAAc,KAAK,KAAK,IAAI;AACxE;;;ACPe,SAAR,UAA2B,OAAiC,WAAyB;AAC1F,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,QAAM,QAAQ,aAAa,KAAK;AAEhC,SAAO,SAAS,UAAU,QAAQ,KAAK,GAAG,SAAS,GAAG,KAAK;AAC7D;;;ACLe,SAAR,UAA2B,OAAiC,WAAyB;AAC1F,QAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,QAAM,QAAQ,aAAa,KAAK;AAEhC,SAAO,SAAS,UAAU,QAAQ,KAAK,GAAG,SAAS,GAAG,KAAK;AAC7D;;;ACbA,IAAM,EAAE,IAAI,IAAI;AAEhB,SAAS,SAAS,OAAe;AAC/B,QAAM,iBAAiB,IAAI,KAAK;AAChC,QAAMC,QAAO,QAAQ,IAAI,KAAK;AAE9B,MAAI,iBAAiB,UAAW;AAC9B,WAAOA,SAAQ,mBAAmB,IAAI,OAAO,QAAQ;AAAA,EACvD;AAEA,SAAO,QAAQ;AACjB;AASe,SAAR,UAA2B,OAAiC,YAAY,GAAQ;AACrF,QAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,WAAW,OAAO,OAAO;AACtD,QAAM,QAAQ,aAAa,KAAK;AAEhC,QAAM,KAAK,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,MAAM;AAC7D,QAAM,KAAK,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,MAAM;AAC7D,QAAM,KAAK,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,MAAM;AAE7D,QAAM,IAAI,MAAM,SAAS,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,CAAC;AACxF,QAAM,IAAI,MAAM,SAAS,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,CAAC;AACxF,QAAM,IAAI,MAAM,SAAS,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,CAAC;AAExF,SAAO;AAAA,IACL;AAAA,MACE,GAAG,MAAM,MAAM,GAAG,SAAS,GAAG,GAAG,GAAG;AAAA,MACpC,GAAG,MAAM,MAAM,GAAG,SAAS,GAAG,GAAG,GAAG;AAAA,MACpC,GAAG,MAAM,MAAM,GAAG,SAAS,GAAG,GAAG,GAAG;AAAA,IACtC;AAAA,IACA;AAAA,EACF;AACF;;;AChCe,SAAR,UAA2B,OAAsC;AACtE,QAAM,QAAQ,WAAW,OAAO,OAAO;AACvC,QAAM,QAAQ,aAAa,KAAK;AAEhC,QAAM,MAAM,QAAQ,UAAU,KAAK,CAAC;AAEpC,SAAO,UAAU,UAAa,QAAQ,IAAI,cAAc,KAAK,KAAK,IAAI;AACxE;;;ACRe,SAAR,UAA2B,OAAsC;AACtE,QAAM,QAAQ,WAAW,OAAO,OAAO;AACvC,QAAM,QAAQ,aAAa,KAAK;AAEhC,SAAO,SAAS,QAAQ,UAAU,KAAK,CAAC,GAAG,KAAK;AAClD;;;ACXA,IAAM,EAAE,KAAK,IAAI,IAAI;AASN,SAAR,YAA6B,OAAiC,WAAyB;AAQ5F,MAAI,EAAE,GAAG,GAAG,EAAE,IAAI,WAAW,OAAO,OAAO;AAC3C,QAAM,QAAQ,aAAa,KAAK;AAGhC,MAAI,OAAO,MAAM,CAAC,KAAK,IAAI,GAAG;AAC5B,QAAI;AAAA,EACN;AAEA,SAAO;AAAA,IACL,eAAe,EAAE,GAAG,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,GAAG,IAAI,IAAI,IAAI,OAAO,EAAE,GAAG,SAAS;AAAA,IACjF;AAAA,EACF;AACF;;;ACtBe,SAAR,UAA2B,OAAiC,YAAY,GAAQ;AACrF,QAAM,QAAQ,WAAW,OAAO,OAAO;AACvC,QAAM,QAAQ,aAAa,KAAK;AAEhC,SAAO,SAAS,UAAU,YAAY,KAAK,GAAG,SAAS,GAAG,KAAK;AACjE;;;ACLe,SAAR,UAA2B,OAAsC;AACtE,QAAM,QAAQ,WAAW,OAAO,OAAO;AACvC,QAAM,QAAQ,aAAa,KAAK;AAEhC,QAAM,MAAM,QAAQ,UAAU,KAAK,CAAC;AAEpC,SAAO,UAAU,UAAa,QAAQ,IAAI,cAAc,KAAK,KAAK,IAAI;AACxE;;;ACRe,SAAR,UAA2B,OAAsC;AACtE,QAAM,QAAQ,WAAW,OAAO,OAAO;AACvC,QAAM,QAAQ,aAAa,KAAK;AAEhC,SAAO,SAAS,QAAQ,UAAU,KAAK,CAAC,GAAG,KAAK;AAClD;;;ACRA,IAAM,QAAQ;AACd,IAAM,MAAM;AAEZ,IAAM,QAAQ;AAEd,IAAM,aAAa,IAAI;AAAA,EACrB,GAAG,KAAK,cAAc,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK,MAAM,GAAG,GAAG,KAAK;AAAA,EACxE;AACF;AAUA,SAAS,WAAW,OAAuB;AACzC,QAAM,UAAU,WAAW,KAAK;AAChC,MAAI;AAEJ,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,aAAS,UAAU;AAAA,EACrB,WAAW,MAAM,SAAS,KAAK,GAAG;AAChC,aAAS,WAAW,MAAM,KAAK;AAAA,EACjC,WAAW,MAAM,SAAS,MAAM,GAAG;AACjC,aAAS,UAAU;AAAA,EACrB,OAAO;AAEL,aAAS;AAAA,EACX;AAGA,SAAO,KAAK,MAAM,SAAS,GAAM,IAAI;AACvC;AASe,SAAR,kBAAmC,OAAwC;AAChF,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAE/C,MAAI,MAAM,KAAK,GAAG;AAChB,UAAMC,QAAO,WAAW;AACxB,UAAM,EAAE,GAAG,GAAG,EAAE,IAAI,QAAQ,KAAK;AACjC,UAAMC,SAAQ,oBAAoB,KAAK;AAEvC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,CAACD,MAAK,CAAC,CAAC,GAAG;AAAA,MACX,CAACA,MAAK,CAAC,CAAC,GAAG;AAAA,MACX,CAACA,MAAK,CAAC,CAAC,GAAG;AAAA,MACX,OAAOC,SAAQ,IAAIA,SAAQ;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,UAAU,WAAW,KAAK,KAAK;AAErC,YAAU,gBAAgB,OAAO,GAAG,SAAS,UAAU;AAEvD,QAAM,QAAQ,QAAQ,CAAC;AACvB,QAAM,OAAO,WAAW,KAAK;AAC7B,MAAI,QAAQ,QAAQ,CAAC,IAAI,WAAW,QAAQ,CAAC,CAAC,IAAI;AAElD,MAAI,QAAQ,GAAG;AACb,aAAS;AAAA,EACX;AAGA,QAAM,aAAa,CAAC,OAAe,UAA0B;AAE3D,QAAI,UAAU,QAAQ;AACpB,aAAO;AAAA,IACT;AAGA,UAAM,QAAS,UAAU,SAAS,UAAU,KAAO,UAAU,WAAW,UAAU;AAElF,QAAI,OAAO;AACT,aAAO,WAAW,KAAK;AAAA,IACzB;AAEA,UAAM,cAAc,WAAW,KAAK;AACpC,UAAM,YAAY,MAAM,SAAS,GAAG;AAEpC,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAGA,QAAI,UAAU,SAAS;AAErB,UAAI,UAAU,GAAG;AAEf,eAAQ,cAAc,MAAO;AAAA,MAC/B;AAAA,IACF,WAAW,UAAU,SAAS;AAE5B,UAAI,UAAU,KAAK,UAAU,GAAG;AAE9B,eAAQ,cAAc,MAAO;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAAC,WAAW,QAAQ,CAAC,GAAG,CAAC,GAAG,WAAW,QAAQ,CAAC,GAAG,CAAC,GAAG,WAAW,QAAQ,CAAC,GAAG,CAAC,CAAC;AAG/F,MAAI,UAAU,SAAS;AAErB,cAAU,OAAO,CAAC,KAAK,QAAQ,OAAO,CAAC,KAAK,KAAK,SAAS,YAAY;AACtE,cAAU,OAAO,CAAC,KAAK,QAAQ,OAAO,CAAC,KAAK,KAAK,SAAS,YAAY;AAAA,EACxE,WAAW,UAAU,SAAS;AAE5B,cAAU,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,KAAK,SAAS,YAAY;AAAA,EACrE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC;AAAA,IACnB,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC;AAAA,IACnB,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC;AAAA,IACnB,OAAO,QAAQ,IAAI,QAAQ;AAAA,EAC7B;AACF;;;ACjHA,IAAM,kBAA2D;AAAA,EAC/D,OAAkB;AAAA,EAClB,OAAkB;AAAA,EAClB,KAAgB;AAClB;AAEA,IAAM,oBAA+D;AAAA,EACnE,KAAgB;AAAA,EAChB,OAAkB;AAAA,EAClB,KAAgB;AAClB;AAEA,IAAM,oBAA+D;AAAA,EACnE,KAAgB;AAAA,EAChB,OAAkB;AAAA,EAClB,KAAgB;AAClB;AAEA,IAAM,kBAA2D;AAAA,EAC/D,KAAgB;AAAA,EAChB,OAAkB;AAAA,EAClB,OAAkB;AACpB;AAEA,IAAM,kBAAkD;AAAA,EACtD,KAAgB;AAAA,EAChB,OAAkB;AAAA,EAClB,OAAkB;AAAA,EAClB,KAAgB;AAClB;AAGA,IAAM,oBAGF;AAAA,EACF,KAAgB;AAAA,EAChB,OAAkB;AAAA,EAClB,OAAkB;AAAA,EAClB,KAAgB;AAClB;AAGA,IAAM,kBAGF;AAAA,EACF,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AACP;AAEA,SAAS,eAAe,OAAe,QAAgD;AACrF,QAAM,EAAE,OAAO,OAAO,GAAG,MAAM,IAAI,kBAAkB,KAAK;AAG1D,MAAI,CAAC,SAAS,OAAO,EAAE,SAAS,KAAK,KAAK,MAAM,IAAI,GAAG;AACrD,UAAM,IAAI,MAAM,MAAM,IAAI,KAAK,SAAS;AAAA,EAC1C;AAEA,QAAM,aAAa,OAAO,OAAO,KAAK;AAEtC,MAAI,WAAW,OAAO;AACpB,UAAM,cAAc,QAAQ,kBAAkB,KAAK,IAAI;AAEvD,WAAO,GAAG,gBAAgB,KAAK,EAAE,UAAU,CAAC,GAAG,WAAW;AAAA,EAC5D;AAEA,QAAM,YAAY,gBAAgB,MAAM,IAAI,KAAK;AAGjD,SAAO;AAAA,IACL,YAAY,UAAU,UAAU,IAAK;AAAA,IACrC;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAAY,QAAgD;AAClF,QAAM,QAAQ,oBAAoB,KAAK;AAEvC,MAAI,WAAW,OAAO;AACpB,WAAO,GAAG,mBAAmB,KAAK,CAAC,GAAG,UAAU,IAAI,kBAAkB,KAAK,IAAI,EAAE;AAAA,EACnF;AAEA,SAAO,SAAS,kBAAkB,MAAM,EAAE,KAAK,GAAG,KAAK;AACzD;AASe,SAAR,SAA+C,OAAe,QAA4B;AAC/F,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAE/C,QAAM,QAAQ,aAAa,KAAK,IAAI,UAAU,MAAM,YAAY,CAAa,IAAI;AACjF,QAAM,SAAS,WAAW,MAAM,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE;AAE1E,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO,eAAe,OAAO,MAAM;AAAA,EACrC;AAEA,SAAO,eAAe,OAAO,MAAM;AACrC;;;AC5HO,IAAM,eAAe;AAG5B,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,QAAQ;AACd,IAAM,SAAS;AAGf,IAAM,OAAO;AACb,IAAM,OAAO;AACb,IAAM,OAAO;AAGb,IAAM,eAAe;AACrB,IAAM,WAAW;AAGjB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,SAAS;AACf,IAAM,YAAY;AAMlB,SAAS,UAAU,GAAmB;AACpC,SAAO,IAAI,eAAe,IAAI,KAAK,eAAe,MAAM;AAC1D;AAMA,SAAS,QAAQ,GAAW,GAAW,GAAmB;AACxD,SAAO,QAAQ,IAAI,QAAQ,UAAU,QAAQ,IAAI,QAAQ,UAAU,QAAQ,IAAI,QAAQ;AACzF;AAae,SAAR,aAA8B,YAAoB,YAA4B;AACnF,YAAU,SAAS,UAAU,GAAG,SAAS,WAAW;AACpD,YAAU,SAAS,UAAU,GAAG,SAAS,WAAW;AAEpD,QAAM,KAAK,QAAQ,SAAS,YAAY,KAAK,CAAC;AAC9C,QAAM,KAAK,QAAQ,SAAS,YAAY,KAAK,CAAC;AAE9C,QAAM,OAAO,UAAU,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AAChD,QAAM,MAAM,UAAU,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AAG/C,MAAI,KAAK,IAAI,MAAM,IAAI,IAAI,WAAW;AACpC,WAAO;AAAA,EACT;AAKA,QAAM,OACJ,MAAM,QACD,OAAO,SAAS,QAAQ,WAAW,YACnC,OAAO,QAAQ,QAAQ,UAAU;AAGxC,MAAI,KAAK,IAAI,IAAI,IAAI,QAAQ;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,OAAO,KAAK,OAAO,eAAe,OAAO,OAAO,eAAe;AAE1E,SAAO,MAAM,IAAI,CAAC;AACpB;;;AC/Ee,SAAR,qBACL,MACA,OACA,YAAY,WACJ;AACR,YAAU,SAAS,IAAI,GAAG,SAAS,IAAI;AACvC,YAAU,SAAS,KAAK,GAAG,SAAS,KAAK;AAEzC,QAAM,UAAU,SAAS,MAAM,KAAK;AACpC,QAAM,WAAW,SAAS,OAAO,KAAK;AAEtC,QAAM,kBAAkB,QAAQ,IAAI,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI,OAAO;AAC/E,QAAM,mBAAmB,SAAS,IAAI,MAAM,SAAS,IAAI,MAAM,SAAS,IAAI,OAAO;AAEnF,SAAO,MAAM,KAAK,IAAI,kBAAkB,cAAc,GAAG,SAAS;AACpE;;;ACjBe,SAAR,OAAwB,OAAuB;AACpD,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAE/C,QAAM,EAAE,GAAG,GAAG,EAAE,IAAI,SAAS,OAAO,KAAK;AAEzC,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;AAC5B,QAAM,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC;AAE5B,SAAO,OAAO,MAAM,OAAO,KAAK,CAAC;AACnC;;;ACTe,SAAR,gBAAiC,MAAc,OAAuB;AAC3E,YAAU,SAAS,IAAI,GAAG,SAAS,IAAI;AACvC,YAAU,SAAS,KAAK,GAAG,SAAS,KAAK;AAEzC,QAAM,UAAU,SAAS,MAAM,KAAK;AACpC,QAAM,WAAW,SAAS,OAAO,KAAK;AAEtC,SACE,KAAK,IAAI,QAAQ,GAAG,SAAS,CAAC,IAC9B,KAAK,IAAI,QAAQ,GAAG,SAAS,CAAC,KAC7B,KAAK,IAAI,QAAQ,GAAG,SAAS,CAAC,IAAI,KAAK,IAAI,QAAQ,GAAG,SAAS,CAAC,MAChE,KAAK,IAAI,QAAQ,GAAG,SAAS,CAAC,IAAI,KAAK,IAAI,QAAQ,GAAG,SAAS,CAAC;AAErE;;;ACbe,SAAR,UAA2B,OAAuB;AACvD,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAE/C,QAAM,EAAE,GAAG,GAAG,EAAE,IAAI,SAAS,OAAO,KAAK;AAEzC,QAAM,MAAM,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AAEtC,WAAS,QAAQ,GAAG,QAAQ,IAAI,QAAQ,SAAS;AAC/C,QAAI,IAAI,KAAK,KAAK,SAAS;AACzB,UAAI,KAAK,KAAK;AAAA,IAChB,OAAO;AACL,UAAI,KAAK,MAAM,IAAI,KAAK,IAAI,SAAS,UAAU;AAAA,IACjD;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,GAAG,CAAC;AACrE;;;ACfe,SAAR,SAA0B,MAAc,OAAuB;AACpE,YAAU,SAAS,IAAI,GAAG,SAAS,IAAI;AACvC,YAAU,SAAS,KAAK,GAAG,SAAS,KAAK;AAEzC,QAAM,gBAAgB,UAAa,IAAI;AACvC,QAAM,iBAAiB,UAAa,KAAK;AAEzC,SAAO;AAAA,IACL,iBAAiB,kBACZ,gBAAgB,SAAS,iBAAiB,SAC1C,iBAAiB,SAAS,gBAAgB;AAAA,EACjD;AACF;;;ACTe,SAAR,QAAyB,MAAc,OAAyB;AACrE,YAAU,SAAS,IAAI,GAAG,SAAS,IAAI;AACvC,YAAU,SAAS,KAAK,GAAG,SAAS,KAAK;AAEzC,QAAM,iBAAiB;AACvB,QAAM,sBAAsB;AAE5B,QAAMC,mBAAkB,gBAAmB,MAAM,KAAK;AACtD,QAAMC,YAAW,SAAY,MAAM,KAAK;AACxC,QAAMC,wBAAuB,qBAAwB,MAAM,KAAK;AAEhE,QAAM,WAAWA,yBAAwB;AACzC,QAAM,sBAAsBF,oBAAmB;AAE/C,MAAI,YAAY;AAEhB,MAAI,YAAY,qBAAqB;AACnC,gBAAY;AAAA,EACd,WAAW,YAAY,qBAAqB;AAC1C,gBAAY;AAAA,EACd;AAEA,SAAO;AAAA,IACL,sBAAAE;AAAA,IACA,iBAAAF;AAAA,IACA;AAAA,IACA,UAAAC;AAAA,IACA,SAASA,aAAY;AAAA,IACrB,UAAUA,aAAY;AAAA,IACtB,UAAUA,aAAY;AAAA,IACtB,WAAWA,aAAY;AAAA,EACzB;AACF;;;ACNA,SAAS,cAA6C,OAAqB;AACzE,MAAI,MAAM,KAAK,KAAK,aAAa,KAAK,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,SAAS,OAAO;AAClC;AAEA,SAAS,cACP,OACA,QACsB;AACtB,QAAM,QAAQ,aAAa,KAAK,IAAI,UAAU,MAAM,YAAY,CAAa,IAAI;AACjF,QAAM,OAAO,cAAc,KAAK;AAEhC,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,GAAG,IAAI,IAAI,MAAM;AACtC,QAAM,YAAa,mBAA+C,YAAY;AAE9E,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,2BAA2B,IAAI,OAAO,MAAM,EAAE;AAAA,EAChE;AAEA,SAAO,UAAU,KAAK;AACxB;AASe,SAAR,UACL,OACA,UAA4B,CAAC,GACrB;AACR,YAAU,MAAM,KAAK,KAAK,kBAAkB,KAAK,GAAG,SAAS,OAAO;AAEpE,QAAM,EAAE,OAAO,SAAS,OAAO,YAAY,WAAW,WAAW,gBAAgB,IAAI,IAAI;AAEzF,QAAME,WAAU,SAAS,UAAU,IAAI,GAAG,MAAM,QAAQ,GAAG,CAAC,MAAM;AAClE,MAAI,SAAS,CAAC;AACd,MAAI,YAAY;AAEhB,UAAQ,QAAQ;AAAA,IACd,KAAK,OAAO;AACV,YAAM,EAAE,GAAG,GAAG,EAAE,IAAI,cAAc,OAAO,KAAK;AAE9C,eAAS,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG;AAC7B;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,kBAAY;AACZ,YAAM,EAAE,GAAG,GAAG,EAAE,IAAI,eAAe,cAAc,OAAO,OAAO,GAAG,SAAS;AAE3E,eAAS,CAAC,GAAG,MAAM,IAAI,KAAK,SAAS,CAAC,KAAK,GAAG,CAAC;AAC/C;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,kBAAY;AACZ,YAAM,EAAE,GAAG,GAAG,EAAE,IAAI,eAAe,cAAc,OAAO,OAAO,GAAG,SAAS;AAE3E,eAAS,CAAC,GAAG,MAAM,IAAI,KAAK,SAAS,CAAC,KAAK,GAAG,CAAC;AAC/C;AAAA,IACF;AAAA,IACA,KAAK,OAAO;AACV,YAAM,EAAE,GAAG,GAAG,EAAE,IAAI,cAAc,OAAO,KAAK;AAE9C,eAAS,CAAC,GAAG,GAAG,CAAC;AACjB;AAAA,IACF;AAAA,IACA,SAAS;AACP,YAAM,MAAM,mBAAmB,cAAc,OAAO,KAAK,CAAC;AAE1D,UAAI,SAAS,UAAU,GAAG;AACxB,eAAO,GAAG,GAAG,GAAG,kBAAkB,KAAK,CAAC;AAAA,MAC1C;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,GAAG,MAAM,IAAI,OAAO,KAAK,SAAS,CAAC,GAAGA,WAAU,MAAMA,QAAO,KAAK,EAAE;AAC7E;;;AC/He,SAAR,QACL,KACA,UACA,QACA;AAMA,SAAO,CAAC,OAAe,WAAmB;AACxC,cAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAC/C,cAAU,gBAAgB,QAAQ,GAAG,GAAG,GAAG,SAAS,MAAM;AAE1D,UAAM,QAAQ,SAAS,OAAO,KAAK;AACnC,UAAM,SAAS,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE;AAEtF,WAAO;AAAA,MACL;AAAA,QACE,GAAG;AAAA,QACH,CAAC,GAAG,GAAG,MAAM,MAAM,GAAG,KAAK,aAAa,MAAM,SAAS,CAAC,SAAS,GAAG,GAAG;AAAA,MACzE;AAAA,MACA,EAAE,QAAQ,UAAU,OAAO;AAAA,IAC7B;AAAA,EACF;AACF;;;AC/Be,SAAR,OAAwB,OAAe,QAAgB,QAA4B;AACxF,SAAO,QAAQ,KAAK,KAAK,MAAM,EAAE,OAAO,MAAM;AAChD;;;ACFe,SAAR,WAA4B,OAAe,QAAgB,QAA4B;AAC5F,SAAO,QAAQ,KAAK,KAAK,MAAM,EAAE,OAAO,MAAM;AAChD;;;ACGe,SAAR,UAA2B,OAAe,QAA4B;AAC3E,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAE/C,QAAM,SAAS,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE;AACtF,QAAM,MAAM,SAAS,OAAO,OAAO;AAEnC,SAAO,UAAU,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,QAAQ,UAAU,QAAQ,OAAO,IAAI,MAAM,CAAC;AACnF;;;ACNe,SAAR,OAAwB,OAAe,SAAiB,QAA4B;AACzF,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAC/C,YAAU,gBAAgB,SAAS,MAAM,GAAG,GAAG,SAAS,YAAY;AAEpE,QAAM,QAAQ,SAAS,OAAO,KAAK;AAEnC,QAAM,SAAS,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE;AAEtF,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,GAAG,iBAAiB,MAAM,GAAG,OAAO;AAAA,IACtC;AAAA,IACA,EAAE,QAAQ,UAAU,OAAO;AAAA,EAC7B;AACF;;;ACjBe,SAAR,OAAwB,OAAuB;AACpD,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAC/C,QAAM,SAAS,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE;AACtF,QAAM,MAAM,SAAS,OAAO,KAAK;AAEjC,SAAO,UAAU,OAAO,KAAK,GAAG,GAAU,EAAE,OAAO,CAAC;AACtD;;;ACVe,SAAR,QAAyB,OAAe,QAAgB,QAA4B;AACzF,SAAO,QAAQ,KAAK,KAAK,MAAM,EAAE,OAAO,MAAM;AAChD;;;ACDA,SAAS,eAAe,IAAY,IAAY,IAAY,IAAY,OAAuB;AAE7F,MAAI,KAAK,MAAQ;AACf,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,MAAQ;AACf,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,KAAK;AAGhB,MAAI,OAAO,KAAK;AACd,YAAQ;AAAA,EACV,WAAW,OAAO,MAAM;AACtB,YAAQ;AAAA,EACV;AAEA,MAAI,SAAS,KAAK,OAAO;AAGzB,MAAI,SAAS,GAAG;AACd,cAAU;AAAA,EACZ,WAAW,UAAU,KAAK;AACxB,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAYe,SAAR,IACL,QACA,QACA,QAAgB,KAChB,QACQ;AACR,YAAU,SAAS,MAAM,GAAG,SAAS,WAAW;AAChD,YAAU,SAAS,MAAM,GAAG,SAAS,WAAW;AAChD,YAAU,gBAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,UAAU;AAE3D,QAAM,SAAS,MAAM,MAAM,KAAK,aAAa,MAAM,IAAI,QAAQ,kBAAkB,MAAM,EAAE;AAEzF,QAAM,OAAO,SAAS,QAAQ,OAAO;AACrC,QAAM,OAAO,SAAS,QAAQ,OAAO;AAGrC,QAAM,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK;AACvC,QAAM,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK;AAGvC,QAAM,IAAI,eAAe,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK;AAG9D,QAAM,SAAS,KAAK,SAAS;AAC7B,QAAM,SAAS,KAAK,SAAS;AAC7B,QAAM,QAAQ,UAAU,SAAS,UAAU;AAE3C,SAAO,UAAU,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,QAAQ,UAAU,QAAQ,OAAO,QAAQ,IAAI,QAAQ,OAAU,CAAC;AAClG;;;AClEe,SAAR,WAA4B,OAA+C;AAChF,YAAU,CAAC,CAAC,OAAO,SAAS,KAAK;AAEjC,QAAM,SAA0B,CAAC;AAEjC,MAAI,SAAS,KAAK,GAAG;AACnB,UAAM,EAAE,QAAQ,EAAE,IAAI,kBAAkB,KAAK;AAC7C,UAAM,OAAO,MAAM,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE;AAE7D,WAAO,MAAM,cAAc,SAAS,OAAO,KAAK,GAAG,KAAK;AACxD,WAAO,MAAM,SAAS,SAAS,OAAO,KAAK,GAAG,KAAK;AACnD,WAAO,QAAQ,SAAS,SAAS,OAAO,OAAO,GAAG,KAAK;AACvD,WAAO,QAAQ,SAAS,SAAS,OAAO,OAAO,GAAG,KAAK;AACvD,WAAO,MAAM,SAAS,SAAS,OAAO,KAAK,GAAG,KAAK;AAEnD,WAAO,QAAQ;AACf,WAAO,OAAO;AAAA,EAChB,WAAW,cAAc,KAAK,GAAG;AAC/B,UAAM,EAAE,QAAQ,EAAE,IAAI;AAEtB,QAAI,MAAM,KAAK,GAAG;AAChB,aAAO,MAAM;AAAA,QACX,GAAG,MAAM,MAAM,GAAG,OAAO,GAAG;AAAA,QAC5B,GAAG,MAAM,MAAM,GAAG,OAAO,GAAG;AAAA,QAC5B,GAAG,MAAM,MAAM,GAAG,OAAO,GAAG;AAAA,MAC9B;AACA,aAAO,MAAiB,QAAQ,OAAO,GAAG;AAC1C,aAAO,QAAmB,UAAU,OAAO,GAAG;AAC9C,aAAO,QAAmB,UAAU,OAAO,GAAG;AAC9C,aAAO,OAAO;AAAA,IAChB,WAAW,MAAM,KAAK,GAAG;AACvB,aAAO,MAAiB,UAAU,KAAK;AACvC,aAAO,QAAQ;AACf,aAAO,QAAmB,YAAY,KAAK;AAC3C,aAAO,MAAiB,UAAU,KAAK;AACvC,aAAO,OAAO;AAAA,IAChB,WAAW,MAAM,KAAK,GAAG;AACvB,aAAO,MAAiB,UAAU,KAAK;AACvC,aAAO,QAAmB,YAAY,KAAK;AAC3C,aAAO,QAAQ;AACf,aAAO,MAAiB,UAAU,KAAK;AACvC,aAAO,OAAO;AAAA,IAChB,WAAW,MAAM,KAAK,GAAG;AACvB,aAAO,MAAM;AAAA,QACX,GAAG,MAAM,MAAM,GAAG,OAAO,GAAG;AAAA,QAC5B,GAAG,MAAM,MAAM,GAAG,OAAO,GAAG;AAAA,QAC5B,GAAG,MAAM,MAAM,GAAG,OAAO,GAAG;AAAA,MAC9B;AACA,aAAO,MAAiB,QAAQ,OAAO,GAAG;AAC1C,aAAO,QAAmB,UAAU,OAAO,GAAG;AAC9C,aAAO,QAAmB,UAAU,OAAO,GAAG;AAC9C,aAAO,OAAO;AAAA,IAChB,OAAO;AACL,YAAM,IAAI,MAAM,eAAe;AAAA,IACjC;AAEA,WAAO,MAAM,cAAyB,QAAQ,OAAO,GAAG,GAAG,KAAK;AAChE,WAAO,MAAM,SAAS,OAAO,KAAK,KAAK;AACvC,WAAO,QAAQ,SAAS,OAAO,OAAO,KAAK;AAC3C,WAAO,QAAQ,SAAS,OAAO,OAAO,KAAK;AAC3C,WAAO,MAAM,SAAS,OAAO,KAAK,KAAK;AAEvC,WAAO,QAAQ;AAAA,EACjB,OAAO;AACL,UAAM,IAAI,MAAM,SAAS,KAAK;AAAA,EAChC;AAEA,SAAO;AACT;;;ACpEe,SAAR,QAAyB,OAAe,OAAe,QAA4B;AACxF,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAC/C,YAAU,gBAAgB,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAEtD,QAAM,OAAO,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE;AACpF,QAAM,MAAM,SAAS,OAAO,KAAK;AAEjC,SAAO,UAAU,KAAK,EAAE,QAAQ,UAAU,MAAM,MAAM,CAAC;AACzD;;;ACZe,SAAR,QAAyB,OAAuB;AACrD,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAE/C,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO,oBAAoB,KAAK;AAAA,EAClC,WAAW,OAAO,KAAK,SAAS,EAAE,SAAS,KAAK,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,MAAM,IAAI,kBAAkB,KAAK;AAEzC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACqBA,SAAS,eACP,cACA,eACA,WACA,YACQ;AACR,SAAO,gBAAgB,gBAAgB,YAAY;AACrD;AAgBe,SAAR,cACL,iBACA,UAAgC,CAAC,GACzB;AACR,QAAM,EAAE,YAAY,WAAW,aAAa,WAAW,SAAS,OAAO,UAAU,IAAI;AAErF,YAAU,SAAS,eAAe,GAAG,SAAS,WAAW;AAEzD,UAAQ,QAAQ;AAAA,IACd,KAAK,OAAO;AACV,YAAM,eAAe,aAAa;AAElC,gBAAU,gBAAgB,KAAK,gBAAgB,KAAK,SAAS,SAAS;AAEtE,YAAM,EAAE,GAAG,GAAG,EAAE,IAAI,QAAQ,SAAS,iBAAiB,KAAK,CAAC;AAC5D,YAAM,OAAO,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO;AAE5C,aAAO,OAAO,eAAe,YAAY;AAAA,IAC3C;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,gBAAgB,aAAa;AAEnC,gBAAU,iBAAiB,KAAK,iBAAiB,GAAG,SAAS,mBAAmB;AAEhF,YAAM,MAAM,UAAU,eAAe;AAErC,aAAO,OAAO,gBAAgB,YAAY;AAAA,IAC5C;AAAA,IACA,KAAK,YAAY;AACf,YAAM,eAAe,SAAS,WAAW,eAAe;AACxD,YAAM,gBAAgB,SAAS,YAAY,eAAe;AAE1D,aAAO,eAAe,cAAc,eAAe,WAAW,UAAU;AAAA,IAC1E;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,iBAAiB,aAAa;AAEpC,gBAAU,kBAAkB,KAAK,kBAAkB,GAAG,SAAS,mBAAmB;AAElF,YAAM,EAAE,EAAE,IAAI,UAAU,SAAS,iBAAiB,KAAK,CAAC;AAExD,aAAO,KAAK,iBAAiB,YAAY;AAAA,IAC3C;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,eAAe,KAAK,IAAI,aAAa,iBAAiB,SAAS,CAAC;AACtE,YAAM,gBAAgB,KAAK,IAAI,aAAa,iBAAiB,UAAU,CAAC;AAExE,aAAO,eAAe,cAAc,eAAe,WAAW,UAAU;AAAA,IAC1E;AAAA;AAAA,IAEA,SAAS;AACP,YAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,IAC7C;AAAA,EACF;AACF;;;ACnHe,SAAR,SAA0B,OAAe,QAAgB,QAA4B;AAC1F,SAAO,QAAQ,KAAK,KAAK,MAAM,EAAE,OAAO,MAAM;AAChD;;;ACIe,SAAR,eAAgC,OAAe,OAAe,QAA4B;AAC/F,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAC/C,YAAU,gBAAgB,OAAO,IAAI,CAAC,GAAG,SAAS,eAAe;AAEjE,QAAM,QAAQ,SAAS,OAAO,OAAO;AAErC,QAAM,QAAQ,MAAM,MAAM,QAAQ,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAEvD,SAAO,UAAU,OAAO,EAAE,QAAQ,OAAO,MAAM,CAAC;AAClD;;;ACOA,IAAqB,WAArB,MAA8B;AAAA,EAU5B,YAAY,OAAuC,UAA2B,CAAC,GAAG;AARlF;AAAA,wBAAO;AACP,wBAAO;AACP,wBAAO;AACP,wBAAO;AACP,wBAAO;AACP,wBAAO;AACP,wBAAO;AAGL,cAAU,CAAC,CAAC,OAAO,SAAS,aAAa;AAEzC,UAAM,EAAE,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK,KAAK,IAAI,WAAW,KAAK;AAErE,SAAK,MAAM;AACX,SAAK,MAAM;AACX,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,MAAM;AAEX,SAAK,QAAQ;AACb,SAAK,OAAO,QAAQ,UAAU;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAc;AAChB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAgB;AAClB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAc;AAChB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAqB;AACvB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,WAAO,UAAU,KAAK,YAAY;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAiB;AACnB,WAAO,OAAO,KAAK,YAAY;AAAA,EACjC;AAAA,EAEA,IAAI,UAAkB;AACpB,WAAO,QAAQ,KAAK,YAAY;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAwB;AAC1B,WAAO,cAAc,KAAK,YAAY;AAAA,EACxC;AAAA,EAEA,IAAY,eAAuB;AACjC,WAAO,UAAU,KAAK,KAAK,IAAI,GAAG,EAAE,QAAQ,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,qBAAqB,OAAuB;AACjD,WAAO,qBAAqB,KAAK,cAAc,KAAK;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,gBAAgB,OAAuB;AAC5C,WAAO,gBAAgB,KAAK,cAAc,KAAK;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAQ,OAAyB;AACtC,WAAO,QAAQ,KAAK,cAAc,KAAK;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,SAAS,OAAuB;AACrC,WAAO,SAAS,KAAK,cAAc,KAAK;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,OAAO,MAAiB,WAA4B;AACzD,WAAO,UAAU,KAAK,KAAK;AAAA,MACzB,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAQ,QAAwB;AACrC,WAAO,QAAQ,KAAK,cAAc,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAO,QAAwB;AACpC,WAAO,OAAO,KAAK,cAAc,MAAM;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,SAAS,QAAwB;AACtC,WAAO,SAAS,KAAK,cAAc,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WAAW,QAAwB;AACxC,WAAO,WAAW,KAAK,cAAc,MAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,YAAoB;AACzB,WAAO,UAAU,KAAK,YAAY;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,SAAiB;AACtB,WAAO,OAAO,KAAK,YAAY;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,IAAI,OAAe,OAAwB;AAChD,WAAO,IAAI,KAAK,cAAc,OAAO,KAAK;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAQ,QAAgB,KAAa;AAC1C,WAAO,QAAQ,KAAK,cAAc,OAAO,KAAK,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAO,SAAyB;AACrC,WAAO,OAAO,KAAK,cAAc,OAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,eAAe,QAAgB,KAAa;AACjD,WAAO,eAAe,KAAK,cAAc,OAAO,KAAK,IAAI;AAAA,EAC3D;AACF;;;ACtRe,SAAR,QAAyB,OAAe,QAA2B;AACxE,QAAM,QAAQ,SAAS,OAAO,MAAM;AAEpC,SAAO,UAAU,OAAO,EAAE,OAAO,CAAC;AACpC;;;ACJe,SAAR,aAA8B,OAAsC;AACzE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,KAAK,GAAG;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,KAAK,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,EAAE,MAAM,IAAI,kBAAkB,KAAK;AAEzC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACpBe,SAAR,aAA8B,OAAe,MAAgC;AAClF,QAAM,eAAe,aAAa,KAAK;AAEvC,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB;AAC1B;;;ACXe,SAAR,KAAsB,OAAuB;AAClD,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAE/C,QAAM,MAAM,SAAS,OAAO,KAAK;AAEjC,QAAM,CAAC,KAAK,IAAI,OAAO,QAAQ,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,GAAG,KAAK,CAAC;AAEjF,SAAO,SAAS;AAClB;;;ACZA,SAAS,YAAY,OAA4B;AAC/C,QAAM,UAAU;AAEhB,SAAO,MAAM,MAAM,eAAa,aAAa,IAAI,WAAW,aAAa,IAAI,OAAO;AACtF;AAEA,SAAS,eAAe,QAAoB,QAAgC;AAC1E,SAAO;AAAA,IACL,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC;AAAA,IAC7E,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC;AAAA,IAC7E,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC;AAAA,EAC/E;AACF;AAEA,SAAS,gBAAgB,GAAW,GAAW,GAAuB;AACpE,QAAM,OAAO,kBAAkB,GAAG,GAAG,CAAC;AAEtC,SAAO,eAAe,YAAY,IAAI;AACxC;AAEA,SAAS,kBAAkB,GAAW,GAAW,GAAuB;AACtE,QAAM,KAAK,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,MAAM;AAC7D,QAAM,KAAK,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,MAAM;AAC7D,QAAM,KAAK,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,MAAM;AAE7D,SAAO;AAAA,IACL,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI;AAAA,IAC9D,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI;AAAA,IAC9D,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI;AAAA,EAChE;AACF;AASO,SAAS,kBAAkB,OAAqB,YAAY,WAAmB;AACpF,QAAM,EAAE,GAAG,EAAE,IAAI,SAAS,KAAK,IAAI,SAAS,OAAO,OAAO,IAAI;AAE9D,YAAU,gBAAgB,GAAG,GAAG,CAAC,GAAG,SAAS,cAAc;AAC3D,YAAU,gBAAgB,GAAG,GAAG,GAAG,GAAG,SAAS,QAAQ;AAGvD,QAAM,UAAU;AAChB,MAAI,MAAM;AACV,MAAI,OAAO;AAEX,SAAO,OAAO,MAAM,SAAS;AAC3B,UAAM,OAAO,MAAM,QAAQ;AAC3B,UAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,YAAY,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE;AAEvD,UAAM,UAAU,gBAAgB,GAAG,GAAG,CAAC;AAEvC,QAAI,YAAY,OAAO,GAAG;AACxB,YAAM;AAAA,IACR,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,SAAS;AAC7B;AAQO,SAAS,cAAc,OAA6B;AACzD,QAAM,MAAM,SAAS,KAAK,IAAI,SAAS,OAAO,OAAO,IAAI;AAEzD,SAAO,SAAS,IAAI,CAAC,IAAI,kBAAkB,GAAG,CAAC,IAAI,IAAI,CAAC;AAC1D;;;AChCe,SAAR,QAAyB,OAAe,UAA0B,CAAC,GAAa;AACrF,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAC/C,YAAU,cAAc,OAAO,GAAG,SAAS,OAAO;AAElD,QAAM,EAAE,QAAQ,WAAW,YAAY,OAAO,GAAG,KAAK,IAAI;AAE1D,YAAU,QAAQ,GAAG,SAAS,WAAW;AAEzC,QAAM,MAAM,SAAS,OAAO,KAAK;AACjC,QAAM,cAAc,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE;AAE3F,QAAM,SAAmB,CAAC;AAE1B,MAAI,SAAS,iBAAiB;AAC5B,UAAM,OAAO,8BAA8B;AAE3C,aAAS,QAAQ,MAAM,QAAQ,GAAG,SAAS;AACzC,aAAO,KAAK,QAAQ,EAAE,GAAG,KAAK,GAAG,OAAO,MAAM,CAAC,CAAC;AAAA,IAClD;AAAA,EACF,OAAO;AACL,UAAM,OAAO,MAAM;AAEnB,WAAO,KAAK,QAAQ,EAAE,GAAG,KAAK,GAAG,aAAa,IAAI,GAAG,GAAG,cAAc,IAAI,EAAE,CAAC,CAAC;AAE9E,aAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS;AACzC,YAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,KAAK;AAE/C,aAAO,KAAK,QAAQ,EAAE,GAAG,QAAQ,KAAK,GAAG,GAAG,aAAa,IAAI,GAAG,GAAG,cAAc,IAAI,EAAE,CAAC,CAAC;AAAA,IAC3F;AAAA,EACF;AAEA,SAAO,OAAO,IAAI,WAAS,QAAQ,OAAO,UAAU,WAAW,CAAC;AAClE;;;ACrCA,SAAS,cAAc,KAAa,KAAa,QAAyB;AACxE,MAAI,UAAU,MAAM,KAAK;AAEvB,UAAM,QAAQ,SAAS,MAAM;AAC7B,UAAM,QAAQ,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK;AAEpD,WAAO,SAAS,SAAS,QAAQ,SAAS;AAAA,EAC5C;AAEA,SAAO,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,MAAM,EAAE;AACzD;AAQe,SAAR,OAAwB,UAAyB,CAAC,GAAW;AAClE,QAAM,EAAE,SAAS,MAAM,IAAI;AAE3B,QAAM,SAAS,MAAM,QAAQ,UAAU,GAAG,GAAG,GAAG;AAChD,QAAM,SAAS,MAAM,QAAQ,UAAU,KAAK,GAAG,GAAG;AAClD,QAAM,gBAAgB,MAAM,QAAQ,iBAAiB,IAAI,GAAG,GAAG;AAC/D,QAAM,gBAAgB,MAAM,QAAQ,iBAAiB,KAAK,GAAG,GAAG;AAChE,QAAM,eAAe,MAAM,QAAQ,gBAAgB,IAAI,GAAG,GAAG;AAC7D,QAAM,eAAe,MAAM,QAAQ,gBAAgB,IAAI,GAAG,GAAG;AAE7D,QAAM,MAAM;AAAA,IACV,GAAG,cAAc,QAAQ,QAAQ,GAAG;AAAA,IACpC,GAAG;AAAA,MACD,KAAK,IAAI,eAAe,aAAa;AAAA,MACrC,KAAK,IAAI,eAAe,aAAa;AAAA,IACvC;AAAA,IACA,GAAG,cAAc,KAAK,IAAI,cAAc,YAAY,GAAG,KAAK,IAAI,cAAc,YAAY,CAAC;AAAA,EAC7F;AAEA,SAAO,UAAU,KAAK,EAAE,OAAO,CAAC;AAClC;;;ACtDe,SAAR,kBACL,iBACA,UAAoC,CAAC,GAC7B;AACR,QAAM,EAAE,YAAY,WAAW,aAAa,UAAU,IAAI;AAE1D,YAAU,SAAS,eAAe,GAAG,SAAS,WAAW;AAEzD,QAAM,eAAe,KAAK,IAAI,aAAa,iBAAiB,SAAS,CAAC;AACtE,QAAM,gBAAgB,KAAK,IAAI,aAAa,iBAAiB,UAAU,CAAC;AAGxE,SAAO,gBAAgB,gBAAgB,YAAY;AACrD;;;AC+EA,IAAM,cAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX;AAKA,SAAS,gBAAgB,SAAsD;AAC7E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAMC,WAA+B,CAAC;AAGtC,QAAM,eAAuC,CAAC;AAE9C,MAAI,SAAS,UAAa,mBAAmB,QAAW;AACtD,UAAM,YAAY,KAAK,QAAQ,IAAI;AAEnC,iBAAa,IAAI,IAAI;AAGrB,QAAI,YAAY,GAAG;AACjB,YAAM,SAAS,SAAS,UAAU,eAAe;AAEjD,eAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS;AAC9C,cAAM,IAAI,QAAQ;AAElB,qBAAa,KAAK,KAAK,CAAC,IAAI,UAAU,iBAAiB,UAAU,KAAK;AAAA,MACxE;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,SAAS,IAAI;AAEpC,QAAI,YAAY,GAAG;AACjB,YAAM,SAAS,SAAS,UAAU,eAAe;AAEjD,eAAS,QAAQ,YAAY,GAAG,QAAQ,KAAK,QAAQ,SAAS;AAC5D,cAAM,KAAK,QAAQ,aAAa;AAEhC,qBAAa,KAAK,KAAK,CAAC,IACtB,kBAAkB,SAAS,kBAAkB,KAAK;AAAA,MACtD;AAAA,IACF;AAAA,EACF,OAAO;AAEL,aAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;AAChD,YAAM,KAAK,SAAS,KAAK,SAAS,OAAO;AAEzC,mBAAa,KAAK,KAAK,CAAC,IACtB,SAAS,UACL,gBAAgB,eAAe,gBAAgB,IAC/C,gBAAgB,eAAe,gBAAgB;AAAA,IACvD;AAAA,EACF;AAGA,aAAW,OAAO,MAAM;AACtB,UAAM,YAAY,aAAa,GAAG;AAClC,UAAMC,UAAS,cAAc,WAAW,YAAY,WAAW;AAC/D,UAAM,YAAY,kBAAkB,EAAE,GAAG,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC;AAElE,IAAAD,SAAQ,GAAG,IAAI,EAAE,GAAG,WAAW,GAAG,KAAK,IAAIC,SAAQ,SAAS,GAAG,GAAG,IAAI;AAAA,EACxE;AAEA,SAAOD;AACT;AAKA,SAAS,cAAc,WAAmB,YAAoB,aAA6B;AACzF,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,IAAI,aAAa,IAAI;AACvC,QAAM,aAAa,IAAI,eAAe,IAAI;AAE1C,SAAO,aAAa;AACtB;AAae,SAAR,MAAuB,OAAe,UAAwB,CAAC,GAA2B;AAC/F,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAC/C,QAAM;AAAA,IACJ,cAAc;AAAA,IACd;AAAA,IACA,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,eAAe;AAAA,IACf,eAAe;AAAA,IACf,OAAO;AAAA,IACP;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACF,IAAI;AAEJ;AAAA,IACE,eAAe,gBAAgB,gBAAgB,KAAK,gBAAgB;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,QAAQ,gBAAgB,SAAY,MAAM,KAAK,MAAM,WAAW,GAAG,GAAG,EAAE,IAAI;AAClF,QAAM,OAAO,iBAAiB,KAAK;AAGnC,MAAI,OAAO;AAEX,MAAI,SAAS,QAAW;AACtB,QAAI,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,SAAS,IAAI,GAAG;AAC3C,WAAK,SAAS,IAAI,4BAA4B,KAAK,YAAY;AAC/D,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,MAAM,SAAS,OAAO,OAAO;AAGnC,MAAI;AAEJ,MAAI,eAAe,QAAW;AAE5B,UAAM,YAAY,kBAAkB,GAAG;AAEvC,iBAAc,MAAM,YAAY,GAAG,GAAG,IAAI,MAAO;AAAA,EACnD,WAAW,WAAW,YAAY,OAAO,GAAG;AAC1C,iBAAa,IAAI,IAAI,YAAY,OAAO;AAAA,EAC1C,OAAO;AACL,iBAAa,IAAI;AAAA,EACnB;AAEA,QAAM,eAAe,aAAa,KAAK;AACvC,MAAI,cAAyB;AAE7B,MAAI,cAAc;AAChB,kBAAc,iBAAiB,UAAU,QAAQ;AAAA,EACnD;AAGA,QAAMA,WAAU,gBAAgB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,KAAK,IAAI;AAAA,IACT,gBAAgB,SAAS,SAAY,IAAI,IAAI;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQA,QAAO,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,MAC5C;AAAA,MACA,UAAU,OAAO,EAAE,QAAQ,UAAU,YAAY,CAAC;AAAA,IACpD,CAAC;AAAA,EACH;AACF;;;AC5Qe,SAAR,OAAwB,OAAe,eAAkD;AAC9F,YAAU,SAAS,KAAK,GAAG,SAAS,WAAW;AAC/C,QAAM,EAAE,QAAQ,OAAO,gBAAgB,IAAI,SAAS,aAAa,IAC7D,EAAE,MAAM,cAAc,IACrB,iBAAiB,CAAC;AAEvB,QAAM,SAAS,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE;AAEtF,QAAM,SAAmB,CAAC;AAE1B,UAAQ,MAAM;AAAA,IACZ,KAAK,aAAa;AAChB,aAAO,KAAK,OAAO,OAAO,GAAG,GAAG,OAAO,OAAO,OAAO,EAAE,CAAC;AACxD;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,aAAO,KAAK,OAAO,OAAO,OAAO,GAAG,CAAC;AACrC;AAAA,IACF;AAAA,IAEA,KAAK;AAAA,IACL,KAAK,uBAAuB;AAC1B,aAAO,KAAK,OAAO,OAAO,OAAO,GAAG,GAAG,OAAO,OAAO,GAAG,CAAC;AACzD;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,aAAO,KAAK,OAAO,OAAO,OAAO,GAAG,GAAG,OAAO,OAAO,GAAG,CAAC;AACzD;AAAA,IACF;AAAA,IAEA,KAAK;AAAA,IACL,KAAK,aAAa;AAChB,aAAO,KAAK,OAAO,OAAO,OAAO,EAAE,GAAG,OAAO,OAAO,GAAG,GAAG,OAAO,OAAO,GAAG,CAAC;AAC5E;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,aAAO,KAAK,OAAO,OAAO,OAAO,EAAE,GAAG,OAAO,OAAO,GAAG,GAAG,OAAO,OAAO,GAAG,CAAC;AAC5E;AAAA,IACF;AAAA,IACA,SAAS;AACP,YAAM,IAAI,UAAU,cAAc;AAAA,IACpC;AAAA,EACF;AAEA,SAAO,OAAO,IAAI,WAAS,QAAQ,OAAO,UAAU,MAAM,CAAC;AAC7D;","names":["factor","abs","chroma","chroma","sign","keys","alpha","colorDifference","contrast","brightnessDifference","opacity","palette","chroma"]}