@driftime/sanity-plugin-icon 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adapters-Dw6yeA3A.js → adapters-JowAC3d_.js} +2 -2
- package/dist/{adapters-Dw6yeA3A.js.map → adapters-JowAC3d_.js.map} +1 -1
- package/dist/index.js +41 -40
- package/dist/index.js.map +1 -1
- package/dist/library-D07tGkaC.js +2 -0
- package/dist/{types-CmTEhJK6.js → library-DRfdBS-O.js} +15 -52
- package/dist/library-DRfdBS-O.js.map +1 -0
- package/dist/{loader-2g6inuO6.js → loader-Mo7_FEBf.js} +6 -5
- package/dist/loader-Mo7_FEBf.js.map +1 -0
- package/dist/next-loader.d.ts.map +1 -1
- package/dist/next-loader.js +3 -3
- package/dist/next.js +2 -2
- package/dist/{nodes-Bn7fLVZO.js → nodes-DdErxvpg.js} +8 -2
- package/dist/nodes-DdErxvpg.js.map +1 -0
- package/dist/read-worker.js +2 -2
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +3 -3
- package/dist/render.js.map +1 -1
- package/dist/{sets-DH5UbUV_.js → sets-BfqjcdEo.js} +2 -2
- package/dist/{sets-DH5UbUV_.js.map → sets-BfqjcdEo.js.map} +1 -1
- package/dist/{sets-B5arQvrZ.js → sets-FpS3h5A7.js} +4 -4
- package/dist/{sets-B5arQvrZ.js.map → sets-FpS3h5A7.js.map} +1 -1
- package/dist/types-Dl2HGUL5.js +51 -0
- package/dist/types-Dl2HGUL5.js.map +1 -0
- package/dist/vite.js +2 -2
- package/package.json +1 -1
- package/dist/loader-2g6inuO6.js.map +0 -1
- package/dist/nodes-Bn7fLVZO.js.map +0 -1
- package/dist/types-CmTEhJK6.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-CmTEhJK6.js","names":["isDefined","ComponentProps","ReactElement","createElement","IconDrawing","IconElement","iconSvgAttributes","toProps","style","attributes","Record","declarations","split","flatMap","declaration","property","value","name","trim","joined","join","key","startsWith","replace","replaceAll","_match","letter","toUpperCase","Object","fromEntries","renderChild","child","index","element","children","String","map","nested","position","DrawingProps","Omit","drawing","Drawing","props","root","node","iconRegistry","convertCase","isDefined","IconDrawing","getIconSetKey","parseIconSet","LibraryIcon","name","label","tags","drawing","terms","LibraryProblem","title","description","LibraryResult","icons","problem","normalizeTerms","value","toLowerCase","replaceAll","trim","splitMatches","text","query","start","match","pattern","split","map","word","String","raw","join","parts","RegExp","part","index","slice","length","selectIcons","library","names","byName","Map","icon","Set","flatMap","get","formatList","identifiers","identifier","describeMissingLibrary","packageName","family","listed","sitePackage","readLibrary","style","Promise","ready","info","libraries","Object","keys","packagePrefix","styles","installed","resolvedStyle","loader","sets","module","set","default","keywords","node","root","libraryRequests","requestLibrary","key","request","result","SanityIconNames","iconLibraryStyles","iconTypeName","SanityIcon","_type","library","style","name","node","IconLibraryStyles","SanityIconLibrary","SanityIconStyle","Library","SanityIconName","ListedLibraryId","NonNullable","Extract","IconLibraryId"],"sources":["../src/components/drawing.tsx","../src/lib/library.ts","../src/types.ts"],"sourcesContent":["// Consumers render this in server components, where the compiler's memo cache hook can't run.\n\"use no memo\";\n\nimport { isDefined } from \"@repo/lib/utils\";\nimport type { ComponentProps, ReactElement } from \"react\";\nimport { createElement } from \"react\";\n\nimport type { IconDrawing, IconElement } from \"@/lib/nodes\";\nimport { iconSvgAttributes } from \"@/lib/nodes\";\n\n/**\n * Converts stored attributes to React props, turning a `style` attribute into the object React expects.\n *\n * @param attributes - The stored attributes.\n * @returns The props.\n */\nfunction toProps({ style, ...attributes }: Record<string, string>) {\n if (!isDefined(style)) return attributes;\n\n const declarations = style.split(\";\").flatMap((declaration): [string, string][] => {\n const [property = \"\", ...value] = declaration.split(\":\");\n const name = property.trim();\n const joined = value.join(\":\").trim();\n if (!isDefined(name) || !isDefined(joined)) return [];\n\n const key = name.startsWith(\"--\")\n ? name\n : name\n .replace(/^-ms-/u, \"ms-\")\n .replaceAll(/-(?<letter>[a-z])/gu, (_match, letter: string) => letter.toUpperCase());\n\n return [[key, joined]];\n });\n\n return { ...attributes, style: Object.fromEntries(declarations) };\n}\n\n/**\n * Draws one element of a stored drawing, with its children.\n *\n * @param child - The element, or text inside one.\n * @param index - Its position among its siblings.\n * @returns The element.\n */\nfunction renderChild(child: IconElement | string, index: number): ReactElement | string {\n if (typeof child === \"string\") return child;\n\n const [element, attributes, children] = child;\n\n return createElement(\n element,\n { ...toProps(attributes), key: String(index) },\n children?.map((nested, position) => renderChild(nested, position)),\n );\n}\n\nexport type DrawingProps = Omit<ComponentProps<\"svg\">, \"children\"> & { drawing: IconDrawing | undefined };\n\nexport function Drawing({ drawing, ...props }: DrawingProps) {\n if (!isDefined(drawing)) return null;\n\n // Stored roots only hold checked attribute names, but their values are text, not React's literal types.\n const root = toProps(drawing.root) as ComponentProps<\"svg\">;\n\n return (\n <svg {...iconSvgAttributes} {...root} aria-hidden=\"true\" {...props}>\n {drawing.node.map((child, index) => renderChild(child, index))}\n </svg>\n );\n}\n","import { iconRegistry } from \"@driftime/sanity-plugin-icon/sets\";\nimport { convertCase, isDefined } from \"@repo/lib/utils\";\n\nimport type { IconDrawing } from \"@/lib/nodes\";\nimport { getIconSetKey } from \"@/lib/registry\";\nimport { parseIconSet } from \"@/lib/sets\";\n\n/** Icon in the library, with the terms a search matches against. */\nexport interface LibraryIcon {\n /** Name of the icon in its library. */\n name: string;\n /** Readable form of the name. */\n label: string;\n /** Keywords describing the icon, as a comma-separated list. */\n tags: string;\n /** The icon's shapes and the SVG attributes they're drawn inside. */\n drawing: IconDrawing;\n /** Name and keywords, normalised for search. */\n terms: string;\n}\n\n/** Why a library's icons can't be shown, and what to do about it, with code marked by backticks. */\nexport interface LibraryProblem {\n /** What's wrong, in a few words. */\n title: string;\n /** What to do about it. */\n description: string;\n}\n\n/** Outcome of loading a library: its icons, or why they can't be shown. */\nexport type LibraryResult =\n | { icons: LibraryIcon[]; problem?: undefined }\n | { icons?: undefined; problem: LibraryProblem };\n\n/**\n * Normalises text for search, so hyphenated names and multi-word keywords match the same way.\n *\n * @param value - The text.\n * @returns The normalised text.\n */\nexport function normalizeTerms(value: string) {\n return value\n .toLowerCase()\n .replaceAll(/[\\s-]+/gu, \" \")\n .trim();\n}\n\n/**\n * Splits text into the parts a search matches and the parts it doesn't, matching the way search does: ignoring case,\n * and treating spaces and hyphens alike.\n *\n * @param text - The text to split.\n * @param query - The normalised search.\n * @returns The parts in order, each with where it starts in the text and whether it matches.\n */\nexport function splitMatches(text: string, query: string) {\n if (!isDefined(query)) return [{ text, start: 0, match: false }];\n\n const pattern = query\n .split(\" \")\n .map((word) => word.replaceAll(/[$()*+.?[\\\\\\]^{|}]/gu, String.raw`\\$&`))\n .join(String.raw`[\\s-]+`);\n\n const parts = text.split(new RegExp(`(${pattern})`, \"giu\"));\n\n return parts.map((part, index) => ({\n text: part,\n start: parts.slice(0, index).join(\"\").length,\n match: index % 2 === 1,\n }));\n}\n\n/**\n * Narrows the library to the named icons, in the order given. Unknown names are skipped, so a list keeps working\n * across library releases.\n *\n * @param library - Every icon in the library.\n * @param names - The icons to offer, or undefined for all of them.\n * @returns The icons to offer.\n */\nexport function selectIcons(library: LibraryIcon[], names: string[] | undefined) {\n if (!isDefined(names)) return library;\n\n const byName = new Map(library.map((icon) => [icon.name, icon]));\n\n return [...new Set(names)].flatMap((name) => {\n const icon = byName.get(name);\n\n return isDefined(icon) ? [icon] : [];\n });\n}\n\n/**\n * Lists identifiers as inline code, separated by commas.\n *\n * @param identifiers - The identifiers.\n * @returns The list.\n */\nfunction formatList(identifiers: string[]) {\n return identifiers.map((identifier) => `\\`${identifier}\\``).join(\", \");\n}\n\n/**\n * Describes why a library the project hasn't installed can't be shown, and what to add.\n *\n * @param label - Readable name of the library.\n * @param packageName - Package the library is read from, or an example of one for a family of packages.\n * @param family - Whether the library is a family of packages, one per style.\n * @param listed - Whether the project's `package.json` lists the package.\n * @param sitePackage - Another package of the library the project lists, or undefined when there's none.\n * @returns The problem.\n */\nfunction describeMissingLibrary(\n label: string,\n packageName: string,\n family: boolean,\n listed: boolean,\n sitePackage: string | undefined,\n): LibraryProblem {\n if (listed) {\n return {\n title: `${label} isn't installed yet`,\n description: `\\`${packageName}\\` is in \\`package.json\\` but not in \\`node_modules\\`. Reinstall the project's dependencies.`,\n };\n }\n\n if (isDefined(sitePackage)) {\n return {\n title: `${label} needs \\`${packageName}\\``,\n description: `The Studio reads ${label} from \\`${packageName}\\`, not \\`${sitePackage}\\`. Add it as a dev dependency.`,\n };\n }\n\n return {\n title: `${label} isn't installed`,\n description: family\n ? `Install a ${label} style package, such as \\`${packageName}\\`.`\n : `Install \\`${packageName}\\` in the project.`,\n };\n}\n\n/**\n * Loads one library style from the sets the build step converted.\n *\n * @param library - Identifier of the library, or undefined when none is set.\n * @param style - Identifier of the style, or undefined for the library's default.\n * @returns The icons, or why they can't be shown.\n */\nasync function readLibrary(library: string | undefined, style: string | undefined): Promise<LibraryResult> {\n if (!isDefined(library)) {\n return {\n problem: {\n title: \"No icon library set\",\n description: \"Set `library` in the icon plugin's configuration or in the field's options.\",\n },\n };\n }\n\n if (!iconRegistry.ready) {\n return {\n problem: {\n title: \"Icons aren't set up\",\n description: \"Add `withIcons()` to the Studio's build configuration, then restart the Studio.\",\n },\n };\n }\n\n const info = iconRegistry.libraries[library];\n if (!isDefined(info)) {\n return {\n problem: {\n title: \"Unknown icon library\",\n description: `There's no icon library called \\`${library}\\`. Use one of: ${formatList(Object.keys(iconRegistry.libraries))}.`,\n },\n };\n }\n\n const { label, packageName, packagePrefix, styles, listed, installed, sitePackage } = info;\n if (!installed) {\n return { problem: describeMissingLibrary(label, packageName, isDefined(packagePrefix), listed, sitePackage) };\n }\n\n const resolvedStyle = style ?? styles[0] ?? \"\";\n const loader = iconRegistry.sets[getIconSetKey(library, resolvedStyle)];\n if (!isDefined(loader)) {\n return {\n problem: isDefined(packagePrefix)\n ? {\n title: `${label} style \\`${resolvedStyle}\\` isn't installed`,\n description: `Install \\`${packagePrefix}${resolvedStyle}\\` in the project.`,\n }\n : {\n title: `Unknown ${label} style`,\n description: `${label} has no \\`${resolvedStyle}\\` style. Use one of: ${formatList(styles)}.`,\n },\n };\n }\n\n const module = await loader();\n const set = parseIconSet(module.default);\n if (!isDefined(set)) {\n return { problem: { title: `Couldn't load ${label}`, description: \"Restart the Studio and try again.\" } };\n }\n\n return {\n icons: set.icons.map(({ name, keywords, node, root }) => ({\n name,\n label: convertCase(name, \"title\"),\n tags: keywords.join(\", \"),\n drawing: { root: root ?? set.root, node },\n terms: normalizeTerms([name, ...keywords].join(\" \")),\n })),\n };\n}\n\n/** Library requests shared by every field in the session, keyed by library and style, since the data never changes. */\nconst libraryRequests = new Map<string, Promise<LibraryResult>>();\n\n/**\n * Loads a library style, reusing a request already in progress.\n *\n * @param library - Identifier of the library, or undefined when none is set.\n * @param style - Identifier of the style, or undefined for the library's default.\n * @returns The icons, or why they can't be shown.\n */\nexport async function requestLibrary(library: string | undefined, style: string | undefined) {\n const key = getIconSetKey(library ?? \"\", style ?? \"\");\n let request = libraryRequests.get(key);\n\n if (!isDefined(request)) {\n request = readLibrary(library, style);\n libraryRequests.set(key, request);\n }\n\n const result = await request;\n\n return result;\n}\n","import type { SanityIconNames } from \"@driftime/sanity-plugin-icon/names\";\n\nimport type { iconLibraryStyles } from \"@/lib/libraries\";\n\n/** Schema type name of the icon object. */\nexport const iconTypeName = \"icon\";\n\n/**\n * Stored icon: which library it came from, its name, and the shapes it's drawn from.\n *\n * @public\n */\nexport interface SanityIcon {\n _type: typeof iconTypeName;\n /** Identifier of the library the icon came from. */\n library?: string;\n /** Identifier of the library style the icon came from. */\n style?: string;\n /** Name of the icon in its library. */\n name?: string;\n /** Shapes the icon is drawn from, saved when it's chosen. */\n node?: string;\n}\n\n/** Styles of each supported library, from the plugin's own list. */\ntype IconLibraryStyles = typeof iconLibraryStyles;\n\n/**\n * Identifier of a library the plugin supports.\n *\n * @public\n */\nexport type SanityIconLibrary = keyof IconLibraryStyles;\n\n/**\n * Styles a library offers. The project's own icon folders have one style, `default`.\n *\n * @public\n */\nexport type SanityIconStyle<Library extends string> = Library extends SanityIconLibrary\n ? IconLibraryStyles[Library][number]\n : \"default\";\n\n/**\n * Names of a library's icons, once the build step has listed the installed version's, or any name before then.\n *\n * @public\n */\nexport type SanityIconName<Library extends string> = Library extends keyof SanityIconNames\n ? SanityIconNames[Library]\n : string;\n\n/** Libraries the build step has listed, or any identifier before it has, so the project's own folders can be named. */\nexport type ListedLibraryId = [keyof SanityIconNames] extends [never]\n ? string & NonNullable<unknown>\n : Extract<keyof SanityIconNames, string>;\n\n/** Libraries a field can name: the supported ones, plus the project's own folders. */\nexport type IconLibraryId = SanityIconLibrary | ListedLibraryId;\n"],"mappings":";;;;;;;;;;;AAgBA,SAASO,QAAQ,EAAEC,OAAO,GAAGC,cAAsC;CACjE,IAAI,CAACT,UAAUQ,KAAK,GAAG,OAAOC;CAE9B,IAAME,eAAeH,MAAMI,MAAM,GAAG,CAAC,CAACC,SAASC,gBAAoC;EACjF,IAAM,CAACC,WAAW,IAAI,GAAGC,SAASF,YAAYF,MAAM,GAAG,GACjDK,OAAOF,SAASG,KAAK,GACrBC,SAASH,MAAMI,KAAK,GAAG,CAAC,CAACF,KAAK;EASpC,OARI,CAAClB,UAAUiB,IAAI,KAAK,CAACjB,UAAUmB,MAAM,IAAU,CAAA,IAQ5C,CAAC,CANIF,KAAKK,WAAW,IAAI,IAC5BL,OACAA,KACGM,QAAQ,UAAU,KAAK,CAAC,CACxBC,WAAW,wBAAwBC,QAAQC,WAAmBA,OAAOC,YAAY,CAAC,GAE3ER,MAAM,CAAC;CACvB,CAAC;CAED,OAAO;EAAE,GAAGV;EAAYD,OAAOoB,OAAOC,YAAYlB,YAAY;CAAE;AAClE;;;;;;;;AASA,SAASmB,YAAYC,OAA6BC,OAAsC;CACtF,IAAI,OAAOD,SAAU,UAAU,OAAOA;CAEtC,IAAM,CAACE,SAASxB,YAAYyB,YAAYH;CAExC,OAAO5B,cACL8B,SACA;EAAE,GAAG1B,QAAQE,UAAU;EAAGY,KAAKc,OAAOH,KAAK;CAAE,GAC7CE,UAAUE,KAAKC,QAAQC,aAAaR,YAAYO,QAAQC,QAAQ,CAAC,CACnE;AACF;AAIA,SAAgBI,QAAQ,EAAED,SAAS,GAAGE,SAAuB;CAC3D,IAAI,CAAC3C,UAAUyC,OAAO,GAAG,OAAO;CAGhC,IAAMG,OAAOrC,QAAQkC,QAAQG,IAAI;CAEjC,OACE,oBAAC,OAAD;EAAK,GAAItC;EAAmB,GAAIsC;EAAM,eAAY;EAAO,GAAID;EAC1DF,UAAAA,QAAQI,KAAKT,KAAKL,OAAOC,UAAUF,YAAYC,OAAOC,KAAK,CAAC;CAC1D,CAAA;AAET;;;;;;;AC7BA,SAAgBgC,eAAeC,OAAe;CAC5C,OAAOA,MACJC,YAAY,CAAC,CACbC,WAAW,YAAY,GAAG,CAAC,CAC3BC,KAAK;AACV;;;;;;;;;AAUA,SAAgBC,aAAaC,MAAcC,OAAe;CACxD,IAAI,CAACvB,UAAUuB,KAAK,GAAG,OAAO,CAAC;EAAED;EAAME,OAAO;EAAGC,OAAO;CAAM,CAAC;CAE/D,IAAMC,UAAUH,MACbI,MAAM,GAAG,CAAC,CACVC,KAAKC,SAASA,KAAKV,WAAW,wBAAwBW,OAAOC,GAAG,KAAK,CAAC,CAAC,CACvEC,KAAKF,OAAOC,GAAG,QAAQ,GAEpBE,QAAQX,KAAKK,MAAUO,OAAO,IAAIR,QAAO,IAAK,KAAK,CAAC;CAE1D,OAAOO,MAAML,KAAKO,MAAMC,WAAW;EACjCd,MAAMa;EACNX,OAAOS,MAAMI,MAAM,GAAGD,KAAK,CAAC,CAACJ,KAAK,EAAE,CAAC,CAACM;EACtCb,OAAOW,QAAQ,KAAM;CACvB,EAAE;AACJ;;;;;;;;;AAUA,SAAgBG,YAAYC,SAAwBC,OAA6B;CAC/E,IAAI,CAACzC,UAAUyC,KAAK,GAAG,OAAOD;CAE9B,IAAME,SAAS,IAAIC,IAAIH,QAAQZ,KAAKgB,SAAS,CAACA,KAAKvC,MAAMuC,IAAI,CAAC,CAAC;CAE/D,OAAO,CAAC,GAAG,IAAIC,IAAIJ,KAAK,CAAC,CAAC,CAACK,SAASzC,SAAS;EAC3C,IAAMuC,OAAOF,OAAOK,IAAI1C,IAAI;EAE5B,OAAOL,UAAU4C,IAAI,IAAI,CAACA,IAAI,IAAI,CAAA;CACpC,CAAC;AACH;;;;;;;AAQA,SAASI,WAAWC,aAAuB;CACzC,OAAOA,YAAYrB,KAAKsB,eAAe,KAAKA,WAAU,GAAI,CAAC,CAAClB,KAAK,IAAI;AACvE;;;;;;;;;;;AAYA,SAASmB,uBACP7C,OACA8C,aACAC,QACAC,QACAC,aACgB;CAehB,OAdID,SACK;EACL3C,OAAO,GAAGL,MAAK;EACfM,aAAa,KAAKwC,YAAW;CAC/B,IAGEpD,UAAUuD,WAAW,IAChB;EACL5C,OAAO,GAAGL,MAAK,WAAY8C,YAAW;EACtCxC,aAAa,oBAAoBN,MAAK,UAAW8C,YAAW,YAAaG,YAAW;CACtF,IAGK;EACL5C,OAAO,GAAGL,MAAK;EACfM,aAAayC,SACT,aAAa/C,MAAK,4BAA6B8C,YAAW,OAC1D,aAAaA,YAAW;CAC9B;AACF;;;;;;;;AASA,eAAeI,YAAYhB,SAA6BiB,OAAmD;CACzG,IAAI,CAACzD,UAAUwC,OAAO,GACpB,OAAO,EACLzB,SAAS;EACPJ,OAAO;EACPC,aAAa;CACf,EACF;CAGF,IAAI,CAACd,aAAa6D,OAChB,OAAO,EACL5C,SAAS;EACPJ,OAAO;EACPC,aAAa;CACf,EACF;CAGF,IAAMgD,OAAO9D,aAAa+D,UAAUrB;CACpC,IAAI,CAACxC,UAAU4D,IAAI,GACjB,OAAO,EACL7C,SAAS;EACPJ,OAAO;EACPC,aAAa,oCAAoC4B,QAAO,kBAAmBQ,WAAWc,OAAOC,KAAKjE,aAAa+D,SAAS,CAAC,EAAC;CAC5H,EACF;CAGF,IAAM,EAAEvD,OAAO8C,aAAaY,eAAeC,QAAQX,QAAQY,WAAWX,gBAAgBK;CACtF,IAAI,CAACM,WACH,OAAO,EAAEnD,SAASoC,uBAAuB7C,OAAO8C,aAAapD,UAAUgE,aAAa,GAAGV,QAAQC,WAAW,EAAE;CAG9G,IAAMY,gBAAgBV,SAASQ,OAAO,MAAM,IACtCG,SAAStE,aAAauE,KAAKnE,cAAcsC,SAAS2B,aAAa;CACrE,IAAI,CAACnE,UAAUoE,MAAM,GACnB,OAAO,EACLrD,SAASf,UAAUgE,aAAa,IAC5B;EACErD,OAAO,GAAGL,MAAK,WAAY6D,cAAa;EACxCvD,aAAa,aAAaoD,gBAAgBG,cAAa;CACzD,IACA;EACExD,OAAO,WAAWL,MAAK;EACvBM,aAAa,GAAGN,MAAK,YAAa6D,cAAa,wBAAyBnB,WAAWiB,MAAM,EAAC;CAC5F,EACN;CAGF,IAAMK,SAAS,MAAMF,OAAO,GACtBG,MAAMpE,aAAamE,OAAOE,OAAO;CAKvC,OAJKxE,UAAUuE,GAAG,IAIX,EACLzD,OAAOyD,IAAIzD,MAAMc,KAAK,EAAEvB,MAAMoE,UAAUC,MAAMC,YAAY;EACxDtE;EACAC,OAAOP,YAAYM,MAAM,OAAO;EAChCE,MAAMkE,SAASzC,KAAK,IAAI;EACxBxB,SAAS;GAAEmE,MAAMA,QAAQJ,IAAII;GAAMD;EAAK;EACxCjE,OAAOO,eAAe,CAACX,MAAM,GAAGoE,QAAQ,CAAC,CAACzC,KAAK,GAAG,CAAC;CACrD,EAAE,EACJ,IAXS,EAAEjB,SAAS;EAAEJ,OAAO,iBAAiBL;EAASM,aAAa;CAAoC,EAAE;AAY5G;;AAGA,MAAMgE,kCAAkB,IAAIjC,IAAoC;;;;;;;;AAShE,eAAsBkC,eAAerC,SAA6BiB,OAA2B;CAC3F,IAAMqB,MAAM5E,cAAcsC,WAAW,IAAIiB,SAAS,EAAE,GAChDsB,UAAUH,gBAAgB7B,IAAI+B,GAAG;CASrC,OAPK9E,UAAU+E,OAAO,MACpBA,UAAUvB,YAAYhB,SAASiB,KAAK,GACpCmB,gBAAgBL,IAAIO,KAAKC,OAAO,IAK3BC,MAFcD;AAGvB;;ACxOA,MAAaI,eAAe"}
|