UNPKG

@lithiumjs/ngx-material-theming

Version:

Dynamic and customizable Angular Material theming made easy.

1 lines 21.8 kB
{"version":3,"file":"lithiumjs-ngx-material-theming-dynamic.mjs","sources":["../../src/helpers/theme-loader.ts","../../src/helpers/theme-creator.ts","../../src/helpers/theme-generator.ts","../../src/lithiumjs-ngx-material-theming-dynamic.ts"],"sourcesContent":["// @dynamic\nexport class ThemeLoader {\n\n private static readonly THEME_NAME_PARSER = /\\[li-theme=\"([^\\]\\s]+)\"\\]/;\n\n /**\n * @description Loads the given compiled theme in for use.\n * @param compiledThemeData The pre-compiled theme data.\n * @param labelElement [Optional] If `true`, will attach a `data-theme-name` attribute to the `<style>` element set to the theme's name.\n */\n public static loadCompiled(compiledThemeData: string, labelElement?: boolean): HTMLElement {\n const element = document.createElement(\"style\");\n element.type = \"text/css\";\n\n if (labelElement === undefined ? true : labelElement) {\n const nameParse = this.THEME_NAME_PARSER.exec(compiledThemeData);\n if (nameParse && nameParse.length > 1) {\n element.setAttribute(\"data-theme-name\", \"\" + nameParse?.[1]);\n }\n }\n\n element.innerHTML = compiledThemeData;\n\n this.getHeadElement().appendChild(element);\n return element;\n }\n\n /**\n * @description Unloads the given compiled theme from the DOM.\n * @param name The name of the theme to unload.\n */\n public static unloadCompiled(name: string): void {\n const head = this.getHeadElement();\n\n head.querySelectorAll(`style[data-theme-name=${name}]`)\n .forEach(style => head.removeChild(style));\n }\n\n private static getHeadElement(): HTMLElement {\n const heads = document.getElementsByTagName(\"head\");\n if (!heads || heads.length === 0) {\n const head = document.createElement(\"head\");\n document.appendChild(head);\n return head;\n } else {\n return heads[0];\n }\n }\n}\n","import { ThemeLoader } from \"./theme-loader\";\n\nexport type PaletteOffset = keyof ThemeCreator.PaletteBase;\n\n/**\n * @param name The name that will be used to reference the new theme.\n * @param templateData The CSS theme template that will be used to create the final theme data.\n * @param primaryPalette The primary color palette.\n * @param accentPalette The accent color palette.\n * @param warnPalette The warn color palette.\n */\nexport interface TemplateThemeCreationOptions {\n name: string;\n templateData: string;\n primaryPalette: ThemeCreator.Palette;\n accentPalette: ThemeCreator.Palette;\n warnPalette: ThemeCreator.Palette;\n templateOptions?: Partial<ThemeTemplateOptions>;\n}\n\nexport interface ThemeTemplateOptions {\n nameMatcher: string | RegExp;\n primaryHexMatcher: string | RegExp;\n primaryRgbaMatcher: string | RegExp;\n accentHexMatcher: string | RegExp;\n accentRgbaMatcher: string | RegExp;\n warnHexMatcher: string | RegExp;\n warnRgbaMatcher: string | RegExp;\n primaryContrastHexMatcher: string | RegExp;\n primaryContrastRgbaMatcher: string | RegExp;\n accentContrastHexMatcher: string | RegExp;\n accentContrastRgbaMatcher: string | RegExp;\n warnContrastHexMatcher: string | RegExp;\n warnContrastRgbaMatcher: string | RegExp;\n}\n\nexport namespace ThemeTemplateOptions {\n\n export const defaultValues: Readonly<ThemeTemplateOptions> = {\n nameMatcher: /%theme-name%/g,\n primaryHexMatcher: /#a099(\\d{2})/g,\n primaryRgbaMatcher: /rgba\\s?\\(\\s?160\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n accentHexMatcher: /#b099(\\d{2})/g,\n accentRgbaMatcher: /rgba\\s?\\(\\s?176\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n warnHexMatcher: /#c099(\\d{2})/g,\n warnRgbaMatcher: /rgba\\s?\\(\\s?192\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n primaryContrastHexMatcher: /#ac99(\\d{2})/g,\n primaryContrastRgbaMatcher: /rgba\\s?\\(\\s?172\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n accentContrastHexMatcher: /#bc99(\\d{2})/g,\n accentContrastRgbaMatcher: /rgba\\s?\\(\\s?188\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n warnContrastHexMatcher: /#cc99(\\d{2})/g,\n warnContrastRgbaMatcher: /rgba\\s?\\(\\s?204\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g\n };\n}\n\nexport class ThemeCreator {\n /**\n * @description Creates a new theme from the given template theme CSS and theme palettes and loads it for use with the given name.\n * @param options The options to use to create the new theme.\n * @return The compiled theme CSS.\n */\n public static createFromTemplate(options: TemplateThemeCreationOptions): string {\n // Generate the theme data from the given template data:\n let themeData = options.templateData;\n let templateOptions = Object.assign({}, ThemeTemplateOptions.defaultValues, options.templateOptions || {});\n\n themeData = themeData.replace(templateOptions.nameMatcher, options.name);\n\n themeData = this.substituteThemeHex(themeData, templateOptions.primaryHexMatcher, options.primaryPalette);\n themeData = this.substituteThemeHex(themeData, templateOptions.accentHexMatcher, options.accentPalette);\n themeData = this.substituteThemeHex(themeData, templateOptions.warnHexMatcher, options.warnPalette);\n\n themeData = this.substituteThemeRgba(themeData, templateOptions.primaryRgbaMatcher, options.primaryPalette);\n themeData = this.substituteThemeRgba(themeData, templateOptions.accentRgbaMatcher, options.accentPalette);\n themeData = this.substituteThemeRgba(themeData, templateOptions.warnRgbaMatcher, options.warnPalette);\n\n themeData = this.substituteThemeHex(themeData, templateOptions.primaryContrastHexMatcher, options.primaryPalette.contrast);\n themeData = this.substituteThemeHex(themeData, templateOptions.accentContrastHexMatcher, options.accentPalette.contrast);\n themeData = this.substituteThemeHex(themeData, templateOptions.warnContrastHexMatcher, options.warnPalette.contrast);\n\n themeData = this.substituteThemeRgba(themeData, templateOptions.primaryContrastRgbaMatcher, options.primaryPalette.contrast);\n themeData = this.substituteThemeRgba(themeData, templateOptions.accentContrastRgbaMatcher, options.accentPalette.contrast);\n themeData = this.substituteThemeRgba(themeData, templateOptions.warnContrastRgbaMatcher, options.warnPalette.contrast);\n\n const themeElement = ThemeLoader.loadCompiled(themeData);\n\n // Store the color info for external programmatic use\n themeElement.setAttribute(\"data-color-primary\", options.primaryPalette[500]);\n themeElement.setAttribute(\"data-color-accent\", options.accentPalette[500]);\n themeElement.setAttribute(\"data-color-warn\", options.warnPalette[500]);\n\n return themeData;\n }\n\n private static substituteThemeHex(themeData: string, matcher: string | RegExp, palette: ThemeCreator.PaletteBase): string {\n return themeData.replace(matcher, (_match, $1) => palette[this.hexOffset($1)]);\n }\n\n private static substituteThemeRgba(themeData: string, matcher: string | RegExp, palette: ThemeCreator.PaletteBase): string {\n return themeData.replace(matcher, (_match, $1, $2) => {\n return `rgba(${palette[this.rgbaOffset($1)]},${this.rgbaAlpha($2)})`;\n });\n }\n\n /** @description Compute the palette offset from an associated hex color regex match. */\n private static hexOffset(match: string): PaletteOffset {\n match = match.toLowerCase();\n return String(Number.parseInt(`${match}${match.startsWith(\"a\") ? \"00\" : \"0\"}`)) as PaletteOffset;\n }\n\n /** @description Compute the palette offset from an associated rgba color regex match. */\n private static rgbaOffset(match: string): PaletteOffset {\n const decOffset = Number.parseInt(match);\n\n return this.hexOffset(decOffset.toString(16));\n }\n\n /** @description Compute the alpha channel from an associated rgba alpha regex match. */\n private static rgbaAlpha(match: string): number {\n return Number.parseFloat(match);\n }\n}\n\nexport namespace ThemeCreator {\n\n export interface PaletteBase {\n \"50\": string,\n \"100\": string,\n \"200\": string,\n \"300\": string,\n \"400\": string,\n \"500\": string,\n \"600\": string,\n \"700\": string,\n \"800\": string,\n \"900\": string,\n \"A100\": string,\n \"A200\": string,\n \"A400\": string,\n \"A700\": string\n }\n\n export interface Palette extends PaletteBase {\n contrast: PaletteBase;\n }\n}\n","import chroma from \"chroma-js\";\nimport lightThemeTemplate from \"@lithiumjs/ngx-material-theming-templates/standard-light-theme.json\";\nimport darkThemeTemplate from \"@lithiumjs/ngx-material-theming-templates/standard-light-theme.json\";\nimport { PaletteOffset, TemplateThemeCreationOptions, ThemeCreator } from \"./theme-creator\";\n\n/**\n * @param isDark Whether or not the theme should be a dark theme. Defaults to `false`.\n * @see TemplateThemeCreationOptions\n */\nexport interface ThemeCreationOptions extends Omit<\n TemplateThemeCreationOptions,\n \"templateData\" | \"templateOptions\"\n> {\n isDark?: boolean;\n}\n\nexport class ThemeGenerator {\n\n /**\n * @see ThemeCreator.createFromTemplate\n */\n public static createFromTemplate(options: TemplateThemeCreationOptions): string {\n return ThemeCreator.createFromTemplate(options);\n }\n\n /**\n * @description Creates a new theme from the given theme palettes and loads it for use with the given name.\n * @param options The options to use to create the new theme.\n * @return The compiled theme.\n */\n public static create(options: ThemeCreationOptions): string {\n return this.createFromTemplate({\n templateData: this.loadStandardThemeTemplate(!!options.isDark),\n ...options\n });\n }\n\n /**\n * @description Computes a Material color palette for the given `baseColor`.\n * @param baseColor The color that the palette will be based off of.\n * @requires chroma-js\n */\n public static createPalette(baseColor: string): ThemeCreator.Palette {\n const basePalette = {\n \"50\": this.paletteColor(baseColor, \"50\"),\n \"100\": this.paletteColor(baseColor, \"100\"),\n \"200\": this.paletteColor(baseColor, \"200\"),\n \"300\": this.paletteColor(baseColor, \"300\"),\n \"400\": this.paletteColor(baseColor, \"400\"),\n \"500\": this.paletteColor(baseColor, \"500\"),\n \"600\": this.paletteColor(baseColor, \"600\"),\n \"700\": this.paletteColor(baseColor, \"700\"),\n \"800\": this.paletteColor(baseColor, \"800\"),\n \"900\": this.paletteColor(baseColor, \"900\"),\n \"A100\": this.paletteColor(baseColor, \"A100\"),\n \"A200\": this.paletteColor(baseColor, \"A200\"),\n \"A400\": this.paletteColor(baseColor, \"A400\"),\n \"A700\": this.paletteColor(baseColor, \"A700\"),\n };\n\n return Object.assign(basePalette, {\n contrast: {\n \"50\": this.contrastColor(basePalette[\"50\"]),\n \"100\": this.contrastColor(basePalette[\"100\"]),\n \"200\": this.contrastColor(basePalette[\"200\"]),\n \"300\": this.contrastColor(basePalette[\"300\"]),\n \"400\": this.contrastColor(basePalette[\"400\"]),\n \"500\": this.contrastColor(basePalette[\"500\"]),\n \"600\": this.contrastColor(basePalette[\"600\"]),\n \"700\": this.contrastColor(basePalette[\"700\"]),\n \"800\": this.contrastColor(basePalette[\"800\"]),\n \"900\": this.contrastColor(basePalette[\"900\"]),\n \"A100\": this.contrastColor(basePalette[\"A100\"]),\n \"A200\": this.contrastColor(basePalette[\"A200\"]),\n \"A400\": this.contrastColor(basePalette[\"A400\"]),\n \"A700\": this.contrastColor(basePalette[\"A700\"]),\n }\n });\n }\n\n /**\n * @description Computes a color for a Material theme palette using `baseColor` and the given `paletteOffset`.\n * @param baseColor The base color.\n * @param paletteOffset The offset in the palette.\n * @return The new color to be used for the given palette offset.\n * @requires chroma-js\n */\n public static paletteColor(baseColor: string, paletteOffset: PaletteOffset): string {\n const graduation = 0.3;\n const aColor = paletteOffset.startsWith(\"A\");\n const numericOffset = Number.parseInt(aColor ? paletteOffset.slice(1) : paletteOffset);\n const offset = (numericOffset < 500) ? (500 - numericOffset) : (numericOffset - 500);\n const graduatedOffset = 0.2 + (offset * 0.01 * graduation);\n\n // Darken or lighten the base color based on the palette offset number\n if (numericOffset < 500) {\n return chroma(baseColor).brighten(graduatedOffset ** 2).hex();\n } else if (numericOffset > 500) {\n return chroma(baseColor).darken(graduatedOffset ** 2).hex();\n } else {\n return baseColor;\n }\n }\n\n /**\n * @description Computes an appropriate contrast color (either black or white) that contrasts the given `color`.\n * @param color The color to be contrasted.\n * @return The contrast color.\n * @requires chroma-js\n */\n public static contrastColor(color: string): string {\n if (chroma(color).luminance() < 0.45) {\n return \"white\";\n } else {\n return \"black\";\n }\n }\n\n private static loadStandardThemeTemplate(isDark: boolean): string {\n return isDark ? darkThemeTemplate.data : lightThemeTemplate.data;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './dynamic-api';\n"],"names":["lightThemeTemplate"],"mappings":";;;AAAA;MACa,WAAW,CAAA;aAEI,IAAiB,CAAA,iBAAA,GAAG,2BAA2B,CAAC;AAExE;;;;AAIE;AACK,IAAA,OAAO,YAAY,CAAC,iBAAyB,EAAE,YAAsB,EAAA;QACxE,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC/C,QAAA,OAAO,CAAC,IAAI,GAAG,UAAU;AAEzB,QAAA,IAAI,YAAY,KAAK,SAAS,GAAG,IAAI,GAAG,YAAY,EAAE;YAClD,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAChE,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,gBAAA,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,EAAE,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;;;AAIpE,QAAA,OAAO,CAAC,SAAS,GAAG,iBAAiB;QAErC,IAAI,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC;AAC1C,QAAA,OAAO,OAAO;;AAGlB;;;AAGE;IACK,OAAO,cAAc,CAAC,IAAY,EAAA;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;AAElC,QAAA,IAAI,CAAC,gBAAgB,CAAC,CAAyB,sBAAA,EAAA,IAAI,GAAG;AACjD,aAAA,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;;AAG1C,IAAA,OAAO,cAAc,GAAA;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC;QACnD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAC3C,YAAA,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;AAC1B,YAAA,OAAO,IAAI;;aACR;AACH,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC;;;;;ACTrB,IAAW,oBAAoB;AAArC,CAAA,UAAiB,oBAAoB,EAAA;AAEpB,IAAA,oBAAA,CAAA,aAAa,GAAmC;AACzD,QAAA,WAAW,EAAE,eAAe;AAC5B,QAAA,iBAAiB,EAAE,eAAe;AAClC,QAAA,kBAAkB,EAAE,4DAA4D;AAChF,QAAA,gBAAgB,EAAE,eAAe;AACjC,QAAA,iBAAiB,EAAE,4DAA4D;AAC/E,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,eAAe,EAAE,4DAA4D;AAC7E,QAAA,yBAAyB,EAAE,eAAe;AAC1C,QAAA,0BAA0B,EAAE,4DAA4D;AACxF,QAAA,wBAAwB,EAAE,eAAe;AACzC,QAAA,yBAAyB,EAAE,4DAA4D;AACvF,QAAA,sBAAsB,EAAE,eAAe;AACvC,QAAA,uBAAuB,EAAE;KAC5B;AACL,CAAC,EAjBgB,oBAAoB,KAApB,oBAAoB,GAiBpC,EAAA,CAAA,CAAA;MAEY,YAAY,CAAA;AACrB;;;;AAIE;IACM,OAAO,kBAAkB,CAAC,OAAqC,EAAA;;AAEnE,QAAA,IAAI,SAAS,GAAG,OAAO,CAAC,YAAY;AACpC,QAAA,IAAI,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,oBAAoB,CAAC,aAAa,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;AAE1G,QAAA,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC;AAExE,QAAA,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAC,iBAAiB,EAAE,OAAO,CAAC,cAAc,CAAC;AACzG,QAAA,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAC,gBAAgB,EAAE,OAAO,CAAC,aAAa,CAAC;AACvG,QAAA,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC;AAEnG,QAAA,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,CAAC,kBAAkB,EAAE,OAAO,CAAC,cAAc,CAAC;AAC3G,QAAA,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,CAAC,iBAAiB,EAAE,OAAO,CAAC,aAAa,CAAC;AACzG,QAAA,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,WAAW,CAAC;AAErG,QAAA,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAC,yBAAyB,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;AAC1H,QAAA,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAC,wBAAwB,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC;AACxH,QAAA,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAC,sBAAsB,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;AAEpH,QAAA,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,CAAC,0BAA0B,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;AAC5H,QAAA,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,CAAC,yBAAyB,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC1H,QAAA,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,CAAC,uBAAuB,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;QAEtH,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC;;AAGxD,QAAA,YAAY,CAAC,YAAY,CAAC,oBAAoB,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AAC5E,QAAA,YAAY,CAAC,YAAY,CAAC,mBAAmB,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC1E,QAAA,YAAY,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AAEtE,QAAA,OAAO,SAAS;;AAGZ,IAAA,OAAO,kBAAkB,CAAC,SAAiB,EAAE,OAAwB,EAAE,OAAiC,EAAA;QAC5G,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;;AAG1E,IAAA,OAAO,mBAAmB,CAAC,SAAiB,EAAE,OAAwB,EAAE,OAAiC,EAAA;AAC7G,QAAA,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,KAAI;AACjD,YAAA,OAAO,QAAQ,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG;AACxE,SAAC,CAAC;;;IAIE,OAAO,SAAS,CAAC,KAAa,EAAA;AAClC,QAAA,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;QAC3B,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,CAAA,CAAE,CAAC,CAAkB;;;IAI5F,OAAO,UAAU,CAAC,KAAa,EAAA;QACnC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAExC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;;;IAIzC,OAAO,SAAS,CAAC,KAAa,EAAA;AAClC,QAAA,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;;AAEtC;;MCzGY,cAAc,CAAA;AAEvB;;AAEE;IACM,OAAO,kBAAkB,CAAC,OAAqC,EAAA;AACnE,QAAA,OAAO,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC;;AAGnD;;;;AAIE;IACM,OAAO,MAAM,CAAC,OAA6B,EAAA;QAC/C,OAAO,IAAI,CAAC,kBAAkB,CAAC;YAC3B,YAAY,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;AAC9D,YAAA,GAAG;AACN,SAAA,CAAC;;AAGN;;;;AAIG;IACI,OAAO,aAAa,CAAC,SAAiB,EAAA;AACzC,QAAA,MAAM,WAAW,GAAG;YAChB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;YACxC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;YAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;YAC5C,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;YAC5C,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;YAC5C,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;SAChD;AAEA,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;AAC9B,YAAA,QAAQ,EAAE;gBACN,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC3C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAClD;AACJ,SAAA,CAAC;;AAGN;;;;;;AAMG;AACI,IAAA,OAAO,YAAY,CAAC,SAAiB,EAAE,aAA4B,EAAA;QACtE,MAAM,UAAU,GAAG,GAAG;QACtB,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC;QAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QACtF,MAAM,MAAM,GAAG,CAAC,aAAa,GAAG,GAAG,KAAK,GAAG,GAAG,aAAa,KAAK,aAAa,GAAG,GAAG,CAAC;QACpF,MAAM,eAAe,GAAG,GAAG,IAAI,MAAM,GAAG,IAAI,GAAG,UAAU,CAAC;;AAG1D,QAAA,IAAI,aAAa,GAAG,GAAG,EAAE;AACrB,YAAA,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE;;AAC1D,aAAA,IAAI,aAAa,GAAG,GAAG,EAAE;AAC5B,YAAA,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE;;aACxD;AACH,YAAA,OAAO,SAAS;;;AAIxB;;;;;AAKG;IACI,OAAO,aAAa,CAAC,KAAa,EAAA;QACrC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE;AAClC,YAAA,OAAO,OAAO;;aACX;AACH,YAAA,OAAO,OAAO;;;IAId,OAAO,yBAAyB,CAAC,MAAe,EAAA;AACpD,QAAA,OAAO,MAAM,GAAG,iBAAiB,CAAC,IAAI,GAAGA,iBAAkB,CAAC,IAAI;;AAEvE;;ACzHD;;AAEG;;;;"}