@cliff-format/i18n 0.0.0-stage → 0.2.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/engine.ts","../src/builder.ts","../src/errors.ts","../src/types.ts","../src/vocabulary.ts","../src/status.ts","../src/catalog.ts","../src/entry-id.ts","../src/icu/full.ts","../src/icu/detect.ts","../src/create-full.ts","../src/icu/lite.ts"],"sourcesContent":["export { createI18n } from \"./create-full.js\";\nexport { analyzePlain, argumentNames, detectDialect } from \"./icu/detect.js\";\nexport { createFullIcu } from \"./icu/full.js\";\nexport { createLiteIcu } from \"./icu/lite.js\";\nexport * from \"./public.js\";\n","import {\n type CliffDocument,\n CliffValidationError,\n hasErrors,\n type ParseOptions,\n parse,\n parseTolerant,\n type ValidationIssue,\n validateDocument,\n} from \"@cliff-format/core\";\nimport { createT } from \"./builder.js\";\nimport { Catalog, type CatalogOptions } from \"./catalog.js\";\nimport { assertScope, resolveEntryId } from \"./entry-id.js\";\nimport { CliffI18nError, CliffScopeError } from \"./errors.js\";\nimport type { IcuRuntime } from \"./icu/types.js\";\nimport type {\n AddOptions,\n AddResult,\n CliffFile,\n CliffResource,\n EntryIdInput,\n EntryQuery,\n FileOptions,\n I18n,\n I18nDiagnostic,\n I18nOptions,\n I18nRuntime,\n MessageRecord,\n MissingBehavior,\n Params,\n ResolvedEntryId,\n ScopedI18n,\n StatusCounts,\n StatusTag,\n TranslationScope,\n TypeTag,\n WidthPolicy,\n} from \"./types.js\";\n\nfunction isCliffDocument(resource: CliffResource): resource is CliffDocument {\n return typeof resource === \"object\" && resource !== null && !(resource instanceof Uint8Array);\n}\n\nexport class I18nImpl implements I18n<string>, I18nRuntime {\n readonly catalog: Catalog;\n readonly defaultParams: Params;\n readonly missing: MissingBehavior;\n readonly requireEmotion: boolean | readonly TypeTag[];\n readonly enforceMaxWidth: WidthPolicy;\n\n private readonly icu: IcuRuntime;\n private readonly fallbacks: string[];\n private readonly strictEntryIds: boolean;\n private readonly parseOptions: ParseOptions;\n private readonly onDiagnostic: ((diagnostic: I18nDiagnostic) => void) | undefined;\n private readonly maxDiagnostics: number;\n private readonly diagnosticsList: I18nDiagnostic[] = [];\n private readonly listeners = new Set<() => void>();\n private currentLocale: string;\n private sourceLanguageValue: string | undefined;\n private version = 0;\n\n constructor(options: I18nOptions, defaultIcu: IcuRuntime) {\n if (typeof options.locale !== \"string\" || options.locale.trim().length === 0) {\n throw new CliffScopeError(\"locale is required\");\n }\n this.currentLocale = options.locale.trim();\n this.fallbacks =\n typeof options.fallbackLocale === \"string\"\n ? [options.fallbackLocale]\n : [...(options.fallbackLocale ?? [])];\n const catalogOptions: CatalogOptions = {};\n if (options.aliases !== undefined) catalogOptions.aliases = options.aliases;\n if (options.defaultGroup !== undefined) catalogOptions.defaultGroup = options.defaultGroup;\n this.catalog = new Catalog(catalogOptions);\n this.defaultParams = options.params ?? {};\n this.missing = options.missing ?? \"entryId\";\n this.requireEmotion = options.requireEmotion ?? false;\n this.enforceMaxWidth = options.enforceMaxWidth ?? \"warn\";\n this.icu = options.icu ?? defaultIcu;\n this.strictEntryIds = options.strictEntryIds ?? true;\n this.parseOptions = options.parse ?? {};\n this.onDiagnostic = options.onDiagnostic;\n this.maxDiagnostics = options.maxDiagnostics ?? 1000;\n this.sourceLanguageValue = options.sourceLanguage;\n for (const resource of options.resources ?? []) {\n this.add(resource);\n }\n if (this.sourceLanguageValue === undefined && this.catalog.sourceLanguages.length > 0) {\n this.sourceLanguageValue = this.catalog.sourceLanguages[0];\n }\n }\n\n get locale(): string {\n return this.currentLocale;\n }\n\n get language(): string {\n return this.currentLocale;\n }\n\n get sourceLanguage(): string | undefined {\n return this.sourceLanguageValue;\n }\n\n getVersion(): number {\n return this.version;\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify(): void {\n this.version++;\n for (const listener of this.listeners) listener();\n }\n\n setLocale(locale: string): void {\n const next = locale.trim();\n if (next.length === 0) throw new CliffScopeError(\"locale must not be empty\");\n if (next === this.currentLocale) return;\n this.currentLocale = next;\n this.notify();\n }\n\n changeLanguage(locale: string): void {\n this.setLocale(locale);\n }\n\n scope(scope: TranslationScope): ScopedI18n<string> {\n assertScope(scope);\n return { t: createT<string>(this, scope), scope };\n }\n\n add(resource: CliffResource, options: AddOptions = {}): AddResult {\n let document: CliffDocument;\n let issues: ValidationIssue[];\n let corrections: ReturnType<typeof parseTolerant>[\"corrections\"] = [];\n if (isCliffDocument(resource)) {\n document = resource;\n issues = validateDocument(document);\n } else {\n const parseOptions: ParseOptions = {\n ...this.parseOptions,\n ...(options.sourcePath === undefined ? {} : { path: options.sourcePath }),\n };\n if (options.tolerant === true) {\n const result = parseTolerant(resource, parseOptions);\n document = result.document;\n corrections = result.corrections;\n issues = validateDocument(document);\n } else {\n document = parse(resource, parseOptions);\n issues = validateDocument(document);\n }\n }\n\n if (options.validate !== false && hasErrors(issues)) {\n throw new CliffValidationError(issues, corrections);\n }\n\n const added = this.catalog.addDocument(document);\n if (this.sourceLanguageValue === undefined) {\n this.sourceLanguageValue = document.header.sourceLanguage;\n }\n this.notify();\n void added;\n return { documents: [document], issues, corrections };\n }\n\n addDocument(document: CliffDocument, options: AddOptions = {}): AddResult {\n return this.add(document, options);\n }\n\n resolve(entryId: EntryIdInput, scope: TranslationScope): ResolvedEntryId {\n const resolved = resolveEntryId(entryId, scope, this.catalog, this.strictEntryIds);\n if (resolved.ambiguous === true) {\n this.diagnose({\n code: \"ambiguous-entry\",\n severity: \"warning\",\n message: `ambiguous entry \"${typeof entryId === \"string\" ? entryId : entryId.id}\"; chose \"${resolved.canonical}\"`,\n entryId: resolved.canonical,\n locale: this.currentLocale,\n namespace: resolved.namespace,\n clan: resolved.clan,\n group: resolved.group,\n ...(resolved.candidates === undefined\n ? {}\n : { details: { candidates: resolved.candidates } }),\n });\n }\n return resolved;\n }\n\n recordFor(canonical: string, locale: string): MessageRecord | undefined {\n const chain = this.catalog.localeChain(locale, this.fallbacks, this.sourceLanguageValue);\n return this.catalog.selectRecord(canonical, chain, this.sourceLanguageValue);\n }\n\n has(entryId: EntryIdInput, scope: TranslationScope): boolean {\n const resolved = this.resolve(entryId, scope);\n return resolved.exists && this.recordFor(resolved.canonical, this.currentLocale) !== undefined;\n }\n\n entryIds(scope: Partial<TranslationScope> = {}): string[] {\n return this.catalog.entryIds(scope);\n }\n\n query(options: EntryQuery = {}): MessageRecord[] {\n return this.catalog.query(options);\n }\n\n untranslated(options: Omit<EntryQuery, \"status\" | \"target\"> = {}): MessageRecord[] {\n return this.catalog.untranslated(options);\n }\n\n byStatus(status: StatusTag, options: Omit<EntryQuery, \"status\"> = {}): MessageRecord[] {\n return this.catalog.byStatus(status, options);\n }\n\n statusCounts(options: Omit<EntryQuery, \"status\"> = {}): StatusCounts {\n return this.catalog.statusCounts(options);\n }\n\n namespaces(): string[] {\n return this.catalog.namespaces();\n }\n\n clans(namespace?: string): string[] {\n return this.catalog.clans(namespace);\n }\n\n groups(scope: Partial<TranslationScope> = {}): string[] {\n return this.catalog.groups(scope);\n }\n\n locales(): string[] {\n return this.catalog.locales();\n }\n\n files(options: FileOptions = {}): CliffFile[] {\n return this.catalog.files(options);\n }\n\n toCliff(options: FileOptions = {}): string {\n return this.catalog.toCliff(options);\n }\n\n validate(): ValidationIssue[] {\n return this.catalog.validate();\n }\n\n diagnostics(): readonly I18nDiagnostic[] {\n return this.diagnosticsList;\n }\n\n clearDiagnostics(): void {\n this.diagnosticsList.length = 0;\n }\n\n diagnose(diagnostic: I18nDiagnostic): void {\n this.diagnosticsList.push(diagnostic);\n if (this.diagnosticsList.length > this.maxDiagnostics) {\n this.diagnosticsList.splice(0, this.diagnosticsList.length - this.maxDiagnostics);\n }\n if (this.onDiagnostic !== undefined) {\n try {\n this.onDiagnostic(diagnostic);\n } catch {\n // A diagnostic listener must never break rendering.\n }\n }\n }\n\n getLocale(): string {\n return this.currentLocale;\n }\n\n getSourceLanguage(): string {\n if (this.sourceLanguageValue === undefined) {\n throw new CliffI18nError(\n \"CLIFF source-language is not set; pass sourceLanguage or load a CLIFF document\",\n );\n }\n return this.sourceLanguageValue;\n }\n\n getCatalog(): Catalog {\n return this.catalog;\n }\n\n format(\n message: string,\n params: Params = {},\n options: { locale?: string; currency?: string; timeZone?: string } = {},\n ): string {\n const locale = options.locale ?? this.currentLocale;\n const icuOptions: { currency?: string; timeZone?: string } = {};\n if (options.currency !== undefined) icuOptions.currency = options.currency;\n if (options.timeZone !== undefined) icuOptions.timeZone = options.timeZone;\n try {\n const result = this.icu.format(message, locale, params, icuOptions);\n for (const error of result.errors) {\n this.diagnose({\n code: \"icu-error\",\n severity: \"warning\",\n message: `${error.type}: ${error.message}`,\n locale,\n ...(error.source === undefined ? {} : { details: { source: error.source } }),\n });\n }\n return result.text;\n } catch (error) {\n this.diagnose({\n code: \"icu-error\",\n severity: \"error\",\n message: String(error),\n locale,\n });\n return message;\n }\n }\n\n formatToParts(\n message: string,\n params: Params = {},\n options: { locale?: string; currency?: string; timeZone?: string } = {},\n ) {\n const locale = options.locale ?? this.currentLocale;\n const icuOptions: { currency?: string; timeZone?: string } = {};\n if (options.currency !== undefined) icuOptions.currency = options.currency;\n if (options.timeZone !== undefined) icuOptions.timeZone = options.timeZone;\n try {\n const result = this.icu.formatToParts(message, locale, params, icuOptions);\n for (const error of result.errors) {\n this.diagnose({\n code: \"icu-error\",\n severity: \"warning\",\n message: `${error.type}: ${error.message}`,\n locale,\n ...(error.source === undefined ? {} : { details: { source: error.source } }),\n });\n }\n return result.parts;\n } catch (error) {\n this.diagnose({\n code: \"icu-error\",\n severity: \"error\",\n message: String(error),\n locale,\n });\n return [{ type: \"literal\" as const, value: message }];\n }\n }\n}\n\nexport function createI18nEngine<EntryIds extends string = string>(\n options: I18nOptions,\n defaultIcu: IcuRuntime,\n): I18n<EntryIds> {\n return new I18nImpl(options, defaultIcu) as unknown as I18n<EntryIds>;\n}\n","import {\n type CliffEntry,\n CliffValidationError,\n displayWidth,\n hasErrors,\n validateDocument,\n} from \"@cliff-format/core\";\nimport { CliffI18nError, CliffMissingEntryError, CliffMissingMetadataError } from \"./errors.js\";\nimport { reconcileEntryStatus } from \"./status.js\";\nimport type {\n CommitOptions,\n EmotionTag,\n EntryIdInput,\n I18nRuntime,\n MessageBuilder,\n MessageMetadata,\n MessagePart,\n MessageRecord,\n Params,\n ResolvedEntryId,\n StatusTag,\n TFunction,\n TranslationScope,\n TypeTag,\n} from \"./types.js\";\nimport { assertEmotionTag, assertStatusTag, assertTypeTag } from \"./vocabulary.js\";\n\nfunction normalizeEmotion(tags: readonly (EmotionTag | readonly EmotionTag[])[]): EmotionTag[] {\n const out: EmotionTag[] = [];\n for (const tag of tags) {\n if (Array.isArray(tag)) {\n for (const item of tag as readonly EmotionTag[]) out.push(assertEmotionTag(item));\n } else {\n out.push(assertEmotionTag(tag as EmotionTag));\n }\n }\n return out;\n}\n\nfunction sameEmotion(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) return false;\n return left.every((tag, index) => tag === right[index]);\n}\n\nexport class MessageBuilderImpl {\n private sourceText: string | undefined;\n private sourceParams: Params = {};\n private targetText: string | undefined;\n private targetParams: Params = {};\n private extraParams: Params = {};\n private typeTag: TypeTag | undefined;\n private inheritType = false;\n private emotionTags: EmotionTag[] = [];\n private statusTag: StatusTag | undefined;\n private contextText: string | undefined;\n private maxWidthCells: number | undefined;\n private referencePaths: string[] = [];\n private reviewerName: string | undefined;\n private extensionMap: Record<string, string> = {};\n private localeOverride: string | undefined;\n\n constructor(\n private readonly i18n: I18nRuntime,\n private readonly scope: TranslationScope,\n private readonly entryIdInput: EntryIdInput,\n ) {}\n\n source(text: string, params: Params = {}): MessageBuilderImpl {\n if (typeof text !== \"string\") throw new TypeError(\"source text must be a string\");\n this.sourceText = text;\n this.sourceParams = { ...this.sourceParams, ...params };\n return this;\n }\n\n type(tag: TypeTag): MessageBuilderImpl {\n this.typeTag = assertTypeTag(tag);\n this.inheritType = false;\n return this;\n }\n\n typeFromGroup(): MessageBuilderImpl {\n if (this.sourceText === undefined) {\n throw new CliffI18nError(\".typeFromGroup() must be called after .source()\");\n }\n if (this.typeTag !== undefined) {\n throw new CliffI18nError(\".typeFromGroup() cannot be used after .type()\");\n }\n this.inheritType = true;\n return this;\n }\n\n emotion(...tags: readonly (EmotionTag | readonly EmotionTag[])[]): MessageBuilderImpl {\n this.emotionTags = normalizeEmotion(tags);\n return this;\n }\n\n context(text: string): MessageBuilderImpl {\n this.contextText = text;\n return this;\n }\n\n maxWidth(cells: number): MessageBuilderImpl {\n if (!Number.isInteger(cells) || cells <= 0) {\n throw new TypeError(\"max-width must be a positive integer\");\n }\n this.maxWidthCells = cells;\n return this;\n }\n\n reference(...paths: string[]): MessageBuilderImpl {\n this.referencePaths = [...this.referencePaths, ...paths];\n return this;\n }\n\n reviewer(name: string): MessageBuilderImpl {\n this.reviewerName = name;\n return this;\n }\n\n extension(name: string, value: string): MessageBuilderImpl {\n if (!name.startsWith(\"x-\")) {\n throw new TypeError(`extension name \"${name}\" must start with \"x-\"`);\n }\n this.extensionMap[name] = value;\n return this;\n }\n\n target(text: string, params: Params = {}): MessageBuilderImpl {\n this.targetText = text;\n this.targetParams = { ...this.targetParams, ...params };\n return this;\n }\n\n status(tag: StatusTag): MessageBuilderImpl {\n this.statusTag = assertStatusTag(tag);\n return this;\n }\n\n locale(tag: string): MessageBuilderImpl {\n this.localeOverride = tag;\n return this;\n }\n\n params(params: Params): MessageBuilderImpl {\n this.extraParams = { ...this.extraParams, ...params };\n return this;\n }\n\n count(value: number): MessageBuilderImpl {\n this.extraParams = { ...this.extraParams, count: value, n: value };\n return this;\n }\n\n private activeLocale(): string {\n return this.localeOverride ?? this.i18n.getLocale();\n }\n\n private resolved(): ResolvedEntryId {\n return this.i18n.resolve(this.entryIdInput, this.scope);\n }\n\n private recordFor(resolved: ResolvedEntryId): MessageRecord | undefined {\n return this.i18n.recordFor(resolved.canonical, this.activeLocale());\n }\n\n private mergedParams(params?: Params): Params {\n return {\n ...this.i18n.defaultParams,\n ...this.sourceParams,\n ...this.targetParams,\n ...this.extraParams,\n ...params,\n };\n }\n\n private diagnose(\n code: string,\n severity: \"error\" | \"warning\" | \"info\",\n message: string,\n resolved?: ResolvedEntryId,\n ): void {\n this.i18n.diagnose({\n code,\n severity,\n message,\n ...(resolved === undefined ? {} : { entryId: resolved.canonical }),\n locale: this.activeLocale(),\n namespace: this.scope.namespace,\n clan: this.scope.clan,\n ...(this.scope.group === undefined ? {} : { group: this.scope.group }),\n });\n }\n\n private requireEffectiveType(resolved: ResolvedEntryId): string | undefined {\n if (this.typeTag !== undefined) return this.typeTag;\n if (!this.inheritType) return undefined;\n const group = this.i18n\n .getCatalog()\n .findGroup(resolved.namespace, resolved.clan, resolved.group);\n if (group?.type === undefined) {\n throw new CliffMissingMetadataError(\n resolved.canonical,\n [\"type\"],\n `group [${resolved.group}] has no type; add .type(TYPE...) or declare type on the group`,\n );\n }\n return group.type;\n }\n\n private ensureAuthoringMetadata(resolved: ResolvedEntryId): void {\n if (this.sourceText === undefined) return;\n if (this.typeTag !== undefined) return;\n if (this.inheritType) {\n this.requireEffectiveType(resolved);\n return;\n }\n throw new CliffMissingMetadataError(\n resolved.canonical,\n [\"type\"],\n \"add .type(TYPE...) or .typeFromGroup()\",\n );\n }\n\n private groupEmotion(resolved: ResolvedEntryId): string[] {\n const group = this.i18n\n .getCatalog()\n .findGroup(resolved.namespace, resolved.clan, resolved.group);\n return group?.emotion ? [...group.emotion] : [];\n }\n\n private requireEmotionIfConfigured(\n resolved: ResolvedEntryId,\n effectiveType: string | undefined,\n ): void {\n const requirement = this.i18n.requireEmotion;\n if (requirement === false) return;\n if (this.emotionTags.length > 0) return;\n const groupEmotion = this.groupEmotion(resolved);\n if (groupEmotion.length > 0) return;\n if (requirement === true) {\n throw new CliffMissingMetadataError(\n resolved.canonical,\n [\"emotion\"],\n \"requireEmotion is enabled; add .emotion(...) or declare emotion on the group\",\n );\n }\n if (effectiveType !== undefined && requirement.includes(effectiveType as TypeTag)) {\n throw new CliffMissingMetadataError(\n resolved.canonical,\n [\"emotion\"],\n `requireEmotion requires an explicit emotion for type \"${effectiveType}\"`,\n );\n }\n }\n\n private createDraft(resolved: ResolvedEntryId): MessageRecord {\n const sourceLanguage = this.i18n.getSourceLanguage();\n const targetLanguage = this.activeLocale();\n const effectiveType = this.requireEffectiveType(resolved);\n this.requireEmotionIfConfigured(resolved, effectiveType);\n const status: StatusTag =\n this.statusTag ?? (this.targetText === undefined ? \"initial\" : \"translated\");\n if (status !== \"initial\" && this.targetText === undefined) {\n throw new CliffMissingMetadataError(\n resolved.canonical,\n [\"target\"],\n `status \"${status}\" requires a target field`,\n );\n }\n const record = this.i18n.getCatalog().addDraft(\n {\n namespace: resolved.namespace,\n clan: resolved.clan,\n group: resolved.group,\n id: resolved.id,\n sourceLanguage,\n targetLanguage,\n },\n {\n ...(this.sourceText === undefined ? {} : { source: this.sourceText }),\n ...(this.targetText === undefined ? {} : { target: this.targetText }),\n ...(this.typeTag === undefined ? {} : { type: this.typeTag }),\n emotion: this.emotionTags,\n status,\n ...(this.contextText === undefined ? {} : { context: this.contextText }),\n ...(this.maxWidthCells === undefined ? {} : { maxWidth: this.maxWidthCells }),\n ...(this.referencePaths.length === 0 ? {} : { reference: this.referencePaths }),\n ...(this.reviewerName === undefined ? {} : { reviewer: this.reviewerName }),\n ...(Object.keys(this.extensionMap).length === 0 ? {} : { extensions: this.extensionMap }),\n },\n );\n this.diagnose(\"draft-created\", \"info\", `created CLIFF draft \"${resolved.canonical}\"`, resolved);\n return record;\n }\n\n private checkWidth(\n text: string,\n maxWidth: number,\n resolved: ResolvedEntryId,\n locale: string,\n ): void {\n const policy = this.i18n.enforceMaxWidth;\n if (policy === \"off\") return;\n const cells = displayWidth(text);\n if (cells <= maxWidth) return;\n const message = `rendered display width ${cells} cells exceeds max-width ${maxWidth} for \"${resolved.canonical}\" in \"${locale}\"`;\n if (policy === \"error\") {\n this.diagnose(\"width-exceeded\", \"error\", message, resolved);\n throw new CliffI18nError(message);\n }\n this.diagnose(\"width-exceeded\", \"warning\", message, resolved);\n }\n\n private renderRecord(\n record: MessageRecord,\n resolved: ResolvedEntryId,\n params: Params | undefined,\n parts: false,\n ): string;\n private renderRecord(\n record: MessageRecord,\n resolved: ResolvedEntryId,\n params: Params | undefined,\n parts: true,\n ): MessagePart[];\n private renderRecord(\n record: MessageRecord,\n resolved: ResolvedEntryId,\n params: Params | undefined,\n parts: boolean,\n ): string | MessagePart[] {\n const target = this.targetText ?? record.target;\n const template = target ?? record.source;\n const formatLocale = target !== undefined ? record.locale : record.sourceLanguage;\n const values = this.mergedParams(params);\n const maxWidth = this.maxWidthCells ?? record.maxWidth;\n if (parts) {\n const result = this.i18n.formatToParts(template, values, { locale: formatLocale });\n if (maxWidth !== undefined) {\n const text = result\n .filter((part) => part.type !== \"markup\")\n .map((part) => (part.type === \"literal\" ? part.value : part.value))\n .join(\"\");\n this.checkWidth(text, maxWidth, resolved, formatLocale);\n }\n return result;\n }\n const text = this.i18n.format(template, values, { locale: formatLocale });\n if (maxWidth !== undefined) this.checkWidth(text, maxWidth, resolved, formatLocale);\n return text;\n }\n\n private expectationDiagnostics(record: MessageRecord, resolved: ResolvedEntryId): void {\n if (this.sourceText !== undefined && this.sourceText !== record.source) {\n this.diagnose(\n \"source-mismatch\",\n \"warning\",\n `source in CLIFF differs from .source(); CLIFF keeps \"${record.source}\"`,\n resolved,\n );\n }\n if (this.typeTag !== undefined && record.type !== this.typeTag) {\n this.diagnose(\n \"type-mismatch\",\n \"warning\",\n `entry type is \"${record.type ?? \"\"}\", not \"${this.typeTag}\"`,\n resolved,\n );\n }\n if (this.emotionTags.length > 0 && !sameEmotion(this.emotionTags, record.emotion)) {\n this.diagnose(\n \"emotion-mismatch\",\n \"warning\",\n `entry emotion is [${record.emotion.join(\", \")}], not [${this.emotionTags.join(\", \")}]`,\n resolved,\n );\n }\n }\n\n private missing(resolved: ResolvedEntryId): string {\n const message = `missing CLIFF entry \"${resolved.canonical}\" for locale \"${this.activeLocale()}\"`;\n this.diagnose(\"missing-entry\", \"warning\", message, resolved);\n const behavior = this.i18n.missing;\n if (behavior === \"throw\") {\n throw new CliffMissingEntryError(resolved.canonical, this.activeLocale());\n }\n if (behavior === \"empty\") return \"\";\n if (behavior === \"source\") return this.sourceText ?? \"\";\n if (typeof this.entryIdInput === \"string\") return this.entryIdInput;\n return resolved.canonical;\n }\n\n render(params?: Params): string {\n const resolved = this.resolved();\n const record = this.recordFor(resolved);\n if (this.sourceText === undefined) {\n if (record === undefined) return this.missing(resolved);\n this.expectationDiagnostics(record, resolved);\n return this.renderRecord(record, resolved, params, false);\n }\n this.ensureAuthoringMetadata(resolved);\n if (record !== undefined) {\n this.expectationDiagnostics(record, resolved);\n return this.renderRecord(record, resolved, params, false);\n }\n const draft = this.createDraft(resolved);\n return this.renderRecord(draft, resolved, params, false);\n }\n\n renderToParts(params?: Params): MessagePart[] {\n const resolved = this.resolved();\n const record = this.recordFor(resolved);\n if (this.sourceText === undefined) {\n if (record === undefined) {\n const text = this.missing(resolved);\n return [{ type: \"literal\", value: text }];\n }\n this.expectationDiagnostics(record, resolved);\n return this.renderRecord(record, resolved, params, true);\n }\n this.ensureAuthoringMetadata(resolved);\n if (record !== undefined) {\n this.expectationDiagnostics(record, resolved);\n return this.renderRecord(record, resolved, params, true);\n }\n const draft = this.createDraft(resolved);\n return this.renderRecord(draft, resolved, params, true);\n }\n\n meta(): MessageMetadata {\n const resolved = this.resolved();\n const record = this.recordFor(resolved);\n const source = this.sourceText ?? record?.source ?? \"\";\n const target = this.targetText ?? record?.target;\n const type = this.typeTag ?? record?.type;\n const emotion = this.emotionTags.length > 0 ? [...this.emotionTags] : (record?.emotion ?? []);\n const status = this.statusTag ?? record?.status;\n const context = this.contextText ?? record?.context;\n const maxWidth = this.maxWidthCells ?? record?.maxWidth;\n const reference =\n this.referencePaths.length > 0 ? [...this.referencePaths] : (record?.reference ?? []);\n const reviewer = this.reviewerName ?? record?.reviewer;\n return {\n entryId: resolved.canonical,\n namespace: resolved.namespace,\n clan: resolved.clan,\n group: resolved.group,\n id: resolved.id,\n locale: this.activeLocale(),\n sourceLanguage: record?.sourceLanguage ?? this.i18n.getSourceLanguage(),\n targetLanguage: record?.locale ?? this.activeLocale(),\n variant: record?.variant ?? \"standard\",\n source,\n ...(target === undefined ? {} : { target }),\n ...(type === undefined ? {} : { type }),\n emotion,\n ...(status === undefined ? {} : { status }),\n ...(context === undefined ? {} : { context }),\n ...(maxWidth === undefined ? {} : { maxWidth }),\n reference,\n ...(reviewer === undefined ? {} : { reviewer }),\n extensions: record?.extensions ?? { ...this.extensionMap },\n };\n }\n\n entry(): CliffEntry | undefined {\n const resolved = this.resolved();\n return this.recordFor(resolved)?.entry;\n }\n\n commit(options: CommitOptions = {}): MessageBuilderImpl {\n const resolved = this.resolved();\n const existing = this.recordFor(resolved);\n if (existing === undefined) {\n this.ensureAuthoringMetadata(resolved);\n const draft = this.createDraft(resolved);\n this.validateDocument(draft);\n return this;\n }\n\n if (options.overwrite === true) {\n this.ensureAuthoringMetadata(resolved);\n this.applyOverwrite(existing);\n } else if (this.targetText !== undefined) {\n const previous = {\n ...(existing.entry.source === undefined ? {} : { source: existing.entry.source }),\n ...(existing.entry.target === undefined ? {} : { target: existing.entry.target }),\n ...(this.statusTag === undefined ? {} : { explicit: this.statusTag }),\n };\n existing.entry.target = this.targetText;\n existing.entry.status = reconcileEntryStatus(existing.entry, previous);\n } else {\n this.ensureAuthoringMetadata(resolved);\n }\n this.validateDocument(existing);\n return this;\n }\n\n private applyOverwrite(record: MessageRecord): void {\n const entry = record.entry;\n const previous = {\n ...(entry.source === undefined ? {} : { source: entry.source }),\n ...(entry.target === undefined ? {} : { target: entry.target }),\n ...(this.statusTag === undefined ? {} : { explicit: this.statusTag }),\n };\n if (this.sourceText !== undefined) entry.source = this.sourceText;\n if (this.targetText !== undefined) entry.target = this.targetText;\n if (this.typeTag !== undefined) entry.type = this.typeTag;\n if (this.emotionTags.length > 0) entry.emotion = [...this.emotionTags];\n if (this.contextText !== undefined) entry.context = this.contextText;\n if (this.maxWidthCells !== undefined) entry.maxWidth = this.maxWidthCells;\n if (this.referencePaths.length > 0) entry.reference = [...this.referencePaths];\n if (this.reviewerName !== undefined) entry.reviewer = this.reviewerName;\n if (Object.keys(this.extensionMap).length > 0) {\n entry.extensions = { ...entry.extensions, ...this.extensionMap };\n }\n entry.status = reconcileEntryStatus(entry, previous);\n }\n\n private validateDocument(record: MessageRecord): void {\n const issues = validateDocument(record.document);\n if (hasErrors(issues)) {\n throw new CliffValidationError(issues, record.document.corrections);\n }\n }\n\n width(params?: Params): number {\n return displayWidth(this.render(params));\n }\n\n fits(params?: Params): boolean {\n const resolved = this.resolved();\n const record = this.recordFor(resolved);\n const maxWidth = this.maxWidthCells ?? record?.maxWidth;\n if (maxWidth === undefined) return true;\n return this.width(params) <= maxWidth;\n }\n\n toString(): string {\n return this.render();\n }\n}\n\nexport function createT<EntryIds extends string = string>(\n i18n: I18nRuntime,\n scope: TranslationScope,\n): TFunction<EntryIds> {\n const callable = (entryId: EntryIdInput, params?: Params): MessageBuilder | string => {\n const builder = new MessageBuilderImpl(i18n, scope, entryId);\n if (params === undefined) {\n return builder as unknown as MessageBuilder;\n }\n return builder.params(params).render();\n };\n\n const fn = callable as unknown as TFunction<EntryIds>;\n fn.render = (entryId, params) => new MessageBuilderImpl(i18n, scope, entryId).render(params);\n fn.renderToParts = (entryId, params) =>\n new MessageBuilderImpl(i18n, scope, entryId).renderToParts(params);\n fn.has = (entryId) => {\n const resolved = i18n.resolve(entryId, scope);\n return resolved.exists && i18n.recordFor(resolved.canonical, i18n.getLocale()) !== undefined;\n };\n fn.entry = (entryId) => {\n const resolved = i18n.resolve(entryId, scope);\n return i18n.recordFor(resolved.canonical, i18n.getLocale())?.entry;\n };\n fn.meta = (entryId) => new MessageBuilderImpl(i18n, scope, entryId).meta();\n fn.entryIds = () => i18n.getCatalog().entryIds(scope);\n return fn;\n}\n","import type { TranslationScope } from \"./types.js\";\n\nexport class CliffI18nError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"CliffI18nError\";\n }\n}\n\nexport class CliffScopeError extends CliffI18nError {\n readonly scope: Partial<TranslationScope>;\n\n constructor(message: string, scope: Partial<TranslationScope> = {}) {\n super(message);\n this.name = \"CliffScopeError\";\n this.scope = scope;\n }\n}\n\nexport class CliffScopeMismatchError extends CliffScopeError {\n readonly entryId: string;\n\n constructor(entryId: string, scope: TranslationScope, expected: string) {\n super(\n `entry ID \"${entryId}\" resolves outside the active scope (${scope.namespace}.${scope.clan}); expected ${expected}`,\n scope,\n );\n this.name = \"CliffScopeMismatchError\";\n this.entryId = entryId;\n }\n}\n\nexport class CliffMissingEntryError extends CliffI18nError {\n readonly entryId: string;\n readonly locale: string;\n\n constructor(entryId: string, locale: string) {\n super(`missing CLIFF entry \"${entryId}\" for locale \"${locale}\"`);\n this.name = \"CliffMissingEntryError\";\n this.entryId = entryId;\n this.locale = locale;\n }\n}\n\nexport class CliffAmbiguousEntryError extends CliffI18nError {\n readonly entryId: string;\n readonly candidates: readonly string[];\n\n constructor(entryId: string, candidates: readonly string[]) {\n super(`ambiguous CLIFF entry \"${entryId}\"; candidates: ${candidates.join(\", \")}`);\n this.name = \"CliffAmbiguousEntryError\";\n this.entryId = entryId;\n this.candidates = candidates;\n }\n}\n\nexport class CliffDuplicateEntryError extends CliffI18nError {\n readonly entryId: string;\n readonly locale: string;\n\n constructor(entryId: string, locale: string) {\n super(`duplicate canonical CLIFF entry ID \"${entryId}\" for locale \"${locale}\"`);\n this.name = \"CliffDuplicateEntryError\";\n this.entryId = entryId;\n this.locale = locale;\n }\n}\n\nexport class CliffMissingMetadataError extends CliffI18nError {\n readonly entryId: string;\n readonly fields: readonly string[];\n\n constructor(entryId: string, fields: readonly string[], detail = \"\") {\n super(\n `entry ${entryId} is missing required CLIFF field${fields.length === 1 ? \"\" : \"s\"} ${fields\n .map((field) => `\"${field}\"`)\n .join(\", \")}${detail ? \"; \" + detail : \"\"}`,\n );\n this.name = \"CliffMissingMetadataError\";\n this.entryId = entryId;\n this.fields = fields;\n }\n}\n\nexport class CliffIcuError extends CliffI18nError {\n readonly messageText: string;\n\n constructor(messageText: string, detail: string) {\n super(`invalid ICU message: ${detail}`);\n this.name = \"CliffIcuError\";\n this.messageText = messageText;\n }\n}\n","import type {\n CliffDocument,\n CliffEntry,\n CliffGroup,\n Correction,\n ParseOptions,\n ValidationIssue,\n} from \"@cliff-format/core\";\nimport type { IcuRuntime, MessagePart } from \"./icu/types.js\";\n\nexport const TYPE = {\n noun: \"noun\",\n verb: \"verb\",\n adjective: \"adjective\",\n adverb: \"adverb\",\n pronoun: \"pronoun\",\n numeral: \"numeral\",\n preposition: \"preposition\",\n conjunction: \"conjunction\",\n particle: \"particle\",\n interjection: \"interjection\",\n \"proper-noun\": \"proper-noun\",\n \"noun-phrase\": \"noun-phrase\",\n \"verb-phrase\": \"verb-phrase\",\n \"adjective-phrase\": \"adjective-phrase\",\n \"adverb-phrase\": \"adverb-phrase\",\n \"fixed-phrase\": \"fixed-phrase\",\n idiom: \"idiom\",\n sentence: \"sentence\",\n description: \"description\",\n narration: \"narration\",\n dialogue: \"dialogue\",\n monologue: \"monologue\",\n prompt: \"prompt\",\n label: \"label\",\n subtitle: \"subtitle\",\n \"accessibility-cue\": \"accessibility-cue\",\n} as const;\n\nexport type TypeTag = (typeof TYPE)[keyof typeof TYPE];\n\nexport const EMOTION = {\n neutral: \"neutral\",\n objective: \"objective\",\n mechanical: \"mechanical\",\n joyful: \"joyful\",\n sad: \"sad\",\n angry: \"angry\",\n fearful: \"fearful\",\n surprised: \"surprised\",\n curious: \"curious\",\n disgusted: \"disgusted\",\n anxious: \"anxious\",\n calm: \"calm\",\n playful: \"playful\",\n serious: \"serious\",\n urgent: \"urgent\",\n romantic: \"romantic\",\n hopeful: \"hopeful\",\n grateful: \"grateful\",\n formal: \"formal\",\n informal: \"informal\",\n polite: \"polite\",\n rude: \"rude\",\n nostalgic: \"nostalgic\",\n} as const;\n\nexport type EmotionTag = (typeof EMOTION)[keyof typeof EMOTION];\n\nexport const STATUS = {\n initial: \"initial\",\n translated: \"translated\",\n reviewed: \"reviewed\",\n final: \"final\",\n} as const;\n\nexport type StatusTag = (typeof STATUS)[keyof typeof STATUS];\n\nexport const VARIANT = {\n standard: \"standard\",\n glossary: \"glossary\",\n} as const;\n\nexport type VariantTag = (typeof VARIANT)[keyof typeof VARIANT];\n\nexport const STATUS_ORDER = [\"initial\", \"translated\", \"reviewed\", \"final\"] as const;\n\nexport type Params = Record<string, unknown>;\n\nexport type EntryIdOf<EntryIds extends string> = string extends EntryIds\n ? string\n : EntryIds | (string & {});\n\nexport type CliffResource = string | Uint8Array | CliffDocument;\n\nexport interface TranslationScope {\n namespace: string;\n clan: string;\n group?: string;\n}\n\nexport type EntryIdInput =\n | string\n | {\n namespace?: string;\n clan?: string;\n group?: string;\n id: string;\n };\n\nexport interface EntryQuery {\n namespace?: string;\n clan?: string;\n group?: string;\n locale?: string | \"all\";\n status?: StatusTag | readonly StatusTag[];\n target?: \"any\" | \"present\" | \"missing\";\n}\n\nexport type StatusCounts = Record<StatusTag, number>;\n\nexport interface ResolvedEntryId {\n namespace: string;\n clan: string;\n group: string;\n id: string;\n canonical: string;\n exists: boolean;\n ambiguous?: boolean;\n candidates?: readonly string[];\n}\n\nexport interface MessageRecord {\n canonical: string;\n namespace: string;\n clan: string;\n group: string;\n id: string;\n locale: string;\n sourceLanguage: string;\n document: CliffDocument;\n groupRef: CliffGroup;\n entry: CliffEntry;\n variant: string;\n source: string;\n target?: string;\n type?: string;\n emotion: string[];\n status?: string;\n context?: string;\n maxWidth?: number;\n reference: string[];\n reviewer?: string;\n extensions: Record<string, string>;\n filePath?: string;\n}\n\nexport interface MessageMetadata {\n entryId: string;\n namespace: string;\n clan: string;\n group: string;\n id: string;\n locale: string;\n sourceLanguage: string;\n targetLanguage: string;\n variant: string;\n source: string;\n target?: string;\n type?: string;\n emotion: string[];\n status?: string;\n context?: string;\n maxWidth?: number;\n reference: string[];\n reviewer?: string;\n extensions: Record<string, string>;\n}\n\nexport interface MessageState {\n source: boolean;\n type: boolean;\n}\n\nexport type RenderMethod<S extends MessageState> = S[\"source\"] extends true\n ? S[\"type\"] extends true\n ? (params?: Params) => string\n : never\n : (params?: Params) => string;\n\nexport type RenderPartsMethod<S extends MessageState> = S[\"source\"] extends true\n ? S[\"type\"] extends true\n ? (params?: Params) => MessagePart[]\n : never\n : (params?: Params) => MessagePart[];\n\nexport interface CommitOptions {\n overwrite?: boolean;\n validate?: boolean;\n}\n\nexport interface MessageBuilder<S extends MessageState = { source: false; type: false }> {\n source(text: string, params?: Params): MessageBuilder<{ source: true; type: S[\"type\"] }>;\n type(tag: TypeTag): MessageBuilder<{ source: S[\"source\"]; type: true }>;\n typeFromGroup: S extends { source: true; type: false }\n ? () => MessageBuilder<{ source: true; type: true }>\n : never;\n emotion(...tags: readonly (EmotionTag | readonly EmotionTag[])[]): MessageBuilder<S>;\n context(text: string): MessageBuilder<S>;\n maxWidth(cells: number): MessageBuilder<S>;\n reference(...paths: string[]): MessageBuilder<S>;\n reviewer(name: string): MessageBuilder<S>;\n extension(name: string, value: string): MessageBuilder<S>;\n target(text: string, params?: Params): MessageBuilder<S>;\n status(tag: StatusTag): MessageBuilder<S>;\n locale(tag: string): MessageBuilder<S>;\n params(params: Params): MessageBuilder<S>;\n count(value: number): MessageBuilder<S>;\n render: RenderMethod<S>;\n renderToParts: RenderPartsMethod<S>;\n commit: S extends { source: true; type: true }\n ? (options?: CommitOptions) => MessageBuilder<S>\n : never;\n meta(): MessageMetadata;\n entry(): CliffEntry | undefined;\n width(params?: Params): number;\n fits(params?: Params): boolean;\n toString(): string;\n}\n\nexport interface TFunction<EntryIds extends string = string> {\n (entryId: EntryIdOf<EntryIds>): MessageBuilder<{ source: false; type: false }>;\n (entryId: EntryIdOf<EntryIds>, params: Params): string;\n render(entryId: EntryIdOf<EntryIds>, params?: Params): string;\n renderToParts(entryId: EntryIdOf<EntryIds>, params?: Params): MessagePart[];\n has(entryId: EntryIdOf<EntryIds>): boolean;\n entry(entryId: EntryIdOf<EntryIds>): CliffEntry | undefined;\n meta(entryId: EntryIdOf<EntryIds>): MessageMetadata | undefined;\n entryIds(): string[];\n}\n\nexport interface ScopedI18n<EntryIds extends string = string> {\n readonly t: TFunction<EntryIds>;\n readonly scope: TranslationScope;\n}\n\nexport type MissingBehavior = \"entryId\" | \"empty\" | \"throw\" | \"source\";\nexport type WidthPolicy = \"off\" | \"warn\" | \"error\";\nexport type DiagnosticSeverity = \"error\" | \"warning\" | \"info\";\n\nexport interface I18nDiagnostic {\n code: string;\n severity: DiagnosticSeverity;\n message: string;\n entryId?: string;\n locale?: string;\n namespace?: string;\n clan?: string;\n group?: string;\n line?: number;\n details?: Record<string, unknown>;\n}\n\nexport interface I18nOptions {\n locale: string;\n fallbackLocale?: string | readonly string[];\n resources?: readonly CliffResource[];\n sourceLanguage?: string;\n defaultGroup?: string;\n params?: Params;\n aliases?: Readonly<Record<string, string>>;\n missing?: MissingBehavior;\n strictEntryIds?: boolean;\n requireEmotion?: boolean | readonly TypeTag[];\n enforceMaxWidth?: WidthPolicy;\n icu?: IcuRuntime;\n parse?: ParseOptions;\n onDiagnostic?: (diagnostic: I18nDiagnostic) => void;\n maxDiagnostics?: number;\n}\n\nexport interface TranslatedDraft {\n source?: string;\n target?: string;\n type?: string;\n emotion?: readonly string[];\n status?: string;\n context?: string;\n maxWidth?: number;\n reference?: readonly string[];\n reviewer?: string;\n extensions?: Record<string, string>;\n}\n\nexport interface AddOptions {\n sourcePath?: string;\n tolerant?: boolean;\n validate?: boolean;\n}\n\nexport interface AddResult {\n documents: readonly CliffDocument[];\n issues: readonly ValidationIssue[];\n corrections: readonly Correction[];\n}\n\nexport interface FileOptions {\n layout?: \"folder\" | \"flat\";\n}\n\nexport interface CliffFile {\n filePath: string;\n namespace: string;\n clan: string;\n locale: string;\n text: string;\n document: CliffDocument;\n}\n\nexport interface I18n<EntryIds extends string = string> {\n readonly locale: string;\n readonly language: string;\n readonly sourceLanguage: string | undefined;\n getLocale(): string;\n setLocale(locale: string): void;\n changeLanguage(locale: string): void;\n getVersion(): number;\n subscribe(listener: () => void): () => void;\n scope(scope: TranslationScope): ScopedI18n<EntryIds>;\n add(resource: CliffResource, options?: AddOptions): AddResult;\n addDocument(document: CliffDocument, options?: AddOptions): AddResult;\n has(\n entryId: EntryIdOf<EntryIds> | Exclude<EntryIdInput, string>,\n scope: TranslationScope,\n ): boolean;\n resolve(\n entryId: EntryIdOf<EntryIds> | Exclude<EntryIdInput, string>,\n scope: TranslationScope,\n ): ResolvedEntryId;\n entryIds(scope?: Partial<TranslationScope>): string[];\n query(options?: EntryQuery): MessageRecord[];\n untranslated(options?: Omit<EntryQuery, \"status\" | \"target\">): MessageRecord[];\n byStatus(status: StatusTag, options?: Omit<EntryQuery, \"status\">): MessageRecord[];\n statusCounts(options?: Omit<EntryQuery, \"status\">): StatusCounts;\n namespaces(): string[];\n clans(namespace?: string): string[];\n groups(scope?: Partial<TranslationScope>): string[];\n locales(): string[];\n files(options?: FileOptions): CliffFile[];\n toCliff(options?: FileOptions): string;\n validate(): ValidationIssue[];\n diagnostics(): readonly I18nDiagnostic[];\n clearDiagnostics(): void;\n format(\n message: string,\n params?: Params,\n options?: { locale?: string; currency?: string; timeZone?: string },\n ): string;\n formatToParts(\n message: string,\n params?: Params,\n options?: { locale?: string; currency?: string; timeZone?: string },\n ): MessagePart[];\n}\n\nexport interface I18nRuntime {\n resolve(entryId: EntryIdInput, scope: TranslationScope): ResolvedEntryId;\n recordFor(canonical: string, locale: string): MessageRecord | undefined;\n format(\n message: string,\n params: Params,\n options: { locale: string; currency?: string; timeZone?: string },\n ): string;\n formatToParts(\n message: string,\n params: Params,\n options: { locale: string; currency?: string; timeZone?: string },\n ): MessagePart[];\n diagnose(diagnostic: I18nDiagnostic): void;\n getSourceLanguage(): string;\n getLocale(): string;\n getCatalog(): import(\"./catalog.js\").Catalog;\n readonly defaultParams: Params;\n readonly missing: MissingBehavior;\n readonly requireEmotion: boolean | readonly TypeTag[];\n readonly enforceMaxWidth: WidthPolicy;\n}\n\nexport type { IcuRuntime, MessagePart } from \"./icu/types.js\";\n","import { EMOTION_TAGS, STATUS_TAGS, TYPE_TAGS, VARIANT_TAGS } from \"@cliff-format/core\";\nimport type { EmotionTag, StatusTag, TypeTag, VariantTag } from \"./types.js\";\n\nexport function isTypeTag(value: string): value is TypeTag {\n return TYPE_TAGS.has(value);\n}\n\nexport function isEmotionTag(value: string): value is EmotionTag {\n return EMOTION_TAGS.has(value);\n}\n\nexport function isStatusTag(value: string): value is StatusTag {\n return STATUS_TAGS.has(value);\n}\n\nexport function isVariantTag(value: string): value is VariantTag {\n return VARIANT_TAGS.has(value);\n}\n\nexport function assertTypeTag(value: string): TypeTag {\n if (!isTypeTag(value)) {\n throw new TypeError(`invalid CLIFF type tag \"${value}\"`);\n }\n return value;\n}\n\nexport function assertEmotionTag(value: string): EmotionTag {\n if (!isEmotionTag(value)) {\n throw new TypeError(`invalid CLIFF emotion tag \"${value}\"`);\n }\n return value;\n}\n\nexport function assertStatusTag(value: string): StatusTag {\n if (!isStatusTag(value)) {\n throw new TypeError(`invalid CLIFF status tag \"${value}\"`);\n }\n return value;\n}\n\nexport function assertVariantTag(value: string): VariantTag {\n if (!isVariantTag(value)) {\n throw new TypeError(`invalid CLIFF variant tag \"${value}\"`);\n }\n return value;\n}\n","import type { CliffEntry } from \"@cliff-format/core\";\nimport { STATUS_ORDER, type StatusTag } from \"./types.js\";\nimport { isStatusTag } from \"./vocabulary.js\";\n\nexport const STATUS_TRANSITIONS: Record<StatusTag, readonly StatusTag[]> = {\n initial: [\"translated\"],\n translated: [\"reviewed\", \"translated\"],\n reviewed: [\"final\", \"translated\"],\n final: [\"translated\"],\n};\n\nexport function statusOf(entry: CliffEntry): StatusTag {\n const value = entry.status ?? \"\";\n return isStatusTag(value) ? value : \"initial\";\n}\n\nexport function canTransitionStatus(from: StatusTag, to: StatusTag): boolean {\n return STATUS_TRANSITIONS[from].includes(to);\n}\n\nexport interface StatusContext {\n source?: string;\n target?: string;\n explicit?: StatusTag;\n}\n\n/**\n * Return the status a write should leave on an entry.\n * An explicit status wins. Otherwise a missing target is initial, and a changed\n * source or reworked reviewed/final target returns to translated.\n */\nexport function reconcileEntryStatus(entry: CliffEntry, previous: StatusContext = {}): StatusTag {\n if (previous.explicit !== undefined) return previous.explicit;\n const current = statusOf(entry);\n if (entry.target === undefined) return \"initial\";\n if (current === \"initial\") return \"translated\";\n\n const sourceChanged = previous.source !== undefined && previous.source !== entry.source;\n if (sourceChanged) return \"translated\";\n\n const targetChanged = previous.target !== undefined && previous.target !== entry.target;\n if (targetChanged && (current === \"reviewed\" || current === \"final\")) {\n return \"translated\";\n }\n return current;\n}\n\nexport function nextStatuses(status: StatusTag): readonly StatusTag[] {\n return STATUS_TRANSITIONS[status];\n}\n\nexport function statusOrder(): readonly StatusTag[] {\n return STATUS_ORDER;\n}\n","import {\n type CliffDocument,\n type CliffEntry,\n type CliffGroup,\n canonicalId,\n createDocument,\n createExtensions,\n effectiveContext,\n effectiveEmotion,\n effectiveMaxWidth,\n effectiveType,\n isName,\n serialize,\n type ValidationIssue,\n validateDocument,\n} from \"@cliff-format/core\";\nimport type { EntryIdCatalogContext } from \"./entry-id.js\";\nimport { CliffDuplicateEntryError, CliffI18nError } from \"./errors.js\";\nimport { statusOf } from \"./status.js\";\nimport type {\n CliffFile,\n EntryQuery,\n FileOptions,\n MessageRecord,\n StatusCounts,\n StatusTag,\n TranslatedDraft,\n TranslationScope,\n} from \"./types.js\";\n\nexport interface CatalogOptions {\n aliases?: Readonly<Record<string, string>>;\n defaultGroup?: string;\n}\n\nfunction normalizeLocale(tag: string): string {\n return tag.toLowerCase();\n}\n\nfunction localeVariants(tag: string): string[] {\n const parts = tag.split(\"-\").filter((part) => part.length > 0);\n const variants: string[] = [];\n for (let length = parts.length; length >= 1; length--) {\n variants.push(parts.slice(0, length).join(\"-\"));\n }\n return variants;\n}\n\nfunction addSuffix(map: Map<string, Set<string>>, suffix: string, canonical: string): void {\n if (suffix.length === 0) return;\n const existing = map.get(suffix);\n if (existing === undefined) {\n map.set(suffix, new Set([canonical]));\n } else {\n existing.add(canonical);\n }\n}\n\nfunction recordFrom(document: CliffDocument, group: CliffGroup, entry: CliffEntry): MessageRecord {\n const namespace = document.header.namespace;\n const clan = document.header.clan;\n const groupPath = group.path;\n const canonical = canonicalId(namespace, clan, groupPath, entry.id);\n const type = effectiveType(entry, group);\n const context = effectiveContext(entry, group);\n const maxWidth = effectiveMaxWidth(entry, group);\n return {\n canonical,\n namespace,\n clan,\n group: groupPath,\n id: entry.id,\n locale: document.header.targetLanguage,\n sourceLanguage: document.header.sourceLanguage,\n document,\n groupRef: group,\n entry,\n variant: document.header.variant,\n source: entry.source ?? \"\",\n ...(entry.target === undefined ? {} : { target: entry.target }),\n ...(type === undefined ? {} : { type }),\n emotion: effectiveEmotion(entry, group),\n ...(entry.status === undefined ? {} : { status: entry.status }),\n ...(context === undefined ? {} : { context }),\n ...(maxWidth === undefined ? {} : { maxWidth }),\n reference: [...entry.reference],\n ...(entry.reviewer === undefined ? {} : { reviewer: entry.reviewer }),\n extensions: { ...entry.extensions },\n ...(document.path === undefined ? {} : { filePath: document.path }),\n };\n}\n\nexport class Catalog implements EntryIdCatalogContext {\n readonly defaultGroup: string;\n readonly aliases: Readonly<Record<string, string>>;\n private readonly documentsList: CliffDocument[] = [];\n private readonly byLocale = new Map<string, Map<string, MessageRecord>>();\n private readonly byCanonical = new Map<string, MessageRecord[]>();\n private readonly suffixMap = new Map<string, Set<string>>();\n private readonly namespaceSet = new Set<string>();\n private readonly clanSet = new Set<string>();\n private readonly groupSet = new Set<string>();\n private readonly localeSet = new Set<string>();\n private readonly sourceLanguageSet = new Set<string>();\n\n constructor(options: CatalogOptions = {}) {\n this.defaultGroup = options.defaultGroup ?? \"general\";\n this.aliases = options.aliases ?? {};\n }\n\n get knownNamespaces(): ReadonlySet<string> {\n return this.namespaceSet;\n }\n\n get knownClans(): ReadonlySet<string> {\n return this.clanSet;\n }\n\n get documents(): readonly CliffDocument[] {\n return this.documentsList;\n }\n\n get sourceLanguages(): readonly string[] {\n return [...this.sourceLanguageSet];\n }\n\n addDocument(document: CliffDocument): MessageRecord[] {\n const locale = document.header.targetLanguage;\n const localeTag = normalizeLocale(locale);\n let localeMap = this.byLocale.get(localeTag);\n if (localeMap === undefined) {\n localeMap = new Map<string, MessageRecord>();\n this.byLocale.set(localeTag, localeMap);\n }\n\n const added: MessageRecord[] = [];\n for (const group of document.groups) {\n for (const entry of group.entries) {\n const record = recordFrom(document, group, entry);\n if (localeMap.has(record.canonical)) {\n throw new CliffDuplicateEntryError(record.canonical, locale);\n }\n this.indexRecord(record, localeMap);\n added.push(record);\n }\n }\n\n this.documentsList.push(document);\n this.namespaceSet.add(document.header.namespace);\n this.clanSet.add(document.header.clan);\n this.localeSet.add(locale);\n if (document.header.sourceLanguage.length > 0) {\n this.sourceLanguageSet.add(document.header.sourceLanguage);\n }\n return added;\n }\n\n addDraft(\n parts: {\n namespace: string;\n clan: string;\n group: string;\n id: string;\n sourceLanguage: string;\n targetLanguage: string;\n },\n draft: TranslatedDraft,\n ): MessageRecord {\n const document = this.ensureDocument(parts);\n let group = document.groups.find((candidate) => candidate.path === parts.group);\n if (group === undefined) {\n group = {\n path: parts.group,\n line: 0,\n emotion: [],\n entries: [],\n extensions: createExtensions(),\n };\n document.groups.push(group);\n this.groupSet.add(parts.group);\n }\n\n const entry: CliffEntry = {\n id: parts.id,\n line: 0,\n emotion: draft.emotion ? [...draft.emotion] : [],\n reference: draft.reference ? [...draft.reference] : [],\n extensions: draft.extensions ? { ...draft.extensions } : createExtensions(),\n };\n if (draft.source !== undefined) entry.source = draft.source;\n if (draft.target !== undefined) entry.target = draft.target;\n if (draft.type !== undefined) entry.type = draft.type;\n if (draft.status !== undefined) entry.status = draft.status;\n if (draft.context !== undefined) entry.context = draft.context;\n if (draft.maxWidth !== undefined) entry.maxWidth = draft.maxWidth;\n if (draft.reviewer !== undefined) entry.reviewer = draft.reviewer;\n\n const canonical = canonicalId(parts.namespace, parts.clan, parts.group, parts.id);\n const localeMap = this.byLocale.get(normalizeLocale(parts.targetLanguage));\n if (localeMap?.has(canonical) === true) {\n throw new CliffDuplicateEntryError(canonical, parts.targetLanguage);\n }\n\n group.entries.push(entry);\n const record = recordFrom(document, group, entry);\n if (localeMap === undefined) {\n const created = new Map<string, MessageRecord>();\n this.byLocale.set(normalizeLocale(parts.targetLanguage), created);\n this.indexRecord(record, created);\n } else {\n this.indexRecord(record, localeMap);\n }\n this.localeSet.add(parts.targetLanguage);\n this.sourceLanguageSet.add(parts.sourceLanguage);\n return record;\n }\n\n private ensureDocument(parts: {\n namespace: string;\n clan: string;\n group: string;\n id: string;\n sourceLanguage: string;\n targetLanguage: string;\n }): CliffDocument {\n const existing = this.documentsList.find(\n (document) =>\n document.header.namespace === parts.namespace &&\n document.header.clan === parts.clan &&\n normalizeLocale(document.header.targetLanguage) === normalizeLocale(parts.targetLanguage),\n );\n if (existing !== undefined) return existing;\n\n const document = createDocument(\"1.1\");\n document.header.namespace = parts.namespace;\n document.header.clan = parts.clan;\n document.header.sourceLanguage = parts.sourceLanguage;\n document.header.targetLanguage = parts.targetLanguage;\n document.header.variant = \"standard\";\n this.documentsList.push(document);\n this.namespaceSet.add(parts.namespace);\n this.clanSet.add(parts.clan);\n return document;\n }\n\n private indexRecord(record: MessageRecord, localeMap: Map<string, MessageRecord>): void {\n localeMap.set(record.canonical, record);\n const existing = this.byCanonical.get(record.canonical);\n if (existing === undefined) {\n this.byCanonical.set(record.canonical, [record]);\n } else {\n existing.push(record);\n }\n this.namespaceSet.add(record.namespace);\n this.clanSet.add(record.clan);\n this.groupSet.add(record.group);\n addSuffix(this.suffixMap, `${record.clan}.${record.group}.${record.id}`, record.canonical);\n addSuffix(this.suffixMap, `${record.group}.${record.id}`, record.canonical);\n const lastGroup = record.group.split(\".\").at(-1);\n if (lastGroup !== undefined) {\n addSuffix(this.suffixMap, `${lastGroup}.${record.id}`, record.canonical);\n }\n addSuffix(this.suffixMap, record.id, record.canonical);\n }\n\n hasCanonical(canonical: string): boolean {\n return this.byCanonical.has(canonical);\n }\n\n recordForCanonical(canonical: string): MessageRecord | undefined {\n return this.byCanonical.get(canonical)?.[0];\n }\n\n recordsForCanonical(canonical: string): readonly MessageRecord[] {\n return this.byCanonical.get(canonical) ?? [];\n }\n\n suffixMatches(suffix: string): readonly string[] {\n return [...(this.suffixMap.get(suffix) ?? [])];\n }\n\n record(canonical: string, locale: string): MessageRecord | undefined {\n return this.byLocale.get(normalizeLocale(locale))?.get(canonical);\n }\n\n selectRecord(\n canonical: string,\n localeChain: readonly string[],\n sourceLanguage?: string,\n ): MessageRecord | undefined {\n const records = this.byCanonical.get(canonical);\n if (records === undefined) return undefined;\n for (const tag of localeChain) {\n const found = records.find(\n (record) => normalizeLocale(record.locale) === tag && record.target !== undefined,\n );\n if (found !== undefined) return found;\n }\n for (const tag of localeChain) {\n const found = records.find((record) => normalizeLocale(record.locale) === tag);\n if (found !== undefined) return found;\n }\n if (sourceLanguage !== undefined) {\n const found = records.find(\n (record) => normalizeLocale(record.locale) === normalizeLocale(sourceLanguage),\n );\n if (found !== undefined) return found;\n }\n return records[0];\n }\n\n localeChain(\n locale: string,\n fallbacks: readonly string[] = [],\n sourceLanguage?: string,\n ): string[] {\n const tags: string[] = [];\n const add = (tag: string): void => {\n for (const variant of localeVariants(tag)) {\n const normalized = normalizeLocale(variant);\n if (normalized.length > 0 && !tags.includes(normalized)) tags.push(normalized);\n }\n };\n add(locale);\n for (const fallback of fallbacks) add(fallback);\n if (sourceLanguage !== undefined) add(sourceLanguage);\n return tags;\n }\n\n namespaces(): string[] {\n return [...this.namespaceSet].sort();\n }\n\n clans(namespace?: string): string[] {\n if (namespace === undefined) return [...this.clanSet].sort();\n const clans = new Set<string>();\n for (const records of this.byCanonical.values()) {\n for (const record of records) {\n if (record.namespace === namespace) clans.add(record.clan);\n }\n }\n return [...clans].sort();\n }\n\n groups(scope: Partial<TranslationScope> = {}): string[] {\n const groups = new Set<string>();\n for (const records of this.byCanonical.values()) {\n for (const record of records) {\n if (scope.namespace !== undefined && record.namespace !== scope.namespace) continue;\n if (scope.clan !== undefined && record.clan !== scope.clan) continue;\n if (\n scope.group !== undefined &&\n scope.group.length > 0 &&\n !(record.group === scope.group || record.group.startsWith(`${scope.group}.`))\n ) {\n continue;\n }\n groups.add(record.group);\n }\n }\n return [...groups].sort();\n }\n\n entryIds(scope: Partial<TranslationScope> = {}): string[] {\n const entryIds = new Set<string>();\n for (const records of this.byCanonical.values()) {\n for (const record of records) {\n if (scope.namespace !== undefined && record.namespace !== scope.namespace) continue;\n if (scope.clan !== undefined && record.clan !== scope.clan) continue;\n if (\n scope.group !== undefined &&\n scope.group.length > 0 &&\n !(record.group === scope.group || record.group.startsWith(`${scope.group}.`))\n ) {\n continue;\n }\n entryIds.add(record.canonical);\n }\n }\n return [...entryIds].sort();\n }\n\n allRecords(): MessageRecord[] {\n const records: MessageRecord[] = [];\n for (const group of this.byCanonical.values()) records.push(...group);\n return records;\n }\n\n query(options: EntryQuery = {}): MessageRecord[] {\n const statuses =\n options.status === undefined\n ? undefined\n : new Set<StatusTag>(Array.isArray(options.status) ? options.status : [options.status]);\n return this.allRecords().filter((record) => {\n if (options.namespace !== undefined && record.namespace !== options.namespace) return false;\n if (options.clan !== undefined && record.clan !== options.clan) return false;\n if (\n options.group !== undefined &&\n options.group.length > 0 &&\n !(record.group === options.group || record.group.startsWith(`${options.group}.`))\n ) {\n return false;\n }\n if (\n options.locale !== undefined &&\n options.locale !== \"all\" &&\n normalizeLocale(record.locale) !== normalizeLocale(options.locale)\n ) {\n return false;\n }\n if (statuses !== undefined && !statuses.has(statusOf(record.entry))) return false;\n if (options.target === \"present\" && record.target === undefined) return false;\n if (options.target === \"missing\" && record.target !== undefined) return false;\n return true;\n });\n }\n\n untranslated(options: Omit<EntryQuery, \"status\" | \"target\"> = {}): MessageRecord[] {\n return this.query(options).filter(\n (record) => record.target === undefined || statusOf(record.entry) === \"initial\",\n );\n }\n\n byStatus(status: StatusTag, options: Omit<EntryQuery, \"status\"> = {}): MessageRecord[] {\n return this.query({ ...options, status });\n }\n\n statusCounts(options: Omit<EntryQuery, \"status\"> = {}): StatusCounts {\n const counts: StatusCounts = {\n initial: 0,\n translated: 0,\n reviewed: 0,\n final: 0,\n };\n for (const record of this.query(options)) counts[statusOf(record.entry)]++;\n return counts;\n }\n\n locales(): string[] {\n return [...this.localeSet].sort();\n }\n\n findGroup(namespace: string, clan: string, groupPath: string): CliffGroup | undefined {\n for (const document of this.documentsList) {\n if (document.header.namespace !== namespace || document.header.clan !== clan) continue;\n const group = document.groups.find((candidate) => candidate.path === groupPath);\n if (group !== undefined) return group;\n }\n return undefined;\n }\n\n files(options: FileOptions = {}): CliffFile[] {\n const files: CliffFile[] = [];\n const used = new Set<string>();\n const layout = options.layout ?? \"folder\";\n for (const document of this.documentsList) {\n const header = document.header;\n let filePath = document.path;\n if (filePath === undefined || filePath.length === 0) {\n filePath =\n layout === \"flat\"\n ? `${header.clan}.${header.targetLanguage}.cliff`\n : `${header.targetLanguage}/${header.clan}.cliff`;\n }\n if (used.has(filePath)) {\n throw new CliffI18nError(`duplicate CLIFF output path \"${filePath}\"`);\n }\n used.add(filePath);\n files.push({\n filePath,\n namespace: header.namespace,\n clan: header.clan,\n locale: header.targetLanguage,\n text: serialize(document),\n document,\n });\n }\n return files;\n }\n\n toCliff(options: FileOptions = {}): string {\n const files = this.files(options);\n if (files.length === 0) return \"\";\n if (files.length > 1) {\n throw new CliffI18nError(\n `${files.length} CLIFF documents are loaded; use files() and write each one separately`,\n );\n }\n const first = files[0];\n if (first === undefined) return \"\";\n return first.text;\n }\n\n validate(): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n for (const document of this.documentsList) {\n issues.push(...validateDocument(document));\n }\n return issues;\n }\n}\n\nexport function assertCatalogParts(parts: {\n namespace: string;\n clan: string;\n group: string;\n id: string;\n}): void {\n if (!isName(parts.namespace)) throw new CliffI18nError(`invalid namespace \"${parts.namespace}\"`);\n if (!isName(parts.clan)) throw new CliffI18nError(`invalid clan \"${parts.clan}\"`);\n if (!isName(parts.id)) throw new CliffI18nError(`invalid entry id \"${parts.id}\"`);\n for (const segment of parts.group.split(\".\")) {\n if (!isName(segment)) {\n throw new CliffI18nError(`invalid group path \"${parts.group}\"`);\n }\n }\n}\n","import { isName } from \"@cliff-format/core\";\nimport { CliffAmbiguousEntryError, CliffScopeError, CliffScopeMismatchError } from \"./errors.js\";\nimport type { EntryIdInput, MessageRecord, ResolvedEntryId, TranslationScope } from \"./types.js\";\n\nexport interface EntryIdCatalogContext {\n readonly knownNamespaces: ReadonlySet<string>;\n readonly knownClans: ReadonlySet<string>;\n readonly defaultGroup: string;\n readonly aliases: Readonly<Record<string, string>>;\n hasCanonical(canonical: string): boolean;\n recordForCanonical(canonical: string): MessageRecord | undefined;\n suffixMatches(suffix: string): readonly string[];\n}\n\ninterface ParsedEntryId {\n raw: string;\n namespace?: string;\n segments: string[];\n}\n\nexport function joinCanonical(namespace: string, clan: string, group: string, id: string): string {\n return [namespace, clan, group, id].filter((part) => part.length > 0).join(\".\");\n}\n\nexport function assertScope(scope: TranslationScope): void {\n if (!isName(scope.namespace)) {\n throw new CliffScopeError(\n `namespace \"${scope.namespace}\" is not a valid CLIFF name (A-Z a-z 0-9 _ -)`,\n scope,\n );\n }\n if (!isName(scope.clan)) {\n throw new CliffScopeError(\n `clan \"${scope.clan}\" is not a valid CLIFF name (A-Z a-z 0-9 _ -)`,\n scope,\n );\n }\n if (scope.group !== undefined && scope.group.length > 0) {\n for (const segment of scope.group.split(\".\")) {\n if (!isName(segment)) {\n throw new CliffScopeError(\n `group path \"${scope.group}\" contains invalid segment \"${segment}\"`,\n scope,\n );\n }\n }\n }\n}\n\nfunction applyAlias(raw: string, aliases: Readonly<Record<string, string>>): string {\n let current = raw;\n const seen = new Set<string>();\n while (Object.hasOwn(aliases, current)) {\n if (seen.has(current)) {\n throw new CliffScopeError(`alias cycle while resolving \"${raw}\"`);\n }\n seen.add(current);\n current = aliases[current] as string;\n }\n return current;\n}\n\nfunction parseStringEntryId(raw: string): ParsedEntryId {\n const text = raw.trim();\n if (text.length === 0) {\n throw new CliffScopeError(\"entry ID must not be empty\");\n }\n const colon = /^([A-Za-z0-9_-]+):(.+)$/.exec(text);\n const namespace = colon?.[1];\n const body = colon?.[2] ?? text;\n if (namespace !== undefined && !isName(namespace)) {\n throw new CliffScopeError(`namespace \"${namespace}\" is not a valid CLIFF name`);\n }\n const segments = body\n .split(/[./]/)\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0);\n if (segments.length === 0) {\n throw new CliffScopeError(`entry ID \"${raw}\" has no path segments`);\n }\n for (const segment of segments) {\n if (!isName(segment)) {\n throw new CliffScopeError(\n `entry ID \"${raw}\" contains invalid segment \"${segment}\"; CLIFF names use A-Z a-z 0-9 _ -`,\n );\n }\n }\n return namespace === undefined ? { raw, segments } : { raw, namespace, segments };\n}\n\nfunction candidateEntryIds(parsed: ParsedEntryId, scope: TranslationScope): string[] {\n const joined = parsed.segments.join(\".\");\n const out: string[] = [];\n const add = (value: string): void => {\n if (value.length > 0 && !out.includes(value)) out.push(value);\n };\n\n if (parsed.namespace !== undefined) {\n add(`${parsed.namespace}.${joined}`);\n add(`${parsed.namespace}.${scope.clan}.${joined}`);\n if (scope.group !== undefined && scope.group.length > 0) {\n add(`${parsed.namespace}.${scope.clan}.${scope.group}.${joined}`);\n }\n return out;\n }\n\n add(joined);\n add(`${scope.namespace}.${joined}`);\n add(`${scope.namespace}.${scope.clan}.${joined}`);\n if (scope.group !== undefined && scope.group.length > 0) {\n add(`${scope.namespace}.${scope.clan}.${scope.group}.${joined}`);\n }\n return out;\n}\n\nfunction partsOfRecord(record: MessageRecord): ResolvedEntryId {\n return {\n namespace: record.namespace,\n clan: record.clan,\n group: record.group,\n id: record.id,\n canonical: record.canonical,\n exists: true,\n };\n}\n\nfunction groupPrefixLength(group: string, prefix: string): number {\n const groupSegments = group.split(\".\");\n const prefixSegments = prefix.split(\".\").filter((segment) => segment.length > 0);\n let count = 0;\n while (\n count < groupSegments.length &&\n count < prefixSegments.length &&\n groupSegments[count] === prefixSegments[count]\n ) {\n count++;\n }\n return count;\n}\n\nfunction chooseByGroup(records: readonly MessageRecord[], scope: TranslationScope): MessageRecord {\n const prefix = scope.group ?? \"\";\n const sorted = [...records].sort((left, right) => {\n const leftPrefix = prefix.length > 0 ? groupPrefixLength(left.group, prefix) : 0;\n const rightPrefix = prefix.length > 0 ? groupPrefixLength(right.group, prefix) : 0;\n if (leftPrefix !== rightPrefix) return rightPrefix - leftPrefix;\n const leftSegments = left.group.split(\".\").length;\n const rightSegments = right.group.split(\".\").length;\n if (leftSegments !== rightSegments) return rightSegments - leftSegments;\n return left.canonical.localeCompare(right.canonical);\n });\n return sorted[0] as MessageRecord;\n}\n\nfunction validateGroup(group: string): void {\n if (group.length === 0) return;\n for (const segment of group.split(\".\")) {\n if (!isName(segment)) {\n throw new CliffScopeError(`group path \"${group}\" contains invalid segment \"${segment}\"`);\n }\n }\n}\n\nfunction parseAuthoringEntryId(\n parsed: ParsedEntryId,\n scope: TranslationScope,\n context: EntryIdCatalogContext,\n): ResolvedEntryId {\n if (parsed.namespace !== undefined && parsed.namespace !== scope.namespace) {\n throw new CliffScopeMismatchError(\n parsed.raw,\n scope,\n `${scope.namespace}.${scope.clan}.<group>.<id>`,\n );\n }\n\n let segments = [...parsed.segments];\n\n if (segments[0] === scope.namespace) {\n segments = segments.slice(1);\n if (segments[0] === scope.clan) {\n segments = segments.slice(1);\n } else if (segments[0] !== undefined && context.knownClans.has(segments[0])) {\n throw new CliffScopeMismatchError(\n parsed.raw,\n scope,\n `${scope.namespace}.${scope.clan}.<group>.<id>`,\n );\n }\n } else if (\n segments[0] !== undefined &&\n context.knownNamespaces.has(segments[0]) &&\n segments[0] !== scope.namespace\n ) {\n throw new CliffScopeMismatchError(\n parsed.raw,\n scope,\n `${scope.namespace}.${scope.clan}.<group>.<id>`,\n );\n }\n\n if (segments[0] === scope.clan) {\n segments = segments.slice(1);\n } else if (\n segments[0] !== undefined &&\n context.knownClans.has(segments[0]) &&\n segments[0] !== scope.clan\n ) {\n throw new CliffScopeMismatchError(\n parsed.raw,\n scope,\n `${scope.namespace}.${scope.clan}.<group>.<id>`,\n );\n }\n\n if (segments.length === 0) {\n throw new CliffScopeError(`entry ID \"${parsed.raw}\" has no entry id`);\n }\n\n const id = segments[segments.length - 1] as string;\n if (!isName(id)) {\n throw new CliffScopeError(`entry id \"${id}\" is not a valid CLIFF name`);\n }\n const groupSegments = segments.slice(0, -1);\n let group =\n groupSegments.length > 0\n ? groupSegments.join(\".\")\n : scope.group && scope.group.length > 0\n ? scope.group\n : context.defaultGroup;\n if (scope.group !== undefined && scope.group.length > 0 && groupSegments.length > 0) {\n group = `${scope.group}.${groupSegments.join(\".\")}`;\n }\n if (group.length === 0) group = context.defaultGroup;\n validateGroup(group);\n\n return {\n namespace: scope.namespace,\n clan: scope.clan,\n group,\n id,\n canonical: joinCanonical(scope.namespace, scope.clan, group, id),\n exists: false,\n };\n}\n\nfunction resolveObjectEntryId(\n input: NonNullable<Exclude<EntryIdInput, string>>,\n scope: TranslationScope,\n context: EntryIdCatalogContext,\n): ResolvedEntryId {\n const namespace = input.namespace ?? scope.namespace;\n const clan = input.clan ?? scope.clan;\n const group =\n input.group && input.group.length > 0\n ? input.group\n : scope.group && scope.group.length > 0\n ? scope.group\n : context.defaultGroup;\n if (namespace !== scope.namespace || clan !== scope.clan) {\n throw new CliffScopeMismatchError(\n input.id,\n scope,\n `${scope.namespace}.${scope.clan}.<group>.<id>`,\n );\n }\n if (!isName(input.id)) {\n throw new CliffScopeError(`entry id \"${input.id}\" is not a valid CLIFF name`);\n }\n validateGroup(group);\n const canonical = joinCanonical(namespace, clan, group, input.id);\n const record = context.recordForCanonical(canonical);\n if (record !== undefined) return partsOfRecord(record);\n return {\n namespace,\n clan,\n group,\n id: input.id,\n canonical,\n exists: context.hasCanonical(canonical),\n };\n}\n\nexport function resolveEntryId(\n input: EntryIdInput,\n scope: TranslationScope,\n context: EntryIdCatalogContext,\n strictEntryIds = true,\n): ResolvedEntryId {\n assertScope(scope);\n\n if (typeof input !== \"string\") {\n return resolveObjectEntryId(input, scope, context);\n }\n\n const raw = applyAlias(input, context.aliases);\n const parsed = parseStringEntryId(raw);\n if (parsed.namespace !== undefined && parsed.namespace !== scope.namespace) {\n throw new CliffScopeMismatchError(raw, scope, `${scope.namespace}.${scope.clan}.<group>.<id>`);\n }\n\n const exact = new Map<string, MessageRecord>();\n const mismatched = new Map<string, MessageRecord>();\n for (const candidate of candidateEntryIds(parsed, scope)) {\n const record = context.recordForCanonical(candidate);\n if (record === undefined) continue;\n if (record.namespace !== scope.namespace || record.clan !== scope.clan) {\n mismatched.set(record.canonical, record);\n } else {\n exact.set(record.canonical, record);\n }\n }\n if (exact.size > 0) {\n return partsOfRecord([...exact.values()][0] as MessageRecord);\n }\n if (mismatched.size > 0) {\n throw new CliffScopeMismatchError(raw, scope, `${scope.namespace}.${scope.clan}.<group>.<id>`);\n }\n\n const suffix = parsed.segments.join(\".\");\n const suffixRecords = new Map<string, MessageRecord>();\n for (const canonical of context.suffixMatches(suffix)) {\n const record = context.recordForCanonical(canonical);\n if (record !== undefined) suffixRecords.set(record.canonical, record);\n }\n const inScope = [...suffixRecords.values()].filter(\n (record) => record.namespace === scope.namespace && record.clan === scope.clan,\n );\n if (inScope.length === 1) {\n return partsOfRecord(inScope[0] as MessageRecord);\n }\n if (inScope.length > 1) {\n const candidates = inScope.map((record) => record.canonical).sort();\n if (strictEntryIds) {\n throw new CliffAmbiguousEntryError(raw, candidates);\n }\n const chosen = chooseByGroup(inScope, scope);\n return {\n ...partsOfRecord(chosen),\n ambiguous: true,\n candidates,\n };\n }\n if (suffixRecords.size > 0) {\n throw new CliffScopeMismatchError(raw, scope, `${scope.namespace}.${scope.clan}.<group>.<id>`);\n }\n\n return parseAuthoringEntryId(parsed, scope, context);\n}\n","import { mf1ToMessage } from \"@messageformat/icu-messageformat-1\";\nimport { MessageFormat } from \"messageformat\";\nimport { analyzePlain, detectDialect } from \"./detect.js\";\nimport type {\n IcuAnalysis,\n IcuError,\n IcuFormatOptions,\n IcuFormatResult,\n IcuPartsResult,\n IcuRuntime,\n MessagePart,\n} from \"./types.js\";\n\ninterface Formatter {\n format(values: Record<string, unknown>, onError?: (error: unknown) => void): string;\n formatToParts(\n values: Record<string, unknown>,\n onError?: (error: unknown) => void,\n ): readonly unknown[];\n}\n\ntype Compiled = { kind: \"plain\"; text: string } | { kind: \"message\"; formatter: Formatter };\n\nfunction toIcuError(error: unknown): IcuError {\n if (typeof error === \"object\" && error !== null) {\n const record = error as Record<string, unknown>;\n return {\n type: String(record.type ?? \"error\"),\n message: String(record.message ?? error),\n ...(typeof record.source === \"string\" ? { source: record.source } : {}),\n };\n }\n return { type: \"error\", message: String(error) };\n}\n\nfunction compile(message: string, locale: string): Compiled {\n const dialect = detectDialect(message);\n if (dialect === \"plain\") return { kind: \"plain\", text: message };\n const formatter =\n dialect === \"mf1\"\n ? (mf1ToMessage(locale, message) as unknown as Formatter)\n : (new MessageFormat(locale, message) as unknown as Formatter);\n return { kind: \"message\", formatter };\n}\n\nfunction formatNestedParts(parts: readonly unknown[]): string {\n return normalizeParts(parts)\n .filter((part) => part.type !== \"markup\")\n .map((part) => (part.type === \"literal\" ? part.value : part.value))\n .join(\"\");\n}\n\nfunction normalizeParts(parts: readonly unknown[]): MessagePart[] {\n const normalized: MessagePart[] = [];\n for (const raw of parts) {\n if (typeof raw !== \"object\" || raw === null) continue;\n const part = raw as Record<string, unknown>;\n const type = String(part.type ?? \"\");\n if (type === \"literal\" || type === \"text\") {\n normalized.push({ type: \"literal\", value: String(part.value ?? \"\") });\n continue;\n }\n if (type === \"bidiIsolation\") continue;\n if (type === \"markup\") {\n const kind = String(part.kind ?? \"standalone\");\n normalized.push({\n type: \"markup\",\n kind: kind === \"open\" || kind === \"close\" ? kind : \"standalone\",\n name: String(part.name ?? \"\"),\n source: String(part.source ?? \"\"),\n });\n continue;\n }\n const nested = Array.isArray(part.parts)\n ? formatNestedParts(part.parts)\n : typeof part.value === \"string\"\n ? part.value\n : String(part.value ?? \"\");\n normalized.push({\n type: \"expression\",\n source: String(part.source ?? \"\"),\n value: nested,\n ...(typeof part.locale === \"string\" ? { locale: part.locale } : {}),\n });\n }\n return normalized;\n}\n\nexport function createFullIcu(): IcuRuntime {\n const cache = new Map<string, Compiled | { kind: \"error\"; error: IcuError }>();\n\n const get = (message: string, locale: string): Compiled | { kind: \"error\"; error: IcuError } => {\n const cacheKey = `${locale}\\u0000${message}`;\n const cached = cache.get(cacheKey);\n if (cached !== undefined) return cached;\n try {\n const compiled = compile(message, locale);\n cache.set(cacheKey, compiled);\n return compiled;\n } catch (error) {\n const failed = { kind: \"error\" as const, error: toIcuError(error) };\n cache.set(cacheKey, failed);\n return failed;\n }\n };\n\n const formatResult = (\n message: string,\n locale: string,\n values: Record<string, unknown>,\n _options: IcuFormatOptions = {},\n ): IcuFormatResult => {\n const compiled = get(message, locale);\n if (compiled.kind === \"error\") return { text: message, errors: [compiled.error] };\n if (compiled.kind === \"plain\") return { text: compiled.text, errors: [] };\n\n const errors: IcuError[] = [];\n try {\n const parts = compiled.formatter.formatToParts(values, (error) => {\n errors.push(toIcuError(error));\n });\n const text = normalizeParts(parts)\n .filter((part) => part.type !== \"markup\")\n .map((part) => (part.type === \"literal\" ? part.value : part.value))\n .join(\"\");\n return { text, errors };\n } catch (error) {\n const fallbackErrors = [toIcuError(error)];\n try {\n const text = compiled.formatter.format(values, (runtimeError) => {\n fallbackErrors.push(toIcuError(runtimeError));\n });\n return { text: String(text), errors: fallbackErrors };\n } catch (fallbackError) {\n fallbackErrors.push(toIcuError(fallbackError));\n return { text: message, errors: fallbackErrors };\n }\n }\n };\n\n return {\n format(message, locale, values, options) {\n return formatResult(message, locale, values, options);\n },\n formatToParts(message, locale, values, _options): IcuPartsResult {\n const compiled = get(message, locale);\n if (compiled.kind === \"error\") {\n return {\n parts: [{ type: \"literal\", value: message }],\n errors: [compiled.error],\n };\n }\n if (compiled.kind === \"plain\") {\n return { parts: [{ type: \"literal\", value: compiled.text }], errors: [] };\n }\n const errors: IcuError[] = [];\n try {\n const parts = compiled.formatter.formatToParts(values, (error) => {\n errors.push(toIcuError(error));\n });\n return { parts: normalizeParts(parts), errors };\n } catch (error) {\n return {\n parts: [{ type: \"literal\", value: message }],\n errors: [toIcuError(error)],\n };\n }\n },\n analyze(message): IcuAnalysis {\n const dialect = detectDialect(message);\n const errors: IcuError[] = [];\n if (dialect !== \"plain\") {\n const compiled = get(message, \"en\");\n if (compiled.kind === \"error\") errors.push(compiled.error);\n }\n return analyzePlain(message, dialect, errors);\n },\n };\n}\n","import type { IcuAnalysis, IcuDialect } from \"./types.js\";\n\nconst MF2_DIRECTIVE_RE = /(^|[\\s.])\\.(input|local|match)\\b/;\nconst MF2_VARIABLE_RE = /\\{\\s*\\$[A-Za-z_]/;\nconst MF2_MARKUP_RE = /\\{[#/][A-Za-z]/;\nconst MF1_TYPE_RE =\n /\\{\\s*[A-Za-z_][A-Za-z0-9_-]*\\s*,\\s*(plural|select|selectordinal|number|date|time)\\b/;\n\nexport function detectDialect(message: string): IcuDialect {\n if (\n MF2_DIRECTIVE_RE.test(message) ||\n MF2_VARIABLE_RE.test(message) ||\n MF2_MARKUP_RE.test(message)\n ) {\n return \"mf2\";\n }\n if (MF1_TYPE_RE.test(message)) return \"mf1\";\n if (message.includes(\"{{\") || message.includes(\"}}\")) return \"mf2\";\n if (message.includes(\"{\") || message.includes(\"}\")) return \"mf1\";\n return \"plain\";\n}\n\nexport function argumentNames(message: string, dialect: IcuDialect): string[] {\n const names: string[] = [];\n const seen = new Set<string>();\n const add = (name: string): void => {\n if (!seen.has(name)) {\n seen.add(name);\n names.push(name);\n }\n };\n if (dialect === \"mf2\") {\n for (const match of message.matchAll(/\\{\\s*\\$([A-Za-z_][A-Za-z0-9_-]*)/g)) {\n if (match[1] !== undefined) add(match[1]);\n }\n return names;\n }\n for (const match of message.matchAll(/\\{\\s*([A-Za-z_][A-Za-z0-9_-]*)\\s*[,}]/g)) {\n if (match[1] !== undefined) add(match[1]);\n }\n return names;\n}\n\nexport function analyzePlain(\n message: string,\n dialect: IcuDialect,\n errors: IcuAnalysis[\"errors\"] = [],\n): IcuAnalysis {\n return { dialect, arguments: argumentNames(message, dialect), errors };\n}\n","import { createI18nEngine } from \"./engine.js\";\nimport { createFullIcu } from \"./icu/full.js\";\nimport type { I18n, I18nOptions } from \"./types.js\";\n\nexport function createI18n<EntryIds extends string = string>(options: I18nOptions): I18n<EntryIds> {\n return createI18nEngine<EntryIds>(options, options.icu ?? createFullIcu());\n}\n","import { analyzePlain, detectDialect } from \"./detect.js\";\nimport type { IcuAnalysis, IcuError, IcuRuntime, MessagePart } from \"./types.js\";\n\nconst SIMPLE_MESSAGE = /^[^{}]*(?:\\{[A-Za-z_][A-Za-z0-9_]*\\}[^{}]*)*$/;\nconst SIMPLE_ARGUMENT = /\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\n\nfunction unsupported(message: string): IcuError {\n return {\n type: \"icu-unsupported\",\n message:\n \"the lite ICU runtime does not format plural/select/number/date messages; use @cliff-format/i18n instead\",\n source: message,\n };\n}\n\nfunction simpleParts(message: string, values: Record<string, unknown>): MessagePart[] {\n const parts: MessagePart[] = [];\n let cursor = 0;\n for (const match of message.matchAll(SIMPLE_ARGUMENT)) {\n const index = match.index ?? 0;\n if (index > cursor) parts.push({ type: \"literal\", value: message.slice(cursor, index) });\n const name = match[1] as string;\n const value = values[name];\n parts.push({\n type: \"expression\",\n source: `{${name}}`,\n value: value === undefined ? `{${name}}` : String(value),\n });\n cursor = index + match[0].length;\n }\n if (cursor < message.length) parts.push({ type: \"literal\", value: message.slice(cursor) });\n if (parts.length === 0 && message.length > 0) parts.push({ type: \"literal\", value: message });\n return parts;\n}\n\nexport function createLiteIcu(): IcuRuntime {\n return {\n format(message, _locale, values) {\n const dialect = detectDialect(message);\n if (dialect === \"plain\") return { text: message, errors: [] };\n if (!SIMPLE_MESSAGE.test(message)) {\n return { text: message, errors: [unsupported(message)] };\n }\n const errors: IcuError[] = [];\n const text = message.replace(SIMPLE_ARGUMENT, (whole, name: string) => {\n const value = values[name];\n if (value === undefined) {\n errors.push({\n type: \"unresolved-var\",\n message: `missing ICU argument \"${name}\"`,\n source: whole,\n });\n return whole;\n }\n return String(value);\n });\n return { text, errors };\n },\n formatToParts(message, _locale, values) {\n const dialect = detectDialect(message);\n if (dialect === \"plain\") {\n return { parts: [{ type: \"literal\", value: message }], errors: [] };\n }\n if (!SIMPLE_MESSAGE.test(message)) {\n return {\n parts: [{ type: \"literal\", value: message }],\n errors: [unsupported(message)],\n };\n }\n return { parts: simpleParts(message, values), errors: [] };\n },\n analyze(message): IcuAnalysis {\n const dialect = detectDialect(message);\n const errors: IcuError[] = [];\n if (dialect !== \"plain\" && !SIMPLE_MESSAGE.test(message)) {\n errors.push(unsupported(message));\n }\n return analyzePlain(message, dialect, errors);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,eASO;;;ACTP,IAAAC,eAMO;;;ACJA,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YAAY,SAAiB,SAA+B;AAC1D,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,eAAe;AAAA,EACzC;AAAA,EAET,YAAY,SAAiB,QAAmC,CAAC,GAAG;AAClE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AACF;AAEO,IAAM,0BAAN,cAAsC,gBAAgB;AAAA,EAClD;AAAA,EAET,YAAY,SAAiB,OAAyB,UAAkB;AACtE;AAAA,MACE,aAAa,OAAO,wCAAwC,MAAM,SAAS,IAAI,MAAM,IAAI,eAAe,QAAQ;AAAA,MAChH;AAAA,IACF;AACA,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;AAEO,IAAM,yBAAN,cAAqC,eAAe;AAAA,EAChD;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,QAAgB;AAC3C,UAAM,wBAAwB,OAAO,iBAAiB,MAAM,GAAG;AAC/D,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,2BAAN,cAAuC,eAAe;AAAA,EAClD;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,YAA+B;AAC1D,UAAM,0BAA0B,OAAO,kBAAkB,WAAW,KAAK,IAAI,CAAC,EAAE;AAChF,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,aAAa;AAAA,EACpB;AACF;AAEO,IAAM,2BAAN,cAAuC,eAAe;AAAA,EAClD;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,QAAgB;AAC3C,UAAM,uCAAuC,OAAO,iBAAiB,MAAM,GAAG;AAC9E,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,4BAAN,cAAwC,eAAe;AAAA,EACnD;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,QAA2B,SAAS,IAAI;AACnE;AAAA,MACE,SAAS,OAAO,mCAAmC,OAAO,WAAW,IAAI,KAAK,GAAG,IAAI,OAClF,IAAI,CAAC,UAAU,IAAI,KAAK,GAAG,EAC3B,KAAK,IAAI,CAAC,GAAG,SAAS,OAAO,SAAS,EAAE;AAAA,IAC7C;AACA,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,gBAAN,cAA4B,eAAe;AAAA,EACvC;AAAA,EAET,YAAY,aAAqB,QAAgB;AAC/C,UAAM,wBAAwB,MAAM,EAAE;AACtC,SAAK,OAAO;AACZ,SAAK,cAAc;AAAA,EACrB;AACF;;;AClFO,IAAM,OAAO;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,qBAAqB;AACvB;AAIO,IAAM,UAAU;AAAA,EACrB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AACb;AAIO,IAAM,SAAS;AAAA,EACpB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AACT;AAIO,IAAM,UAAU;AAAA,EACrB,UAAU;AAAA,EACV,UAAU;AACZ;AAIO,IAAM,eAAe,CAAC,WAAW,cAAc,YAAY,OAAO;;;ACrFzE,kBAAmE;AAG5D,SAAS,UAAU,OAAiC;AACzD,SAAO,sBAAU,IAAI,KAAK;AAC5B;AAEO,SAAS,aAAa,OAAoC;AAC/D,SAAO,yBAAa,IAAI,KAAK;AAC/B;AAEO,SAAS,YAAY,OAAmC;AAC7D,SAAO,wBAAY,IAAI,KAAK;AAC9B;AAEO,SAAS,aAAa,OAAoC;AAC/D,SAAO,yBAAa,IAAI,KAAK;AAC/B;AAEO,SAAS,cAAc,OAAwB;AACpD,MAAI,CAAC,UAAU,KAAK,GAAG;AACrB,UAAM,IAAI,UAAU,2BAA2B,KAAK,GAAG;AAAA,EACzD;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAA2B;AAC1D,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,UAAM,IAAI,UAAU,8BAA8B,KAAK,GAAG;AAAA,EAC5D;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAA0B;AACxD,MAAI,CAAC,YAAY,KAAK,GAAG;AACvB,UAAM,IAAI,UAAU,6BAA6B,KAAK,GAAG;AAAA,EAC3D;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAA2B;AAC1D,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,UAAM,IAAI,UAAU,8BAA8B,KAAK,GAAG;AAAA,EAC5D;AACA,SAAO;AACT;;;ACzCO,IAAM,qBAA8D;AAAA,EACzE,SAAS,CAAC,YAAY;AAAA,EACtB,YAAY,CAAC,YAAY,YAAY;AAAA,EACrC,UAAU,CAAC,SAAS,YAAY;AAAA,EAChC,OAAO,CAAC,YAAY;AACtB;AAEO,SAAS,SAAS,OAA8B;AACrD,QAAM,QAAQ,MAAM,UAAU;AAC9B,SAAO,YAAY,KAAK,IAAI,QAAQ;AACtC;AAEO,SAAS,oBAAoB,MAAiB,IAAwB;AAC3E,SAAO,mBAAmB,IAAI,EAAE,SAAS,EAAE;AAC7C;AAaO,SAAS,qBAAqB,OAAmB,WAA0B,CAAC,GAAc;AAC/F,MAAI,SAAS,aAAa,OAAW,QAAO,SAAS;AACrD,QAAM,UAAU,SAAS,KAAK;AAC9B,MAAI,MAAM,WAAW,OAAW,QAAO;AACvC,MAAI,YAAY,UAAW,QAAO;AAElC,QAAM,gBAAgB,SAAS,WAAW,UAAa,SAAS,WAAW,MAAM;AACjF,MAAI,cAAe,QAAO;AAE1B,QAAM,gBAAgB,SAAS,WAAW,UAAa,SAAS,WAAW,MAAM;AACjF,MAAI,kBAAkB,YAAY,cAAc,YAAY,UAAU;AACpE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,aAAa,QAAyC;AACpE,SAAO,mBAAmB,MAAM;AAClC;AAEO,SAAS,cAAoC;AAClD,SAAO;AACT;;;AJ1BA,SAAS,iBAAiB,MAAqE;AAC7F,QAAM,MAAoB,CAAC;AAC3B,aAAW,OAAO,MAAM;AACtB,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,iBAAW,QAAQ,IAA8B,KAAI,KAAK,iBAAiB,IAAI,CAAC;AAAA,IAClF,OAAO;AACL,UAAI,KAAK,iBAAiB,GAAiB,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAyB,OAAmC;AAC/E,MAAI,KAAK,WAAW,MAAM,OAAQ,QAAO;AACzC,SAAO,KAAK,MAAM,CAAC,KAAK,UAAU,QAAQ,MAAM,KAAK,CAAC;AACxD;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAiB9B,YACmB,MACA,OACA,cACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAHgB;AAAA,EACA;AAAA,EACA;AAAA,EAnBX;AAAA,EACA,eAAuB,CAAC;AAAA,EACxB;AAAA,EACA,eAAuB,CAAC;AAAA,EACxB,cAAsB,CAAC;AAAA,EACvB;AAAA,EACA,cAAc;AAAA,EACd,cAA4B,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAA2B,CAAC;AAAA,EAC5B;AAAA,EACA,eAAuC,CAAC;AAAA,EACxC;AAAA,EAQR,OAAO,MAAc,SAAiB,CAAC,GAAuB;AAC5D,QAAI,OAAO,SAAS,SAAU,OAAM,IAAI,UAAU,8BAA8B;AAChF,SAAK,aAAa;AAClB,SAAK,eAAe,EAAE,GAAG,KAAK,cAAc,GAAG,OAAO;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,KAAkC;AACrC,SAAK,UAAU,cAAc,GAAG;AAChC,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,gBAAoC;AAClC,QAAI,KAAK,eAAe,QAAW;AACjC,YAAM,IAAI,eAAe,iDAAiD;AAAA,IAC5E;AACA,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,IAAI,eAAe,+CAA+C;AAAA,IAC1E;AACA,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,MAA2E;AACpF,SAAK,cAAc,iBAAiB,IAAI;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAkC;AACxC,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,OAAmC;AAC1C,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AAC1C,YAAM,IAAI,UAAU,sCAAsC;AAAA,IAC5D;AACA,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,OAAqC;AAChD,SAAK,iBAAiB,CAAC,GAAG,KAAK,gBAAgB,GAAG,KAAK;AACvD,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,MAAkC;AACzC,SAAK,eAAe;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,MAAc,OAAmC;AACzD,QAAI,CAAC,KAAK,WAAW,IAAI,GAAG;AAC1B,YAAM,IAAI,UAAU,mBAAmB,IAAI,wBAAwB;AAAA,IACrE;AACA,SAAK,aAAa,IAAI,IAAI;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAc,SAAiB,CAAC,GAAuB;AAC5D,SAAK,aAAa;AAClB,SAAK,eAAe,EAAE,GAAG,KAAK,cAAc,GAAG,OAAO;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,KAAoC;AACzC,SAAK,YAAY,gBAAgB,GAAG;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,KAAiC;AACtC,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAoC;AACzC,SAAK,cAAc,EAAE,GAAG,KAAK,aAAa,GAAG,OAAO;AACpD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAmC;AACvC,SAAK,cAAc,EAAE,GAAG,KAAK,aAAa,OAAO,OAAO,GAAG,MAAM;AACjE,WAAO;AAAA,EACT;AAAA,EAEQ,eAAuB;AAC7B,WAAO,KAAK,kBAAkB,KAAK,KAAK,UAAU;AAAA,EACpD;AAAA,EAEQ,WAA4B;AAClC,WAAO,KAAK,KAAK,QAAQ,KAAK,cAAc,KAAK,KAAK;AAAA,EACxD;AAAA,EAEQ,UAAU,UAAsD;AACtE,WAAO,KAAK,KAAK,UAAU,SAAS,WAAW,KAAK,aAAa,CAAC;AAAA,EACpE;AAAA,EAEQ,aAAa,QAAyB;AAC5C,WAAO;AAAA,MACL,GAAG,KAAK,KAAK;AAAA,MACb,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEQ,SACN,MACA,UACA,SACA,UACM;AACN,SAAK,KAAK,SAAS;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS,SAAS,UAAU;AAAA,MAChE,QAAQ,KAAK,aAAa;AAAA,MAC1B,WAAW,KAAK,MAAM;AAAA,MACtB,MAAM,KAAK,MAAM;AAAA,MACjB,GAAI,KAAK,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,MAAM;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EAEQ,qBAAqB,UAA+C;AAC1E,QAAI,KAAK,YAAY,OAAW,QAAO,KAAK;AAC5C,QAAI,CAAC,KAAK,YAAa,QAAO;AAC9B,UAAM,QAAQ,KAAK,KAChB,WAAW,EACX,UAAU,SAAS,WAAW,SAAS,MAAM,SAAS,KAAK;AAC9D,QAAI,OAAO,SAAS,QAAW;AAC7B,YAAM,IAAI;AAAA,QACR,SAAS;AAAA,QACT,CAAC,MAAM;AAAA,QACP,UAAU,SAAS,KAAK;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,MAAM;AAAA,EACf;AAAA,EAEQ,wBAAwB,UAAiC;AAC/D,QAAI,KAAK,eAAe,OAAW;AACnC,QAAI,KAAK,YAAY,OAAW;AAChC,QAAI,KAAK,aAAa;AACpB,WAAK,qBAAqB,QAAQ;AAClC;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR,SAAS;AAAA,MACT,CAAC,MAAM;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa,UAAqC;AACxD,UAAM,QAAQ,KAAK,KAChB,WAAW,EACX,UAAU,SAAS,WAAW,SAAS,MAAM,SAAS,KAAK;AAC9D,WAAO,OAAO,UAAU,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC;AAAA,EAChD;AAAA,EAEQ,2BACN,UACAC,gBACM;AACN,UAAM,cAAc,KAAK,KAAK;AAC9B,QAAI,gBAAgB,MAAO;AAC3B,QAAI,KAAK,YAAY,SAAS,EAAG;AACjC,UAAM,eAAe,KAAK,aAAa,QAAQ;AAC/C,QAAI,aAAa,SAAS,EAAG;AAC7B,QAAI,gBAAgB,MAAM;AACxB,YAAM,IAAI;AAAA,QACR,SAAS;AAAA,QACT,CAAC,SAAS;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,QAAIA,mBAAkB,UAAa,YAAY,SAASA,cAAwB,GAAG;AACjF,YAAM,IAAI;AAAA,QACR,SAAS;AAAA,QACT,CAAC,SAAS;AAAA,QACV,yDAAyDA,cAAa;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,UAA0C;AAC5D,UAAM,iBAAiB,KAAK,KAAK,kBAAkB;AACnD,UAAM,iBAAiB,KAAK,aAAa;AACzC,UAAMA,iBAAgB,KAAK,qBAAqB,QAAQ;AACxD,SAAK,2BAA2B,UAAUA,cAAa;AACvD,UAAM,SACJ,KAAK,cAAc,KAAK,eAAe,SAAY,YAAY;AACjE,QAAI,WAAW,aAAa,KAAK,eAAe,QAAW;AACzD,YAAM,IAAI;AAAA,QACR,SAAS;AAAA,QACT,CAAC,QAAQ;AAAA,QACT,WAAW,MAAM;AAAA,MACnB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,KAAK,WAAW,EAAE;AAAA,MACpC;AAAA,QACE,WAAW,SAAS;AAAA,QACpB,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,IAAI,SAAS;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE,GAAI,KAAK,eAAe,SAAY,CAAC,IAAI,EAAE,QAAQ,KAAK,WAAW;AAAA,QACnE,GAAI,KAAK,eAAe,SAAY,CAAC,IAAI,EAAE,QAAQ,KAAK,WAAW;AAAA,QACnE,GAAI,KAAK,YAAY,SAAY,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ;AAAA,QAC3D,SAAS,KAAK;AAAA,QACd;AAAA,QACA,GAAI,KAAK,gBAAgB,SAAY,CAAC,IAAI,EAAE,SAAS,KAAK,YAAY;AAAA,QACtE,GAAI,KAAK,kBAAkB,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,cAAc;AAAA,QAC3E,GAAI,KAAK,eAAe,WAAW,IAAI,CAAC,IAAI,EAAE,WAAW,KAAK,eAAe;AAAA,QAC7E,GAAI,KAAK,iBAAiB,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,aAAa;AAAA,QACzE,GAAI,OAAO,KAAK,KAAK,YAAY,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,YAAY,KAAK,aAAa;AAAA,MACzF;AAAA,IACF;AACA,SAAK,SAAS,iBAAiB,QAAQ,wBAAwB,SAAS,SAAS,KAAK,QAAQ;AAC9F,WAAO;AAAA,EACT;AAAA,EAEQ,WACN,MACA,UACA,UACA,QACM;AACN,UAAM,SAAS,KAAK,KAAK;AACzB,QAAI,WAAW,MAAO;AACtB,UAAM,YAAQ,2BAAa,IAAI;AAC/B,QAAI,SAAS,SAAU;AACvB,UAAM,UAAU,0BAA0B,KAAK,4BAA4B,QAAQ,SAAS,SAAS,SAAS,SAAS,MAAM;AAC7H,QAAI,WAAW,SAAS;AACtB,WAAK,SAAS,kBAAkB,SAAS,SAAS,QAAQ;AAC1D,YAAM,IAAI,eAAe,OAAO;AAAA,IAClC;AACA,SAAK,SAAS,kBAAkB,WAAW,SAAS,QAAQ;AAAA,EAC9D;AAAA,EAcQ,aACN,QACA,UACA,QACA,OACwB;AACxB,UAAM,SAAS,KAAK,cAAc,OAAO;AACzC,UAAM,WAAW,UAAU,OAAO;AAClC,UAAM,eAAe,WAAW,SAAY,OAAO,SAAS,OAAO;AACnE,UAAM,SAAS,KAAK,aAAa,MAAM;AACvC,UAAM,WAAW,KAAK,iBAAiB,OAAO;AAC9C,QAAI,OAAO;AACT,YAAM,SAAS,KAAK,KAAK,cAAc,UAAU,QAAQ,EAAE,QAAQ,aAAa,CAAC;AACjF,UAAI,aAAa,QAAW;AAC1B,cAAMC,QAAO,OACV,OAAO,CAAC,SAAS,KAAK,SAAS,QAAQ,EACvC,IAAI,CAAC,SAAU,KAAK,SAAS,YAAY,KAAK,QAAQ,KAAK,KAAM,EACjE,KAAK,EAAE;AACV,aAAK,WAAWA,OAAM,UAAU,UAAU,YAAY;AAAA,MACxD;AACA,aAAO;AAAA,IACT;AACA,UAAM,OAAO,KAAK,KAAK,OAAO,UAAU,QAAQ,EAAE,QAAQ,aAAa,CAAC;AACxE,QAAI,aAAa,OAAW,MAAK,WAAW,MAAM,UAAU,UAAU,YAAY;AAClF,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,QAAuB,UAAiC;AACrF,QAAI,KAAK,eAAe,UAAa,KAAK,eAAe,OAAO,QAAQ;AACtE,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,wDAAwD,OAAO,MAAM;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,YAAY,UAAa,OAAO,SAAS,KAAK,SAAS;AAC9D,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,kBAAkB,OAAO,QAAQ,EAAE,WAAW,KAAK,OAAO;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,YAAY,SAAS,KAAK,CAAC,YAAY,KAAK,aAAa,OAAO,OAAO,GAAG;AACjF,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,qBAAqB,OAAO,QAAQ,KAAK,IAAI,CAAC,WAAW,KAAK,YAAY,KAAK,IAAI,CAAC;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,QAAQ,UAAmC;AACjD,UAAM,UAAU,wBAAwB,SAAS,SAAS,iBAAiB,KAAK,aAAa,CAAC;AAC9F,SAAK,SAAS,iBAAiB,WAAW,SAAS,QAAQ;AAC3D,UAAM,WAAW,KAAK,KAAK;AAC3B,QAAI,aAAa,SAAS;AACxB,YAAM,IAAI,uBAAuB,SAAS,WAAW,KAAK,aAAa,CAAC;AAAA,IAC1E;AACA,QAAI,aAAa,QAAS,QAAO;AACjC,QAAI,aAAa,SAAU,QAAO,KAAK,cAAc;AACrD,QAAI,OAAO,KAAK,iBAAiB,SAAU,QAAO,KAAK;AACvD,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,OAAO,QAAyB;AAC9B,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,SAAS,KAAK,UAAU,QAAQ;AACtC,QAAI,KAAK,eAAe,QAAW;AACjC,UAAI,WAAW,OAAW,QAAO,KAAK,QAAQ,QAAQ;AACtD,WAAK,uBAAuB,QAAQ,QAAQ;AAC5C,aAAO,KAAK,aAAa,QAAQ,UAAU,QAAQ,KAAK;AAAA,IAC1D;AACA,SAAK,wBAAwB,QAAQ;AACrC,QAAI,WAAW,QAAW;AACxB,WAAK,uBAAuB,QAAQ,QAAQ;AAC5C,aAAO,KAAK,aAAa,QAAQ,UAAU,QAAQ,KAAK;AAAA,IAC1D;AACA,UAAM,QAAQ,KAAK,YAAY,QAAQ;AACvC,WAAO,KAAK,aAAa,OAAO,UAAU,QAAQ,KAAK;AAAA,EACzD;AAAA,EAEA,cAAc,QAAgC;AAC5C,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,SAAS,KAAK,UAAU,QAAQ;AACtC,QAAI,KAAK,eAAe,QAAW;AACjC,UAAI,WAAW,QAAW;AACxB,cAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,eAAO,CAAC,EAAE,MAAM,WAAW,OAAO,KAAK,CAAC;AAAA,MAC1C;AACA,WAAK,uBAAuB,QAAQ,QAAQ;AAC5C,aAAO,KAAK,aAAa,QAAQ,UAAU,QAAQ,IAAI;AAAA,IACzD;AACA,SAAK,wBAAwB,QAAQ;AACrC,QAAI,WAAW,QAAW;AACxB,WAAK,uBAAuB,QAAQ,QAAQ;AAC5C,aAAO,KAAK,aAAa,QAAQ,UAAU,QAAQ,IAAI;AAAA,IACzD;AACA,UAAM,QAAQ,KAAK,YAAY,QAAQ;AACvC,WAAO,KAAK,aAAa,OAAO,UAAU,QAAQ,IAAI;AAAA,EACxD;AAAA,EAEA,OAAwB;AACtB,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,SAAS,KAAK,UAAU,QAAQ;AACtC,UAAM,SAAS,KAAK,cAAc,QAAQ,UAAU;AACpD,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,UAAM,OAAO,KAAK,WAAW,QAAQ;AACrC,UAAM,UAAU,KAAK,YAAY,SAAS,IAAI,CAAC,GAAG,KAAK,WAAW,IAAK,QAAQ,WAAW,CAAC;AAC3F,UAAM,SAAS,KAAK,aAAa,QAAQ;AACzC,UAAM,UAAU,KAAK,eAAe,QAAQ;AAC5C,UAAM,WAAW,KAAK,iBAAiB,QAAQ;AAC/C,UAAM,YACJ,KAAK,eAAe,SAAS,IAAI,CAAC,GAAG,KAAK,cAAc,IAAK,QAAQ,aAAa,CAAC;AACrF,UAAM,WAAW,KAAK,gBAAgB,QAAQ;AAC9C,WAAO;AAAA,MACL,SAAS,SAAS;AAAA,MAClB,WAAW,SAAS;AAAA,MACpB,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,IAAI,SAAS;AAAA,MACb,QAAQ,KAAK,aAAa;AAAA,MAC1B,gBAAgB,QAAQ,kBAAkB,KAAK,KAAK,kBAAkB;AAAA,MACtE,gBAAgB,QAAQ,UAAU,KAAK,aAAa;AAAA,MACpD,SAAS,QAAQ,WAAW;AAAA,MAC5B;AAAA,MACA,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,MACzC,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,MACrC;AAAA,MACA,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,MACzC,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC3C,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,MAC7C;AAAA,MACA,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,MAC7C,YAAY,QAAQ,cAAc,EAAE,GAAG,KAAK,aAAa;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,QAAgC;AAC9B,UAAM,WAAW,KAAK,SAAS;AAC/B,WAAO,KAAK,UAAU,QAAQ,GAAG;AAAA,EACnC;AAAA,EAEA,OAAO,UAAyB,CAAC,GAAuB;AACtD,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,WAAW,KAAK,UAAU,QAAQ;AACxC,QAAI,aAAa,QAAW;AAC1B,WAAK,wBAAwB,QAAQ;AACrC,YAAM,QAAQ,KAAK,YAAY,QAAQ;AACvC,WAAK,iBAAiB,KAAK;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,cAAc,MAAM;AAC9B,WAAK,wBAAwB,QAAQ;AACrC,WAAK,eAAe,QAAQ;AAAA,IAC9B,WAAW,KAAK,eAAe,QAAW;AACxC,YAAM,WAAW;AAAA,QACf,GAAI,SAAS,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,SAAS,MAAM,OAAO;AAAA,QAC/E,GAAI,SAAS,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,SAAS,MAAM,OAAO;AAAA,QAC/E,GAAI,KAAK,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU;AAAA,MACrE;AACA,eAAS,MAAM,SAAS,KAAK;AAC7B,eAAS,MAAM,SAAS,qBAAqB,SAAS,OAAO,QAAQ;AAAA,IACvE,OAAO;AACL,WAAK,wBAAwB,QAAQ;AAAA,IACvC;AACA,SAAK,iBAAiB,QAAQ;AAC9B,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,QAA6B;AAClD,UAAM,QAAQ,OAAO;AACrB,UAAM,WAAW;AAAA,MACf,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,MAC7D,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,MAC7D,GAAI,KAAK,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU;AAAA,IACrE;AACA,QAAI,KAAK,eAAe,OAAW,OAAM,SAAS,KAAK;AACvD,QAAI,KAAK,eAAe,OAAW,OAAM,SAAS,KAAK;AACvD,QAAI,KAAK,YAAY,OAAW,OAAM,OAAO,KAAK;AAClD,QAAI,KAAK,YAAY,SAAS,EAAG,OAAM,UAAU,CAAC,GAAG,KAAK,WAAW;AACrE,QAAI,KAAK,gBAAgB,OAAW,OAAM,UAAU,KAAK;AACzD,QAAI,KAAK,kBAAkB,OAAW,OAAM,WAAW,KAAK;AAC5D,QAAI,KAAK,eAAe,SAAS,EAAG,OAAM,YAAY,CAAC,GAAG,KAAK,cAAc;AAC7E,QAAI,KAAK,iBAAiB,OAAW,OAAM,WAAW,KAAK;AAC3D,QAAI,OAAO,KAAK,KAAK,YAAY,EAAE,SAAS,GAAG;AAC7C,YAAM,aAAa,EAAE,GAAG,MAAM,YAAY,GAAG,KAAK,aAAa;AAAA,IACjE;AACA,UAAM,SAAS,qBAAqB,OAAO,QAAQ;AAAA,EACrD;AAAA,EAEQ,iBAAiB,QAA6B;AACpD,UAAM,aAAS,+BAAiB,OAAO,QAAQ;AAC/C,YAAI,wBAAU,MAAM,GAAG;AACrB,YAAM,IAAI,kCAAqB,QAAQ,OAAO,SAAS,WAAW;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAM,QAAyB;AAC7B,eAAO,2BAAa,KAAK,OAAO,MAAM,CAAC;AAAA,EACzC;AAAA,EAEA,KAAK,QAA0B;AAC7B,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,SAAS,KAAK,UAAU,QAAQ;AACtC,UAAM,WAAW,KAAK,iBAAiB,QAAQ;AAC/C,QAAI,aAAa,OAAW,QAAO;AACnC,WAAO,KAAK,MAAM,MAAM,KAAK;AAAA,EAC/B;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK,OAAO;AAAA,EACrB;AACF;AAEO,SAAS,QACd,MACA,OACqB;AACrB,QAAM,WAAW,CAAC,SAAuB,WAA6C;AACpF,UAAM,UAAU,IAAI,mBAAmB,MAAM,OAAO,OAAO;AAC3D,QAAI,WAAW,QAAW;AACxB,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,OAAO,MAAM,EAAE,OAAO;AAAA,EACvC;AAEA,QAAM,KAAK;AACX,KAAG,SAAS,CAAC,SAAS,WAAW,IAAI,mBAAmB,MAAM,OAAO,OAAO,EAAE,OAAO,MAAM;AAC3F,KAAG,gBAAgB,CAAC,SAAS,WAC3B,IAAI,mBAAmB,MAAM,OAAO,OAAO,EAAE,cAAc,MAAM;AACnE,KAAG,MAAM,CAAC,YAAY;AACpB,UAAM,WAAW,KAAK,QAAQ,SAAS,KAAK;AAC5C,WAAO,SAAS,UAAU,KAAK,UAAU,SAAS,WAAW,KAAK,UAAU,CAAC,MAAM;AAAA,EACrF;AACA,KAAG,QAAQ,CAAC,YAAY;AACtB,UAAM,WAAW,KAAK,QAAQ,SAAS,KAAK;AAC5C,WAAO,KAAK,UAAU,SAAS,WAAW,KAAK,UAAU,CAAC,GAAG;AAAA,EAC/D;AACA,KAAG,OAAO,CAAC,YAAY,IAAI,mBAAmB,MAAM,OAAO,OAAO,EAAE,KAAK;AACzE,KAAG,WAAW,MAAM,KAAK,WAAW,EAAE,SAAS,KAAK;AACpD,SAAO;AACT;;;AK1jBA,IAAAC,eAeO;AAoBP,SAAS,gBAAgB,KAAqB;AAC5C,SAAO,IAAI,YAAY;AACzB;AAEA,SAAS,eAAe,KAAuB;AAC7C,QAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAC7D,QAAM,WAAqB,CAAC;AAC5B,WAAS,SAAS,MAAM,QAAQ,UAAU,GAAG,UAAU;AACrD,aAAS,KAAK,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,GAAG,CAAC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAA+B,QAAgB,WAAyB;AACzF,MAAI,OAAO,WAAW,EAAG;AACzB,QAAM,WAAW,IAAI,IAAI,MAAM;AAC/B,MAAI,aAAa,QAAW;AAC1B,QAAI,IAAI,QAAQ,oBAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AAAA,EACtC,OAAO;AACL,aAAS,IAAI,SAAS;AAAA,EACxB;AACF;AAEA,SAAS,WAAW,UAAyB,OAAmB,OAAkC;AAChG,QAAM,YAAY,SAAS,OAAO;AAClC,QAAM,OAAO,SAAS,OAAO;AAC7B,QAAM,YAAY,MAAM;AACxB,QAAM,gBAAY,0BAAY,WAAW,MAAM,WAAW,MAAM,EAAE;AAClE,QAAM,WAAO,4BAAc,OAAO,KAAK;AACvC,QAAM,cAAU,+BAAiB,OAAO,KAAK;AAC7C,QAAM,eAAW,gCAAkB,OAAO,KAAK;AAC/C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,IAAI,MAAM;AAAA,IACV,QAAQ,SAAS,OAAO;AAAA,IACxB,gBAAgB,SAAS,OAAO;AAAA,IAChC;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,SAAS,SAAS,OAAO;AAAA,IACzB,QAAQ,MAAM,UAAU;AAAA,IACxB,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,IAC7D,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,IACrC,aAAS,+BAAiB,OAAO,KAAK;AAAA,IACtC,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAA,IAC7D,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,IAC3C,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC7C,WAAW,CAAC,GAAG,MAAM,SAAS;AAAA,IAC9B,GAAI,MAAM,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;AAAA,IACnE,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,IAClC,GAAI,SAAS,SAAS,SAAY,CAAC,IAAI,EAAE,UAAU,SAAS,KAAK;AAAA,EACnE;AACF;AAEO,IAAM,UAAN,MAA+C;AAAA,EAC3C;AAAA,EACA;AAAA,EACQ,gBAAiC,CAAC;AAAA,EAClC,WAAW,oBAAI,IAAwC;AAAA,EACvD,cAAc,oBAAI,IAA6B;AAAA,EAC/C,YAAY,oBAAI,IAAyB;AAAA,EACzC,eAAe,oBAAI,IAAY;AAAA,EAC/B,UAAU,oBAAI,IAAY;AAAA,EAC1B,WAAW,oBAAI,IAAY;AAAA,EAC3B,YAAY,oBAAI,IAAY;AAAA,EAC5B,oBAAoB,oBAAI,IAAY;AAAA,EAErD,YAAY,UAA0B,CAAC,GAAG;AACxC,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,UAAU,QAAQ,WAAW,CAAC;AAAA,EACrC;AAAA,EAEA,IAAI,kBAAuC;AACzC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,aAAkC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAsC;AACxC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,kBAAqC;AACvC,WAAO,CAAC,GAAG,KAAK,iBAAiB;AAAA,EACnC;AAAA,EAEA,YAAY,UAA0C;AACpD,UAAM,SAAS,SAAS,OAAO;AAC/B,UAAM,YAAY,gBAAgB,MAAM;AACxC,QAAI,YAAY,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,cAAc,QAAW;AAC3B,kBAAY,oBAAI,IAA2B;AAC3C,WAAK,SAAS,IAAI,WAAW,SAAS;AAAA,IACxC;AAEA,UAAM,QAAyB,CAAC;AAChC,eAAW,SAAS,SAAS,QAAQ;AACnC,iBAAW,SAAS,MAAM,SAAS;AACjC,cAAM,SAAS,WAAW,UAAU,OAAO,KAAK;AAChD,YAAI,UAAU,IAAI,OAAO,SAAS,GAAG;AACnC,gBAAM,IAAI,yBAAyB,OAAO,WAAW,MAAM;AAAA,QAC7D;AACA,aAAK,YAAY,QAAQ,SAAS;AAClC,cAAM,KAAK,MAAM;AAAA,MACnB;AAAA,IACF;AAEA,SAAK,cAAc,KAAK,QAAQ;AAChC,SAAK,aAAa,IAAI,SAAS,OAAO,SAAS;AAC/C,SAAK,QAAQ,IAAI,SAAS,OAAO,IAAI;AACrC,SAAK,UAAU,IAAI,MAAM;AACzB,QAAI,SAAS,OAAO,eAAe,SAAS,GAAG;AAC7C,WAAK,kBAAkB,IAAI,SAAS,OAAO,cAAc;AAAA,IAC3D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SACE,OAQA,OACe;AACf,UAAM,WAAW,KAAK,eAAe,KAAK;AAC1C,QAAI,QAAQ,SAAS,OAAO,KAAK,CAAC,cAAc,UAAU,SAAS,MAAM,KAAK;AAC9E,QAAI,UAAU,QAAW;AACvB,cAAQ;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,CAAC;AAAA,QACV,SAAS,CAAC;AAAA,QACV,gBAAY,+BAAiB;AAAA,MAC/B;AACA,eAAS,OAAO,KAAK,KAAK;AAC1B,WAAK,SAAS,IAAI,MAAM,KAAK;AAAA,IAC/B;AAEA,UAAM,QAAoB;AAAA,MACxB,IAAI,MAAM;AAAA,MACV,MAAM;AAAA,MACN,SAAS,MAAM,UAAU,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC;AAAA,MAC/C,WAAW,MAAM,YAAY,CAAC,GAAG,MAAM,SAAS,IAAI,CAAC;AAAA,MACrD,YAAY,MAAM,aAAa,EAAE,GAAG,MAAM,WAAW,QAAI,+BAAiB;AAAA,IAC5E;AACA,QAAI,MAAM,WAAW,OAAW,OAAM,SAAS,MAAM;AACrD,QAAI,MAAM,WAAW,OAAW,OAAM,SAAS,MAAM;AACrD,QAAI,MAAM,SAAS,OAAW,OAAM,OAAO,MAAM;AACjD,QAAI,MAAM,WAAW,OAAW,OAAM,SAAS,MAAM;AACrD,QAAI,MAAM,YAAY,OAAW,OAAM,UAAU,MAAM;AACvD,QAAI,MAAM,aAAa,OAAW,OAAM,WAAW,MAAM;AACzD,QAAI,MAAM,aAAa,OAAW,OAAM,WAAW,MAAM;AAEzD,UAAM,gBAAY,0BAAY,MAAM,WAAW,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE;AAChF,UAAM,YAAY,KAAK,SAAS,IAAI,gBAAgB,MAAM,cAAc,CAAC;AACzE,QAAI,WAAW,IAAI,SAAS,MAAM,MAAM;AACtC,YAAM,IAAI,yBAAyB,WAAW,MAAM,cAAc;AAAA,IACpE;AAEA,UAAM,QAAQ,KAAK,KAAK;AACxB,UAAM,SAAS,WAAW,UAAU,OAAO,KAAK;AAChD,QAAI,cAAc,QAAW;AAC3B,YAAM,UAAU,oBAAI,IAA2B;AAC/C,WAAK,SAAS,IAAI,gBAAgB,MAAM,cAAc,GAAG,OAAO;AAChE,WAAK,YAAY,QAAQ,OAAO;AAAA,IAClC,OAAO;AACL,WAAK,YAAY,QAAQ,SAAS;AAAA,IACpC;AACA,SAAK,UAAU,IAAI,MAAM,cAAc;AACvC,SAAK,kBAAkB,IAAI,MAAM,cAAc;AAC/C,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,OAOL;AAChB,UAAM,WAAW,KAAK,cAAc;AAAA,MAClC,CAACC,cACCA,UAAS,OAAO,cAAc,MAAM,aACpCA,UAAS,OAAO,SAAS,MAAM,QAC/B,gBAAgBA,UAAS,OAAO,cAAc,MAAM,gBAAgB,MAAM,cAAc;AAAA,IAC5F;AACA,QAAI,aAAa,OAAW,QAAO;AAEnC,UAAM,eAAW,6BAAe,KAAK;AACrC,aAAS,OAAO,YAAY,MAAM;AAClC,aAAS,OAAO,OAAO,MAAM;AAC7B,aAAS,OAAO,iBAAiB,MAAM;AACvC,aAAS,OAAO,iBAAiB,MAAM;AACvC,aAAS,OAAO,UAAU;AAC1B,SAAK,cAAc,KAAK,QAAQ;AAChC,SAAK,aAAa,IAAI,MAAM,SAAS;AACrC,SAAK,QAAQ,IAAI,MAAM,IAAI;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,QAAuB,WAA6C;AACtF,cAAU,IAAI,OAAO,WAAW,MAAM;AACtC,UAAM,WAAW,KAAK,YAAY,IAAI,OAAO,SAAS;AACtD,QAAI,aAAa,QAAW;AAC1B,WAAK,YAAY,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC;AAAA,IACjD,OAAO;AACL,eAAS,KAAK,MAAM;AAAA,IACtB;AACA,SAAK,aAAa,IAAI,OAAO,SAAS;AACtC,SAAK,QAAQ,IAAI,OAAO,IAAI;AAC5B,SAAK,SAAS,IAAI,OAAO,KAAK;AAC9B,cAAU,KAAK,WAAW,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK,IAAI,OAAO,EAAE,IAAI,OAAO,SAAS;AACzF,cAAU,KAAK,WAAW,GAAG,OAAO,KAAK,IAAI,OAAO,EAAE,IAAI,OAAO,SAAS;AAC1E,UAAM,YAAY,OAAO,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE;AAC/C,QAAI,cAAc,QAAW;AAC3B,gBAAU,KAAK,WAAW,GAAG,SAAS,IAAI,OAAO,EAAE,IAAI,OAAO,SAAS;AAAA,IACzE;AACA,cAAU,KAAK,WAAW,OAAO,IAAI,OAAO,SAAS;AAAA,EACvD;AAAA,EAEA,aAAa,WAA4B;AACvC,WAAO,KAAK,YAAY,IAAI,SAAS;AAAA,EACvC;AAAA,EAEA,mBAAmB,WAA8C;AAC/D,WAAO,KAAK,YAAY,IAAI,SAAS,IAAI,CAAC;AAAA,EAC5C;AAAA,EAEA,oBAAoB,WAA6C;AAC/D,WAAO,KAAK,YAAY,IAAI,SAAS,KAAK,CAAC;AAAA,EAC7C;AAAA,EAEA,cAAc,QAAmC;AAC/C,WAAO,CAAC,GAAI,KAAK,UAAU,IAAI,MAAM,KAAK,CAAC,CAAE;AAAA,EAC/C;AAAA,EAEA,OAAO,WAAmB,QAA2C;AACnE,WAAO,KAAK,SAAS,IAAI,gBAAgB,MAAM,CAAC,GAAG,IAAI,SAAS;AAAA,EAClE;AAAA,EAEA,aACE,WACA,aACA,gBAC2B;AAC3B,UAAM,UAAU,KAAK,YAAY,IAAI,SAAS;AAC9C,QAAI,YAAY,OAAW,QAAO;AAClC,eAAW,OAAO,aAAa;AAC7B,YAAM,QAAQ,QAAQ;AAAA,QACpB,CAAC,WAAW,gBAAgB,OAAO,MAAM,MAAM,OAAO,OAAO,WAAW;AAAA,MAC1E;AACA,UAAI,UAAU,OAAW,QAAO;AAAA,IAClC;AACA,eAAW,OAAO,aAAa;AAC7B,YAAM,QAAQ,QAAQ,KAAK,CAAC,WAAW,gBAAgB,OAAO,MAAM,MAAM,GAAG;AAC7E,UAAI,UAAU,OAAW,QAAO;AAAA,IAClC;AACA,QAAI,mBAAmB,QAAW;AAChC,YAAM,QAAQ,QAAQ;AAAA,QACpB,CAAC,WAAW,gBAAgB,OAAO,MAAM,MAAM,gBAAgB,cAAc;AAAA,MAC/E;AACA,UAAI,UAAU,OAAW,QAAO;AAAA,IAClC;AACA,WAAO,QAAQ,CAAC;AAAA,EAClB;AAAA,EAEA,YACE,QACA,YAA+B,CAAC,GAChC,gBACU;AACV,UAAM,OAAiB,CAAC;AACxB,UAAM,MAAM,CAAC,QAAsB;AACjC,iBAAW,WAAW,eAAe,GAAG,GAAG;AACzC,cAAM,aAAa,gBAAgB,OAAO;AAC1C,YAAI,WAAW,SAAS,KAAK,CAAC,KAAK,SAAS,UAAU,EAAG,MAAK,KAAK,UAAU;AAAA,MAC/E;AAAA,IACF;AACA,QAAI,MAAM;AACV,eAAW,YAAY,UAAW,KAAI,QAAQ;AAC9C,QAAI,mBAAmB,OAAW,KAAI,cAAc;AACpD,WAAO;AAAA,EACT;AAAA,EAEA,aAAuB;AACrB,WAAO,CAAC,GAAG,KAAK,YAAY,EAAE,KAAK;AAAA,EACrC;AAAA,EAEA,MAAM,WAA8B;AAClC,QAAI,cAAc,OAAW,QAAO,CAAC,GAAG,KAAK,OAAO,EAAE,KAAK;AAC3D,UAAM,QAAQ,oBAAI,IAAY;AAC9B,eAAW,WAAW,KAAK,YAAY,OAAO,GAAG;AAC/C,iBAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,cAAc,UAAW,OAAM,IAAI,OAAO,IAAI;AAAA,MAC3D;AAAA,IACF;AACA,WAAO,CAAC,GAAG,KAAK,EAAE,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,QAAmC,CAAC,GAAa;AACtD,UAAM,SAAS,oBAAI,IAAY;AAC/B,eAAW,WAAW,KAAK,YAAY,OAAO,GAAG;AAC/C,iBAAW,UAAU,SAAS;AAC5B,YAAI,MAAM,cAAc,UAAa,OAAO,cAAc,MAAM,UAAW;AAC3E,YAAI,MAAM,SAAS,UAAa,OAAO,SAAS,MAAM,KAAM;AAC5D,YACE,MAAM,UAAU,UAChB,MAAM,MAAM,SAAS,KACrB,EAAE,OAAO,UAAU,MAAM,SAAS,OAAO,MAAM,WAAW,GAAG,MAAM,KAAK,GAAG,IAC3E;AACA;AAAA,QACF;AACA,eAAO,IAAI,OAAO,KAAK;AAAA,MACzB;AAAA,IACF;AACA,WAAO,CAAC,GAAG,MAAM,EAAE,KAAK;AAAA,EAC1B;AAAA,EAEA,SAAS,QAAmC,CAAC,GAAa;AACxD,UAAM,WAAW,oBAAI,IAAY;AACjC,eAAW,WAAW,KAAK,YAAY,OAAO,GAAG;AAC/C,iBAAW,UAAU,SAAS;AAC5B,YAAI,MAAM,cAAc,UAAa,OAAO,cAAc,MAAM,UAAW;AAC3E,YAAI,MAAM,SAAS,UAAa,OAAO,SAAS,MAAM,KAAM;AAC5D,YACE,MAAM,UAAU,UAChB,MAAM,MAAM,SAAS,KACrB,EAAE,OAAO,UAAU,MAAM,SAAS,OAAO,MAAM,WAAW,GAAG,MAAM,KAAK,GAAG,IAC3E;AACA;AAAA,QACF;AACA,iBAAS,IAAI,OAAO,SAAS;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,CAAC,GAAG,QAAQ,EAAE,KAAK;AAAA,EAC5B;AAAA,EAEA,aAA8B;AAC5B,UAAM,UAA2B,CAAC;AAClC,eAAW,SAAS,KAAK,YAAY,OAAO,EAAG,SAAQ,KAAK,GAAG,KAAK;AACpE,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAsB,CAAC,GAAoB;AAC/C,UAAM,WACJ,QAAQ,WAAW,SACf,SACA,IAAI,IAAe,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,SAAS,CAAC,QAAQ,MAAM,CAAC;AAC1F,WAAO,KAAK,WAAW,EAAE,OAAO,CAAC,WAAW;AAC1C,UAAI,QAAQ,cAAc,UAAa,OAAO,cAAc,QAAQ,UAAW,QAAO;AACtF,UAAI,QAAQ,SAAS,UAAa,OAAO,SAAS,QAAQ,KAAM,QAAO;AACvE,UACE,QAAQ,UAAU,UAClB,QAAQ,MAAM,SAAS,KACvB,EAAE,OAAO,UAAU,QAAQ,SAAS,OAAO,MAAM,WAAW,GAAG,QAAQ,KAAK,GAAG,IAC/E;AACA,eAAO;AAAA,MACT;AACA,UACE,QAAQ,WAAW,UACnB,QAAQ,WAAW,SACnB,gBAAgB,OAAO,MAAM,MAAM,gBAAgB,QAAQ,MAAM,GACjE;AACA,eAAO;AAAA,MACT;AACA,UAAI,aAAa,UAAa,CAAC,SAAS,IAAI,SAAS,OAAO,KAAK,CAAC,EAAG,QAAO;AAC5E,UAAI,QAAQ,WAAW,aAAa,OAAO,WAAW,OAAW,QAAO;AACxE,UAAI,QAAQ,WAAW,aAAa,OAAO,WAAW,OAAW,QAAO;AACxE,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,UAAiD,CAAC,GAAoB;AACjF,WAAO,KAAK,MAAM,OAAO,EAAE;AAAA,MACzB,CAAC,WAAW,OAAO,WAAW,UAAa,SAAS,OAAO,KAAK,MAAM;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,SAAS,QAAmB,UAAsC,CAAC,GAAoB;AACrF,WAAO,KAAK,MAAM,EAAE,GAAG,SAAS,OAAO,CAAC;AAAA,EAC1C;AAAA,EAEA,aAAa,UAAsC,CAAC,GAAiB;AACnE,UAAM,SAAuB;AAAA,MAC3B,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AACA,eAAW,UAAU,KAAK,MAAM,OAAO,EAAG,QAAO,SAAS,OAAO,KAAK,CAAC;AACvE,WAAO;AAAA,EACT;AAAA,EAEA,UAAoB;AAClB,WAAO,CAAC,GAAG,KAAK,SAAS,EAAE,KAAK;AAAA,EAClC;AAAA,EAEA,UAAU,WAAmB,MAAc,WAA2C;AACpF,eAAW,YAAY,KAAK,eAAe;AACzC,UAAI,SAAS,OAAO,cAAc,aAAa,SAAS,OAAO,SAAS,KAAM;AAC9E,YAAM,QAAQ,SAAS,OAAO,KAAK,CAAC,cAAc,UAAU,SAAS,SAAS;AAC9E,UAAI,UAAU,OAAW,QAAO;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAuB,CAAC,GAAgB;AAC5C,UAAM,QAAqB,CAAC;AAC5B,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,SAAS,QAAQ,UAAU;AACjC,eAAW,YAAY,KAAK,eAAe;AACzC,YAAM,SAAS,SAAS;AACxB,UAAI,WAAW,SAAS;AACxB,UAAI,aAAa,UAAa,SAAS,WAAW,GAAG;AACnD,mBACE,WAAW,SACP,GAAG,OAAO,IAAI,IAAI,OAAO,cAAc,WACvC,GAAG,OAAO,cAAc,IAAI,OAAO,IAAI;AAAA,MAC/C;AACA,UAAI,KAAK,IAAI,QAAQ,GAAG;AACtB,cAAM,IAAI,eAAe,gCAAgC,QAAQ,GAAG;AAAA,MACtE;AACA,WAAK,IAAI,QAAQ;AACjB,YAAM,KAAK;AAAA,QACT;AAAA,QACA,WAAW,OAAO;AAAA,QAClB,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,UAAM,wBAAU,QAAQ;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,UAAuB,CAAC,GAAW;AACzC,UAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,IAAI;AAAA,QACR,GAAG,MAAM,MAAM;AAAA,MACjB;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,CAAC;AACrB,QAAI,UAAU,OAAW,QAAO;AAChC,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,WAA8B;AAC5B,UAAM,SAA4B,CAAC;AACnC,eAAW,YAAY,KAAK,eAAe;AACzC,aAAO,KAAK,OAAG,+BAAiB,QAAQ,CAAC;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,OAK1B;AACP,MAAI,KAAC,qBAAO,MAAM,SAAS,EAAG,OAAM,IAAI,eAAe,sBAAsB,MAAM,SAAS,GAAG;AAC/F,MAAI,KAAC,qBAAO,MAAM,IAAI,EAAG,OAAM,IAAI,eAAe,iBAAiB,MAAM,IAAI,GAAG;AAChF,MAAI,KAAC,qBAAO,MAAM,EAAE,EAAG,OAAM,IAAI,eAAe,qBAAqB,MAAM,EAAE,GAAG;AAChF,aAAW,WAAW,MAAM,MAAM,MAAM,GAAG,GAAG;AAC5C,QAAI,KAAC,qBAAO,OAAO,GAAG;AACpB,YAAM,IAAI,eAAe,uBAAuB,MAAM,KAAK,GAAG;AAAA,IAChE;AAAA,EACF;AACF;;;ACpgBA,IAAAC,eAAuB;AAoBhB,SAAS,cAAc,WAAmB,MAAc,OAAe,IAAoB;AAChG,SAAO,CAAC,WAAW,MAAM,OAAO,EAAE,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,KAAK,GAAG;AAChF;AAEO,SAAS,YAAY,OAA+B;AACzD,MAAI,KAAC,qBAAO,MAAM,SAAS,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR,cAAc,MAAM,SAAS;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAC,qBAAO,MAAM,IAAI,GAAG;AACvB,UAAM,IAAI;AAAA,MACR,SAAS,MAAM,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,UAAU,UAAa,MAAM,MAAM,SAAS,GAAG;AACvD,eAAW,WAAW,MAAM,MAAM,MAAM,GAAG,GAAG;AAC5C,UAAI,KAAC,qBAAO,OAAO,GAAG;AACpB,cAAM,IAAI;AAAA,UACR,eAAe,MAAM,KAAK,+BAA+B,OAAO;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,KAAa,SAAmD;AAClF,MAAI,UAAU;AACd,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,OAAO,OAAO,SAAS,OAAO,GAAG;AACtC,QAAI,KAAK,IAAI,OAAO,GAAG;AACrB,YAAM,IAAI,gBAAgB,gCAAgC,GAAG,GAAG;AAAA,IAClE;AACA,SAAK,IAAI,OAAO;AAChB,cAAU,QAAQ,OAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAA4B;AACtD,QAAM,OAAO,IAAI,KAAK;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,gBAAgB,4BAA4B;AAAA,EACxD;AACA,QAAM,QAAQ,0BAA0B,KAAK,IAAI;AACjD,QAAM,YAAY,QAAQ,CAAC;AAC3B,QAAM,OAAO,QAAQ,CAAC,KAAK;AAC3B,MAAI,cAAc,UAAa,KAAC,qBAAO,SAAS,GAAG;AACjD,UAAM,IAAI,gBAAgB,cAAc,SAAS,6BAA6B;AAAA,EAChF;AACA,QAAM,WAAW,KACd,MAAM,MAAM,EACZ,IAAI,CAAC,YAAY,QAAQ,KAAK,CAAC,EAC/B,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC;AACzC,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,gBAAgB,aAAa,GAAG,wBAAwB;AAAA,EACpE;AACA,aAAW,WAAW,UAAU;AAC9B,QAAI,KAAC,qBAAO,OAAO,GAAG;AACpB,YAAM,IAAI;AAAA,QACR,aAAa,GAAG,+BAA+B,OAAO;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACA,SAAO,cAAc,SAAY,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,WAAW,SAAS;AAClF;AAEA,SAAS,kBAAkB,QAAuB,OAAmC;AACnF,QAAM,SAAS,OAAO,SAAS,KAAK,GAAG;AACvC,QAAM,MAAgB,CAAC;AACvB,QAAM,MAAM,CAAC,UAAwB;AACnC,QAAI,MAAM,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,EAAG,KAAI,KAAK,KAAK;AAAA,EAC9D;AAEA,MAAI,OAAO,cAAc,QAAW;AAClC,QAAI,GAAG,OAAO,SAAS,IAAI,MAAM,EAAE;AACnC,QAAI,GAAG,OAAO,SAAS,IAAI,MAAM,IAAI,IAAI,MAAM,EAAE;AACjD,QAAI,MAAM,UAAU,UAAa,MAAM,MAAM,SAAS,GAAG;AACvD,UAAI,GAAG,OAAO,SAAS,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,MAAM,EAAE;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM;AACV,MAAI,GAAG,MAAM,SAAS,IAAI,MAAM,EAAE;AAClC,MAAI,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI,IAAI,MAAM,EAAE;AAChD,MAAI,MAAM,UAAU,UAAa,MAAM,MAAM,SAAS,GAAG;AACvD,QAAI,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,MAAM,EAAE;AAAA,EACjE;AACA,SAAO;AACT;AAEA,SAAS,cAAc,QAAwC;AAC7D,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO;AAAA,IACb,OAAO,OAAO;AAAA,IACd,IAAI,OAAO;AAAA,IACX,WAAW,OAAO;AAAA,IAClB,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,kBAAkB,OAAe,QAAwB;AAChE,QAAM,gBAAgB,MAAM,MAAM,GAAG;AACrC,QAAM,iBAAiB,OAAO,MAAM,GAAG,EAAE,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC;AAC/E,MAAI,QAAQ;AACZ,SACE,QAAQ,cAAc,UACtB,QAAQ,eAAe,UACvB,cAAc,KAAK,MAAM,eAAe,KAAK,GAC7C;AACA;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,SAAmC,OAAwC;AAChG,QAAM,SAAS,MAAM,SAAS;AAC9B,QAAM,SAAS,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,MAAM,UAAU;AAChD,UAAM,aAAa,OAAO,SAAS,IAAI,kBAAkB,KAAK,OAAO,MAAM,IAAI;AAC/E,UAAM,cAAc,OAAO,SAAS,IAAI,kBAAkB,MAAM,OAAO,MAAM,IAAI;AACjF,QAAI,eAAe,YAAa,QAAO,cAAc;AACrD,UAAM,eAAe,KAAK,MAAM,MAAM,GAAG,EAAE;AAC3C,UAAM,gBAAgB,MAAM,MAAM,MAAM,GAAG,EAAE;AAC7C,QAAI,iBAAiB,cAAe,QAAO,gBAAgB;AAC3D,WAAO,KAAK,UAAU,cAAc,MAAM,SAAS;AAAA,EACrD,CAAC;AACD,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,cAAc,OAAqB;AAC1C,MAAI,MAAM,WAAW,EAAG;AACxB,aAAW,WAAW,MAAM,MAAM,GAAG,GAAG;AACtC,QAAI,KAAC,qBAAO,OAAO,GAAG;AACpB,YAAM,IAAI,gBAAgB,eAAe,KAAK,+BAA+B,OAAO,GAAG;AAAA,IACzF;AAAA,EACF;AACF;AAEA,SAAS,sBACP,QACA,OACA,SACiB;AACjB,MAAI,OAAO,cAAc,UAAa,OAAO,cAAc,MAAM,WAAW;AAC1E,UAAM,IAAI;AAAA,MACR,OAAO;AAAA,MACP;AAAA,MACA,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,WAAW,CAAC,GAAG,OAAO,QAAQ;AAElC,MAAI,SAAS,CAAC,MAAM,MAAM,WAAW;AACnC,eAAW,SAAS,MAAM,CAAC;AAC3B,QAAI,SAAS,CAAC,MAAM,MAAM,MAAM;AAC9B,iBAAW,SAAS,MAAM,CAAC;AAAA,IAC7B,WAAW,SAAS,CAAC,MAAM,UAAa,QAAQ,WAAW,IAAI,SAAS,CAAC,CAAC,GAAG;AAC3E,YAAM,IAAI;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF,WACE,SAAS,CAAC,MAAM,UAChB,QAAQ,gBAAgB,IAAI,SAAS,CAAC,CAAC,KACvC,SAAS,CAAC,MAAM,MAAM,WACtB;AACA,UAAM,IAAI;AAAA,MACR,OAAO;AAAA,MACP;AAAA,MACA,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,SAAS,CAAC,MAAM,MAAM,MAAM;AAC9B,eAAW,SAAS,MAAM,CAAC;AAAA,EAC7B,WACE,SAAS,CAAC,MAAM,UAChB,QAAQ,WAAW,IAAI,SAAS,CAAC,CAAC,KAClC,SAAS,CAAC,MAAM,MAAM,MACtB;AACA,UAAM,IAAI;AAAA,MACR,OAAO;AAAA,MACP;AAAA,MACA,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,gBAAgB,aAAa,OAAO,GAAG,mBAAmB;AAAA,EACtE;AAEA,QAAM,KAAK,SAAS,SAAS,SAAS,CAAC;AACvC,MAAI,KAAC,qBAAO,EAAE,GAAG;AACf,UAAM,IAAI,gBAAgB,aAAa,EAAE,6BAA6B;AAAA,EACxE;AACA,QAAM,gBAAgB,SAAS,MAAM,GAAG,EAAE;AAC1C,MAAI,QACF,cAAc,SAAS,IACnB,cAAc,KAAK,GAAG,IACtB,MAAM,SAAS,MAAM,MAAM,SAAS,IAClC,MAAM,QACN,QAAQ;AAChB,MAAI,MAAM,UAAU,UAAa,MAAM,MAAM,SAAS,KAAK,cAAc,SAAS,GAAG;AACnF,YAAQ,GAAG,MAAM,KAAK,IAAI,cAAc,KAAK,GAAG,CAAC;AAAA,EACnD;AACA,MAAI,MAAM,WAAW,EAAG,SAAQ,QAAQ;AACxC,gBAAc,KAAK;AAEnB,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,MAAM,MAAM;AAAA,IACZ;AAAA,IACA;AAAA,IACA,WAAW,cAAc,MAAM,WAAW,MAAM,MAAM,OAAO,EAAE;AAAA,IAC/D,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,qBACP,OACA,OACA,SACiB;AACjB,QAAM,YAAY,MAAM,aAAa,MAAM;AAC3C,QAAM,OAAO,MAAM,QAAQ,MAAM;AACjC,QAAM,QACJ,MAAM,SAAS,MAAM,MAAM,SAAS,IAChC,MAAM,QACN,MAAM,SAAS,MAAM,MAAM,SAAS,IAClC,MAAM,QACN,QAAQ;AAChB,MAAI,cAAc,MAAM,aAAa,SAAS,MAAM,MAAM;AACxD,UAAM,IAAI;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI;AAAA,IAClC;AAAA,EACF;AACA,MAAI,KAAC,qBAAO,MAAM,EAAE,GAAG;AACrB,UAAM,IAAI,gBAAgB,aAAa,MAAM,EAAE,6BAA6B;AAAA,EAC9E;AACA,gBAAc,KAAK;AACnB,QAAM,YAAY,cAAc,WAAW,MAAM,OAAO,MAAM,EAAE;AAChE,QAAM,SAAS,QAAQ,mBAAmB,SAAS;AACnD,MAAI,WAAW,OAAW,QAAO,cAAc,MAAM;AACrD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,MAAM;AAAA,IACV;AAAA,IACA,QAAQ,QAAQ,aAAa,SAAS;AAAA,EACxC;AACF;AAEO,SAAS,eACd,OACA,OACA,SACA,iBAAiB,MACA;AACjB,cAAY,KAAK;AAEjB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,qBAAqB,OAAO,OAAO,OAAO;AAAA,EACnD;AAEA,QAAM,MAAM,WAAW,OAAO,QAAQ,OAAO;AAC7C,QAAM,SAAS,mBAAmB,GAAG;AACrC,MAAI,OAAO,cAAc,UAAa,OAAO,cAAc,MAAM,WAAW;AAC1E,UAAM,IAAI,wBAAwB,KAAK,OAAO,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI,eAAe;AAAA,EAC/F;AAEA,QAAM,QAAQ,oBAAI,IAA2B;AAC7C,QAAM,aAAa,oBAAI,IAA2B;AAClD,aAAW,aAAa,kBAAkB,QAAQ,KAAK,GAAG;AACxD,UAAM,SAAS,QAAQ,mBAAmB,SAAS;AACnD,QAAI,WAAW,OAAW;AAC1B,QAAI,OAAO,cAAc,MAAM,aAAa,OAAO,SAAS,MAAM,MAAM;AACtE,iBAAW,IAAI,OAAO,WAAW,MAAM;AAAA,IACzC,OAAO;AACL,YAAM,IAAI,OAAO,WAAW,MAAM;AAAA,IACpC;AAAA,EACF;AACA,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,CAAkB;AAAA,EAC9D;AACA,MAAI,WAAW,OAAO,GAAG;AACvB,UAAM,IAAI,wBAAwB,KAAK,OAAO,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI,eAAe;AAAA,EAC/F;AAEA,QAAM,SAAS,OAAO,SAAS,KAAK,GAAG;AACvC,QAAM,gBAAgB,oBAAI,IAA2B;AACrD,aAAW,aAAa,QAAQ,cAAc,MAAM,GAAG;AACrD,UAAM,SAAS,QAAQ,mBAAmB,SAAS;AACnD,QAAI,WAAW,OAAW,eAAc,IAAI,OAAO,WAAW,MAAM;AAAA,EACtE;AACA,QAAM,UAAU,CAAC,GAAG,cAAc,OAAO,CAAC,EAAE;AAAA,IAC1C,CAAC,WAAW,OAAO,cAAc,MAAM,aAAa,OAAO,SAAS,MAAM;AAAA,EAC5E;AACA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,cAAc,QAAQ,CAAC,CAAkB;AAAA,EAClD;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,aAAa,QAAQ,IAAI,CAAC,WAAW,OAAO,SAAS,EAAE,KAAK;AAClE,QAAI,gBAAgB;AAClB,YAAM,IAAI,yBAAyB,KAAK,UAAU;AAAA,IACpD;AACA,UAAM,SAAS,cAAc,SAAS,KAAK;AAC3C,WAAO;AAAA,MACL,GAAG,cAAc,MAAM;AAAA,MACvB,WAAW;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc,OAAO,GAAG;AAC1B,UAAM,IAAI,wBAAwB,KAAK,OAAO,GAAG,MAAM,SAAS,IAAI,MAAM,IAAI,eAAe;AAAA,EAC/F;AAEA,SAAO,sBAAsB,QAAQ,OAAO,OAAO;AACrD;;;APrTA,SAAS,gBAAgB,UAAoD;AAC3E,SAAO,OAAO,aAAa,YAAY,aAAa,QAAQ,EAAE,oBAAoB;AACpF;AAEO,IAAM,WAAN,MAAoD;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAoC,CAAC;AAAA,EACrC,YAAY,oBAAI,IAAgB;AAAA,EACzC;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EAElB,YAAY,SAAsB,YAAwB;AACxD,QAAI,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO,KAAK,EAAE,WAAW,GAAG;AAC5E,YAAM,IAAI,gBAAgB,oBAAoB;AAAA,IAChD;AACA,SAAK,gBAAgB,QAAQ,OAAO,KAAK;AACzC,SAAK,YACH,OAAO,QAAQ,mBAAmB,WAC9B,CAAC,QAAQ,cAAc,IACvB,CAAC,GAAI,QAAQ,kBAAkB,CAAC,CAAE;AACxC,UAAM,iBAAiC,CAAC;AACxC,QAAI,QAAQ,YAAY,OAAW,gBAAe,UAAU,QAAQ;AACpE,QAAI,QAAQ,iBAAiB,OAAW,gBAAe,eAAe,QAAQ;AAC9E,SAAK,UAAU,IAAI,QAAQ,cAAc;AACzC,SAAK,gBAAgB,QAAQ,UAAU,CAAC;AACxC,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,kBAAkB,QAAQ,mBAAmB;AAClD,SAAK,MAAM,QAAQ,OAAO;AAC1B,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,eAAe,QAAQ,SAAS,CAAC;AACtC,SAAK,eAAe,QAAQ;AAC5B,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,sBAAsB,QAAQ;AACnC,eAAW,YAAY,QAAQ,aAAa,CAAC,GAAG;AAC9C,WAAK,IAAI,QAAQ;AAAA,IACnB;AACA,QAAI,KAAK,wBAAwB,UAAa,KAAK,QAAQ,gBAAgB,SAAS,GAAG;AACrF,WAAK,sBAAsB,KAAK,QAAQ,gBAAgB,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,iBAAqC;AACvC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,UAAkC;AAC1C,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,QAAQ;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,SAAe;AACrB,SAAK;AACL,eAAW,YAAY,KAAK,UAAW,UAAS;AAAA,EAClD;AAAA,EAEA,UAAU,QAAsB;AAC9B,UAAM,OAAO,OAAO,KAAK;AACzB,QAAI,KAAK,WAAW,EAAG,OAAM,IAAI,gBAAgB,0BAA0B;AAC3E,QAAI,SAAS,KAAK,cAAe;AACjC,SAAK,gBAAgB;AACrB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,eAAe,QAAsB;AACnC,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,MAAM,OAA6C;AACjD,gBAAY,KAAK;AACjB,WAAO,EAAE,GAAG,QAAgB,MAAM,KAAK,GAAG,MAAM;AAAA,EAClD;AAAA,EAEA,IAAI,UAAyB,UAAsB,CAAC,GAAc;AAChE,QAAI;AACJ,QAAI;AACJ,QAAI,cAA+D,CAAC;AACpE,QAAI,gBAAgB,QAAQ,GAAG;AAC7B,iBAAW;AACX,mBAAS,+BAAiB,QAAQ;AAAA,IACpC,OAAO;AACL,YAAM,eAA6B;AAAA,QACjC,GAAG,KAAK;AAAA,QACR,GAAI,QAAQ,eAAe,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,WAAW;AAAA,MACzE;AACA,UAAI,QAAQ,aAAa,MAAM;AAC7B,cAAM,aAAS,4BAAc,UAAU,YAAY;AACnD,mBAAW,OAAO;AAClB,sBAAc,OAAO;AACrB,qBAAS,+BAAiB,QAAQ;AAAA,MACpC,OAAO;AACL,uBAAW,oBAAM,UAAU,YAAY;AACvC,qBAAS,+BAAiB,QAAQ;AAAA,MACpC;AAAA,IACF;AAEA,QAAI,QAAQ,aAAa,aAAS,wBAAU,MAAM,GAAG;AACnD,YAAM,IAAI,kCAAqB,QAAQ,WAAW;AAAA,IACpD;AAEA,UAAM,QAAQ,KAAK,QAAQ,YAAY,QAAQ;AAC/C,QAAI,KAAK,wBAAwB,QAAW;AAC1C,WAAK,sBAAsB,SAAS,OAAO;AAAA,IAC7C;AACA,SAAK,OAAO;AACZ,SAAK;AACL,WAAO,EAAE,WAAW,CAAC,QAAQ,GAAG,QAAQ,YAAY;AAAA,EACtD;AAAA,EAEA,YAAY,UAAyB,UAAsB,CAAC,GAAc;AACxE,WAAO,KAAK,IAAI,UAAU,OAAO;AAAA,EACnC;AAAA,EAEA,QAAQ,SAAuB,OAA0C;AACvE,UAAM,WAAW,eAAe,SAAS,OAAO,KAAK,SAAS,KAAK,cAAc;AACjF,QAAI,SAAS,cAAc,MAAM;AAC/B,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,oBAAoB,OAAO,YAAY,WAAW,UAAU,QAAQ,EAAE,aAAa,SAAS,SAAS;AAAA,QAC9G,SAAS,SAAS;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,WAAW,SAAS;AAAA,QACpB,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,GAAI,SAAS,eAAe,SACxB,CAAC,IACD,EAAE,SAAS,EAAE,YAAY,SAAS,WAAW,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,WAAmB,QAA2C;AACtE,UAAM,QAAQ,KAAK,QAAQ,YAAY,QAAQ,KAAK,WAAW,KAAK,mBAAmB;AACvF,WAAO,KAAK,QAAQ,aAAa,WAAW,OAAO,KAAK,mBAAmB;AAAA,EAC7E;AAAA,EAEA,IAAI,SAAuB,OAAkC;AAC3D,UAAM,WAAW,KAAK,QAAQ,SAAS,KAAK;AAC5C,WAAO,SAAS,UAAU,KAAK,UAAU,SAAS,WAAW,KAAK,aAAa,MAAM;AAAA,EACvF;AAAA,EAEA,SAAS,QAAmC,CAAC,GAAa;AACxD,WAAO,KAAK,QAAQ,SAAS,KAAK;AAAA,EACpC;AAAA,EAEA,MAAM,UAAsB,CAAC,GAAoB;AAC/C,WAAO,KAAK,QAAQ,MAAM,OAAO;AAAA,EACnC;AAAA,EAEA,aAAa,UAAiD,CAAC,GAAoB;AACjF,WAAO,KAAK,QAAQ,aAAa,OAAO;AAAA,EAC1C;AAAA,EAEA,SAAS,QAAmB,UAAsC,CAAC,GAAoB;AACrF,WAAO,KAAK,QAAQ,SAAS,QAAQ,OAAO;AAAA,EAC9C;AAAA,EAEA,aAAa,UAAsC,CAAC,GAAiB;AACnE,WAAO,KAAK,QAAQ,aAAa,OAAO;AAAA,EAC1C;AAAA,EAEA,aAAuB;AACrB,WAAO,KAAK,QAAQ,WAAW;AAAA,EACjC;AAAA,EAEA,MAAM,WAA8B;AAClC,WAAO,KAAK,QAAQ,MAAM,SAAS;AAAA,EACrC;AAAA,EAEA,OAAO,QAAmC,CAAC,GAAa;AACtD,WAAO,KAAK,QAAQ,OAAO,KAAK;AAAA,EAClC;AAAA,EAEA,UAAoB;AAClB,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,UAAuB,CAAC,GAAgB;AAC5C,WAAO,KAAK,QAAQ,MAAM,OAAO;AAAA,EACnC;AAAA,EAEA,QAAQ,UAAuB,CAAC,GAAW;AACzC,WAAO,KAAK,QAAQ,QAAQ,OAAO;AAAA,EACrC;AAAA,EAEA,WAA8B;AAC5B,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA,EAEA,cAAyC;AACvC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,mBAAyB;AACvB,SAAK,gBAAgB,SAAS;AAAA,EAChC;AAAA,EAEA,SAAS,YAAkC;AACzC,SAAK,gBAAgB,KAAK,UAAU;AACpC,QAAI,KAAK,gBAAgB,SAAS,KAAK,gBAAgB;AACrD,WAAK,gBAAgB,OAAO,GAAG,KAAK,gBAAgB,SAAS,KAAK,cAAc;AAAA,IAClF;AACA,QAAI,KAAK,iBAAiB,QAAW;AACnC,UAAI;AACF,aAAK,aAAa,UAAU;AAAA,MAC9B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAA4B;AAC1B,QAAI,KAAK,wBAAwB,QAAW;AAC1C,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OACE,SACA,SAAiB,CAAC,GAClB,UAAqE,CAAC,GAC9D;AACR,UAAM,SAAS,QAAQ,UAAU,KAAK;AACtC,UAAM,aAAuD,CAAC;AAC9D,QAAI,QAAQ,aAAa,OAAW,YAAW,WAAW,QAAQ;AAClE,QAAI,QAAQ,aAAa,OAAW,YAAW,WAAW,QAAQ;AAClE,QAAI;AACF,YAAM,SAAS,KAAK,IAAI,OAAO,SAAS,QAAQ,QAAQ,UAAU;AAClE,iBAAW,SAAS,OAAO,QAAQ;AACjC,aAAK,SAAS;AAAA,UACZ,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,UACxC;AAAA,UACA,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,MAAM,OAAO,EAAE;AAAA,QAC5E,CAAC;AAAA,MACH;AACA,aAAO,OAAO;AAAA,IAChB,SAAS,OAAO;AACd,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,OAAO,KAAK;AAAA,QACrB;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,cACE,SACA,SAAiB,CAAC,GAClB,UAAqE,CAAC,GACtE;AACA,UAAM,SAAS,QAAQ,UAAU,KAAK;AACtC,UAAM,aAAuD,CAAC;AAC9D,QAAI,QAAQ,aAAa,OAAW,YAAW,WAAW,QAAQ;AAClE,QAAI,QAAQ,aAAa,OAAW,YAAW,WAAW,QAAQ;AAClE,QAAI;AACF,YAAM,SAAS,KAAK,IAAI,cAAc,SAAS,QAAQ,QAAQ,UAAU;AACzE,iBAAW,SAAS,OAAO,QAAQ;AACjC,aAAK,SAAS;AAAA,UACZ,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,UACxC;AAAA,UACA,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,MAAM,OAAO,EAAE;AAAA,QAC5E,CAAC;AAAA,MACH;AACA,aAAO,OAAO;AAAA,IAChB,SAAS,OAAO;AACd,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,OAAO,KAAK;AAAA,QACrB;AAAA,MACF,CAAC;AACD,aAAO,CAAC,EAAE,MAAM,WAAoB,OAAO,QAAQ,CAAC;AAAA,IACtD;AAAA,EACF;AACF;AAEO,SAAS,iBACd,SACA,YACgB;AAChB,SAAO,IAAI,SAAS,SAAS,UAAU;AACzC;;;AQ7WA,iCAA6B;AAC7B,2BAA8B;;;ACC9B,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,cACJ;AAEK,SAAS,cAAc,SAA6B;AACzD,MACE,iBAAiB,KAAK,OAAO,KAC7B,gBAAgB,KAAK,OAAO,KAC5B,cAAc,KAAK,OAAO,GAC1B;AACA,WAAO;AAAA,EACT;AACA,MAAI,YAAY,KAAK,OAAO,EAAG,QAAO;AACtC,MAAI,QAAQ,SAAS,IAAI,KAAK,QAAQ,SAAS,IAAI,EAAG,QAAO;AAC7D,MAAI,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,EAAG,QAAO;AAC3D,SAAO;AACT;AAEO,SAAS,cAAc,SAAiB,SAA+B;AAC5E,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAM,CAAC,SAAuB;AAClC,QAAI,CAAC,KAAK,IAAI,IAAI,GAAG;AACnB,WAAK,IAAI,IAAI;AACb,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,MAAI,YAAY,OAAO;AACrB,eAAW,SAAS,QAAQ,SAAS,mCAAmC,GAAG;AACzE,UAAI,MAAM,CAAC,MAAM,OAAW,KAAI,MAAM,CAAC,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACA,aAAW,SAAS,QAAQ,SAAS,wCAAwC,GAAG;AAC9E,QAAI,MAAM,CAAC,MAAM,OAAW,KAAI,MAAM,CAAC,CAAC;AAAA,EAC1C;AACA,SAAO;AACT;AAEO,SAAS,aACd,SACA,SACA,SAAgC,CAAC,GACpB;AACb,SAAO,EAAE,SAAS,WAAW,cAAc,SAAS,OAAO,GAAG,OAAO;AACvE;;;AD1BA,SAAS,WAAW,OAA0B;AAC5C,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,SAAS;AACf,WAAO;AAAA,MACL,MAAM,OAAO,OAAO,QAAQ,OAAO;AAAA,MACnC,SAAS,OAAO,OAAO,WAAW,KAAK;AAAA,MACvC,GAAI,OAAO,OAAO,WAAW,WAAW,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IACvE;AAAA,EACF;AACA,SAAO,EAAE,MAAM,SAAS,SAAS,OAAO,KAAK,EAAE;AACjD;AAEA,SAAS,QAAQ,SAAiB,QAA0B;AAC1D,QAAM,UAAU,cAAc,OAAO;AACrC,MAAI,YAAY,QAAS,QAAO,EAAE,MAAM,SAAS,MAAM,QAAQ;AAC/D,QAAM,YACJ,YAAY,YACP,yCAAa,QAAQ,OAAO,IAC5B,IAAI,mCAAc,QAAQ,OAAO;AACxC,SAAO,EAAE,MAAM,WAAW,UAAU;AACtC;AAEA,SAAS,kBAAkB,OAAmC;AAC5D,SAAO,eAAe,KAAK,EACxB,OAAO,CAAC,SAAS,KAAK,SAAS,QAAQ,EACvC,IAAI,CAAC,SAAU,KAAK,SAAS,YAAY,KAAK,QAAQ,KAAK,KAAM,EACjE,KAAK,EAAE;AACZ;AAEA,SAAS,eAAe,OAA0C;AAChE,QAAM,aAA4B,CAAC;AACnC,aAAW,OAAO,OAAO;AACvB,QAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM;AAC7C,UAAM,OAAO;AACb,UAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACnC,QAAI,SAAS,aAAa,SAAS,QAAQ;AACzC,iBAAW,KAAK,EAAE,MAAM,WAAW,OAAO,OAAO,KAAK,SAAS,EAAE,EAAE,CAAC;AACpE;AAAA,IACF;AACA,QAAI,SAAS,gBAAiB;AAC9B,QAAI,SAAS,UAAU;AACrB,YAAM,OAAO,OAAO,KAAK,QAAQ,YAAY;AAC7C,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM,SAAS,UAAU,SAAS,UAAU,OAAO;AAAA,QACnD,MAAM,OAAO,KAAK,QAAQ,EAAE;AAAA,QAC5B,QAAQ,OAAO,KAAK,UAAU,EAAE;AAAA,MAClC,CAAC;AACD;AAAA,IACF;AACA,UAAM,SAAS,MAAM,QAAQ,KAAK,KAAK,IACnC,kBAAkB,KAAK,KAAK,IAC5B,OAAO,KAAK,UAAU,WACpB,KAAK,QACL,OAAO,KAAK,SAAS,EAAE;AAC7B,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,QAAQ,OAAO,KAAK,UAAU,EAAE;AAAA,MAChC,OAAO;AAAA,MACP,GAAI,OAAO,KAAK,WAAW,WAAW,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IACnE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,gBAA4B;AAC1C,QAAM,QAAQ,oBAAI,IAA2D;AAE7E,QAAM,MAAM,CAAC,SAAiB,WAAkE;AAC9F,UAAM,WAAW,GAAG,MAAM,KAAS,OAAO;AAC1C,UAAM,SAAS,MAAM,IAAI,QAAQ;AACjC,QAAI,WAAW,OAAW,QAAO;AACjC,QAAI;AACF,YAAM,WAAW,QAAQ,SAAS,MAAM;AACxC,YAAM,IAAI,UAAU,QAAQ;AAC5B,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,SAAS,EAAE,MAAM,SAAkB,OAAO,WAAW,KAAK,EAAE;AAClE,YAAM,IAAI,UAAU,MAAM;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,eAAe,CACnB,SACA,QACA,QACA,WAA6B,CAAC,MACV;AACpB,UAAM,WAAW,IAAI,SAAS,MAAM;AACpC,QAAI,SAAS,SAAS,QAAS,QAAO,EAAE,MAAM,SAAS,QAAQ,CAAC,SAAS,KAAK,EAAE;AAChF,QAAI,SAAS,SAAS,QAAS,QAAO,EAAE,MAAM,SAAS,MAAM,QAAQ,CAAC,EAAE;AAExE,UAAM,SAAqB,CAAC;AAC5B,QAAI;AACF,YAAM,QAAQ,SAAS,UAAU,cAAc,QAAQ,CAAC,UAAU;AAChE,eAAO,KAAK,WAAW,KAAK,CAAC;AAAA,MAC/B,CAAC;AACD,YAAM,OAAO,eAAe,KAAK,EAC9B,OAAO,CAAC,SAAS,KAAK,SAAS,QAAQ,EACvC,IAAI,CAAC,SAAU,KAAK,SAAS,YAAY,KAAK,QAAQ,KAAK,KAAM,EACjE,KAAK,EAAE;AACV,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB,SAAS,OAAO;AACd,YAAM,iBAAiB,CAAC,WAAW,KAAK,CAAC;AACzC,UAAI;AACF,cAAM,OAAO,SAAS,UAAU,OAAO,QAAQ,CAAC,iBAAiB;AAC/D,yBAAe,KAAK,WAAW,YAAY,CAAC;AAAA,QAC9C,CAAC;AACD,eAAO,EAAE,MAAM,OAAO,IAAI,GAAG,QAAQ,eAAe;AAAA,MACtD,SAAS,eAAe;AACtB,uBAAe,KAAK,WAAW,aAAa,CAAC;AAC7C,eAAO,EAAE,MAAM,SAAS,QAAQ,eAAe;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,SAAS,QAAQ,QAAQ,SAAS;AACvC,aAAO,aAAa,SAAS,QAAQ,QAAQ,OAAO;AAAA,IACtD;AAAA,IACA,cAAc,SAAS,QAAQ,QAAQ,UAA0B;AAC/D,YAAM,WAAW,IAAI,SAAS,MAAM;AACpC,UAAI,SAAS,SAAS,SAAS;AAC7B,eAAO;AAAA,UACL,OAAO,CAAC,EAAE,MAAM,WAAW,OAAO,QAAQ,CAAC;AAAA,UAC3C,QAAQ,CAAC,SAAS,KAAK;AAAA,QACzB;AAAA,MACF;AACA,UAAI,SAAS,SAAS,SAAS;AAC7B,eAAO,EAAE,OAAO,CAAC,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,MAC1E;AACA,YAAM,SAAqB,CAAC;AAC5B,UAAI;AACF,cAAM,QAAQ,SAAS,UAAU,cAAc,QAAQ,CAAC,UAAU;AAChE,iBAAO,KAAK,WAAW,KAAK,CAAC;AAAA,QAC/B,CAAC;AACD,eAAO,EAAE,OAAO,eAAe,KAAK,GAAG,OAAO;AAAA,MAChD,SAAS,OAAO;AACd,eAAO;AAAA,UACL,OAAO,CAAC,EAAE,MAAM,WAAW,OAAO,QAAQ,CAAC;AAAA,UAC3C,QAAQ,CAAC,WAAW,KAAK,CAAC;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,SAAsB;AAC5B,YAAM,UAAU,cAAc,OAAO;AACrC,YAAM,SAAqB,CAAC;AAC5B,UAAI,YAAY,SAAS;AACvB,cAAM,WAAW,IAAI,SAAS,IAAI;AAClC,YAAI,SAAS,SAAS,QAAS,QAAO,KAAK,SAAS,KAAK;AAAA,MAC3D;AACA,aAAO,aAAa,SAAS,SAAS,MAAM;AAAA,IAC9C;AAAA,EACF;AACF;;;AE9KO,SAAS,WAA6C,SAAsC;AACjG,SAAO,iBAA2B,SAAS,QAAQ,OAAO,cAAc,CAAC;AAC3E;;;ACHA,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AAExB,SAAS,YAAY,SAA2B;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SACE;AAAA,IACF,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,YAAY,SAAiB,QAAgD;AACpF,QAAM,QAAuB,CAAC;AAC9B,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ,SAAS,eAAe,GAAG;AACrD,UAAM,QAAQ,MAAM,SAAS;AAC7B,QAAI,QAAQ,OAAQ,OAAM,KAAK,EAAE,MAAM,WAAW,OAAO,QAAQ,MAAM,QAAQ,KAAK,EAAE,CAAC;AACvF,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,QAAQ,OAAO,IAAI;AACzB,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ,IAAI,IAAI;AAAA,MAChB,OAAO,UAAU,SAAY,IAAI,IAAI,MAAM,OAAO,KAAK;AAAA,IACzD,CAAC;AACD,aAAS,QAAQ,MAAM,CAAC,EAAE;AAAA,EAC5B;AACA,MAAI,SAAS,QAAQ,OAAQ,OAAM,KAAK,EAAE,MAAM,WAAW,OAAO,QAAQ,MAAM,MAAM,EAAE,CAAC;AACzF,MAAI,MAAM,WAAW,KAAK,QAAQ,SAAS,EAAG,OAAM,KAAK,EAAE,MAAM,WAAW,OAAO,QAAQ,CAAC;AAC5F,SAAO;AACT;AAEO,SAAS,gBAA4B;AAC1C,SAAO;AAAA,IACL,OAAO,SAAS,SAAS,QAAQ;AAC/B,YAAM,UAAU,cAAc,OAAO;AACrC,UAAI,YAAY,QAAS,QAAO,EAAE,MAAM,SAAS,QAAQ,CAAC,EAAE;AAC5D,UAAI,CAAC,eAAe,KAAK,OAAO,GAAG;AACjC,eAAO,EAAE,MAAM,SAAS,QAAQ,CAAC,YAAY,OAAO,CAAC,EAAE;AAAA,MACzD;AACA,YAAM,SAAqB,CAAC;AAC5B,YAAM,OAAO,QAAQ,QAAQ,iBAAiB,CAAC,OAAO,SAAiB;AACrE,cAAM,QAAQ,OAAO,IAAI;AACzB,YAAI,UAAU,QAAW;AACvB,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,SAAS,yBAAyB,IAAI;AAAA,YACtC,QAAQ;AAAA,UACV,CAAC;AACD,iBAAO;AAAA,QACT;AACA,eAAO,OAAO,KAAK;AAAA,MACrB,CAAC;AACD,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB;AAAA,IACA,cAAc,SAAS,SAAS,QAAQ;AACtC,YAAM,UAAU,cAAc,OAAO;AACrC,UAAI,YAAY,SAAS;AACvB,eAAO,EAAE,OAAO,CAAC,EAAE,MAAM,WAAW,OAAO,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,MACpE;AACA,UAAI,CAAC,eAAe,KAAK,OAAO,GAAG;AACjC,eAAO;AAAA,UACL,OAAO,CAAC,EAAE,MAAM,WAAW,OAAO,QAAQ,CAAC;AAAA,UAC3C,QAAQ,CAAC,YAAY,OAAO,CAAC;AAAA,QAC/B;AAAA,MACF;AACA,aAAO,EAAE,OAAO,YAAY,SAAS,MAAM,GAAG,QAAQ,CAAC,EAAE;AAAA,IAC3D;AAAA,IACA,QAAQ,SAAsB;AAC5B,YAAM,UAAU,cAAc,OAAO;AACrC,YAAM,SAAqB,CAAC;AAC5B,UAAI,YAAY,WAAW,CAAC,eAAe,KAAK,OAAO,GAAG;AACxD,eAAO,KAAK,YAAY,OAAO,CAAC;AAAA,MAClC;AACA,aAAO,aAAa,SAAS,SAAS,MAAM;AAAA,IAC9C;AAAA,EACF;AACF;","names":["import_core","import_core","effectiveType","text","import_core","document","import_core"]}
@@ -0,0 +1,10 @@
1
+ import { I as I18nOptions, a as I18n, b as IcuRuntime } from './types-CtbwKSot.cjs';
2
+ export { A as AddOptions, c as AddResult, C as Catalog, d as CatalogOptions, e as CliffFile, f as CliffResource, g as CommitOptions, D as DiagnosticSeverity, E as EMOTION, h as EmotionTag, i as EntryIdCatalogContext, j as EntryIdInput, k as EntryIdOf, l as EntryQuery, F as FileOptions, m as I18nDiagnostic, n as I18nRuntime, o as IcuAnalysis, p as IcuDialect, q as IcuError, r as IcuFormatOptions, s as IcuFormatResult, t as IcuPartsResult, M as MessageBuilder, u as MessageMetadata, v as MessagePart, w as MessageRecord, x as MessageState, y as MissingBehavior, P as Params, R as RenderMethod, z as RenderPartsMethod, B as ResolvedEntryId, S as STATUS, G as STATUS_ORDER, H as ScopedI18n, J as StatusCounts, K as StatusTag, T as TFunction, L as TYPE, N as TranslatedDraft, O as TranslationScope, Q as TypeTag, V as VARIANT, U as VariantTag, W as WidthPolicy, X as assertCatalogParts, Y as assertScope, Z as joinCanonical, _ as resolveEntryId } from './types-CtbwKSot.cjs';
3
+ export { C as CliffAmbiguousEntryError, a as CliffDuplicateEntryError, b as CliffI18nError, c as CliffIcuError, d as CliffMissingEntryError, e as CliffMissingMetadataError, f as CliffScopeError, g as CliffScopeMismatchError, M as MessageBuilderImpl, S as STATUS_TRANSITIONS, h as StatusContext, i as analyzePlain, j as argumentNames, k as assertEmotionTag, l as assertStatusTag, m as assertTypeTag, n as assertVariantTag, o as canTransitionStatus, p as createLiteIcu, q as createT, r as detectDialect, s as isEmotionTag, t as isStatusTag, u as isTypeTag, v as isVariantTag, w as nextStatuses, x as reconcileEntryStatus, y as statusOf, z as statusOrder } from './vocabulary-u-i15yFj.cjs';
4
+ import '@cliff-format/core';
5
+
6
+ declare function createI18n<EntryIds extends string = string>(options: I18nOptions): I18n<EntryIds>;
7
+
8
+ declare function createFullIcu(): IcuRuntime;
9
+
10
+ export { I18n, I18nOptions, IcuRuntime, createFullIcu, createI18n };
@@ -0,0 +1,10 @@
1
+ import { I as I18nOptions, a as I18n, b as IcuRuntime } from './types-CtbwKSot.js';
2
+ export { A as AddOptions, c as AddResult, C as Catalog, d as CatalogOptions, e as CliffFile, f as CliffResource, g as CommitOptions, D as DiagnosticSeverity, E as EMOTION, h as EmotionTag, i as EntryIdCatalogContext, j as EntryIdInput, k as EntryIdOf, l as EntryQuery, F as FileOptions, m as I18nDiagnostic, n as I18nRuntime, o as IcuAnalysis, p as IcuDialect, q as IcuError, r as IcuFormatOptions, s as IcuFormatResult, t as IcuPartsResult, M as MessageBuilder, u as MessageMetadata, v as MessagePart, w as MessageRecord, x as MessageState, y as MissingBehavior, P as Params, R as RenderMethod, z as RenderPartsMethod, B as ResolvedEntryId, S as STATUS, G as STATUS_ORDER, H as ScopedI18n, J as StatusCounts, K as StatusTag, T as TFunction, L as TYPE, N as TranslatedDraft, O as TranslationScope, Q as TypeTag, V as VARIANT, U as VariantTag, W as WidthPolicy, X as assertCatalogParts, Y as assertScope, Z as joinCanonical, _ as resolveEntryId } from './types-CtbwKSot.js';
3
+ export { C as CliffAmbiguousEntryError, a as CliffDuplicateEntryError, b as CliffI18nError, c as CliffIcuError, d as CliffMissingEntryError, e as CliffMissingMetadataError, f as CliffScopeError, g as CliffScopeMismatchError, M as MessageBuilderImpl, S as STATUS_TRANSITIONS, h as StatusContext, i as analyzePlain, j as argumentNames, k as assertEmotionTag, l as assertStatusTag, m as assertTypeTag, n as assertVariantTag, o as canTransitionStatus, p as createLiteIcu, q as createT, r as detectDialect, s as isEmotionTag, t as isStatusTag, u as isTypeTag, v as isVariantTag, w as nextStatuses, x as reconcileEntryStatus, y as statusOf, z as statusOrder } from './vocabulary-riKZ5HrX.js';
4
+ import '@cliff-format/core';
5
+
6
+ declare function createI18n<EntryIds extends string = string>(options: I18nOptions): I18n<EntryIds>;
7
+
8
+ declare function createFullIcu(): IcuRuntime;
9
+
10
+ export { I18n, I18nOptions, IcuRuntime, createFullIcu, createI18n };
package/dist/index.js ADDED
@@ -0,0 +1,223 @@
1
+ import {
2
+ Catalog,
3
+ CliffAmbiguousEntryError,
4
+ CliffDuplicateEntryError,
5
+ CliffI18nError,
6
+ CliffIcuError,
7
+ CliffMissingEntryError,
8
+ CliffMissingMetadataError,
9
+ CliffScopeError,
10
+ CliffScopeMismatchError,
11
+ EMOTION,
12
+ MessageBuilderImpl,
13
+ STATUS,
14
+ STATUS_ORDER,
15
+ STATUS_TRANSITIONS,
16
+ TYPE,
17
+ VARIANT,
18
+ analyzePlain,
19
+ argumentNames,
20
+ assertCatalogParts,
21
+ assertEmotionTag,
22
+ assertScope,
23
+ assertStatusTag,
24
+ assertTypeTag,
25
+ assertVariantTag,
26
+ canTransitionStatus,
27
+ createI18nEngine,
28
+ createLiteIcu,
29
+ createT,
30
+ detectDialect,
31
+ isEmotionTag,
32
+ isStatusTag,
33
+ isTypeTag,
34
+ isVariantTag,
35
+ joinCanonical,
36
+ nextStatuses,
37
+ reconcileEntryStatus,
38
+ resolveEntryId,
39
+ statusOf,
40
+ statusOrder
41
+ } from "./chunk-47VERBYX.js";
42
+
43
+ // src/icu/full.ts
44
+ import { mf1ToMessage } from "@messageformat/icu-messageformat-1";
45
+ import { MessageFormat } from "messageformat";
46
+ function toIcuError(error) {
47
+ if (typeof error === "object" && error !== null) {
48
+ const record = error;
49
+ return {
50
+ type: String(record.type ?? "error"),
51
+ message: String(record.message ?? error),
52
+ ...typeof record.source === "string" ? { source: record.source } : {}
53
+ };
54
+ }
55
+ return { type: "error", message: String(error) };
56
+ }
57
+ function compile(message, locale) {
58
+ const dialect = detectDialect(message);
59
+ if (dialect === "plain") return { kind: "plain", text: message };
60
+ const formatter = dialect === "mf1" ? mf1ToMessage(locale, message) : new MessageFormat(locale, message);
61
+ return { kind: "message", formatter };
62
+ }
63
+ function formatNestedParts(parts) {
64
+ return normalizeParts(parts).filter((part) => part.type !== "markup").map((part) => part.type === "literal" ? part.value : part.value).join("");
65
+ }
66
+ function normalizeParts(parts) {
67
+ const normalized = [];
68
+ for (const raw of parts) {
69
+ if (typeof raw !== "object" || raw === null) continue;
70
+ const part = raw;
71
+ const type = String(part.type ?? "");
72
+ if (type === "literal" || type === "text") {
73
+ normalized.push({ type: "literal", value: String(part.value ?? "") });
74
+ continue;
75
+ }
76
+ if (type === "bidiIsolation") continue;
77
+ if (type === "markup") {
78
+ const kind = String(part.kind ?? "standalone");
79
+ normalized.push({
80
+ type: "markup",
81
+ kind: kind === "open" || kind === "close" ? kind : "standalone",
82
+ name: String(part.name ?? ""),
83
+ source: String(part.source ?? "")
84
+ });
85
+ continue;
86
+ }
87
+ const nested = Array.isArray(part.parts) ? formatNestedParts(part.parts) : typeof part.value === "string" ? part.value : String(part.value ?? "");
88
+ normalized.push({
89
+ type: "expression",
90
+ source: String(part.source ?? ""),
91
+ value: nested,
92
+ ...typeof part.locale === "string" ? { locale: part.locale } : {}
93
+ });
94
+ }
95
+ return normalized;
96
+ }
97
+ function createFullIcu() {
98
+ const cache = /* @__PURE__ */ new Map();
99
+ const get = (message, locale) => {
100
+ const cacheKey = `${locale}\0${message}`;
101
+ const cached = cache.get(cacheKey);
102
+ if (cached !== void 0) return cached;
103
+ try {
104
+ const compiled = compile(message, locale);
105
+ cache.set(cacheKey, compiled);
106
+ return compiled;
107
+ } catch (error) {
108
+ const failed = { kind: "error", error: toIcuError(error) };
109
+ cache.set(cacheKey, failed);
110
+ return failed;
111
+ }
112
+ };
113
+ const formatResult = (message, locale, values, _options = {}) => {
114
+ const compiled = get(message, locale);
115
+ if (compiled.kind === "error") return { text: message, errors: [compiled.error] };
116
+ if (compiled.kind === "plain") return { text: compiled.text, errors: [] };
117
+ const errors = [];
118
+ try {
119
+ const parts = compiled.formatter.formatToParts(values, (error) => {
120
+ errors.push(toIcuError(error));
121
+ });
122
+ const text = normalizeParts(parts).filter((part) => part.type !== "markup").map((part) => part.type === "literal" ? part.value : part.value).join("");
123
+ return { text, errors };
124
+ } catch (error) {
125
+ const fallbackErrors = [toIcuError(error)];
126
+ try {
127
+ const text = compiled.formatter.format(values, (runtimeError) => {
128
+ fallbackErrors.push(toIcuError(runtimeError));
129
+ });
130
+ return { text: String(text), errors: fallbackErrors };
131
+ } catch (fallbackError) {
132
+ fallbackErrors.push(toIcuError(fallbackError));
133
+ return { text: message, errors: fallbackErrors };
134
+ }
135
+ }
136
+ };
137
+ return {
138
+ format(message, locale, values, options) {
139
+ return formatResult(message, locale, values, options);
140
+ },
141
+ formatToParts(message, locale, values, _options) {
142
+ const compiled = get(message, locale);
143
+ if (compiled.kind === "error") {
144
+ return {
145
+ parts: [{ type: "literal", value: message }],
146
+ errors: [compiled.error]
147
+ };
148
+ }
149
+ if (compiled.kind === "plain") {
150
+ return { parts: [{ type: "literal", value: compiled.text }], errors: [] };
151
+ }
152
+ const errors = [];
153
+ try {
154
+ const parts = compiled.formatter.formatToParts(values, (error) => {
155
+ errors.push(toIcuError(error));
156
+ });
157
+ return { parts: normalizeParts(parts), errors };
158
+ } catch (error) {
159
+ return {
160
+ parts: [{ type: "literal", value: message }],
161
+ errors: [toIcuError(error)]
162
+ };
163
+ }
164
+ },
165
+ analyze(message) {
166
+ const dialect = detectDialect(message);
167
+ const errors = [];
168
+ if (dialect !== "plain") {
169
+ const compiled = get(message, "en");
170
+ if (compiled.kind === "error") errors.push(compiled.error);
171
+ }
172
+ return analyzePlain(message, dialect, errors);
173
+ }
174
+ };
175
+ }
176
+
177
+ // src/create-full.ts
178
+ function createI18n(options) {
179
+ return createI18nEngine(options, options.icu ?? createFullIcu());
180
+ }
181
+ export {
182
+ Catalog,
183
+ CliffAmbiguousEntryError,
184
+ CliffDuplicateEntryError,
185
+ CliffI18nError,
186
+ CliffIcuError,
187
+ CliffMissingEntryError,
188
+ CliffMissingMetadataError,
189
+ CliffScopeError,
190
+ CliffScopeMismatchError,
191
+ EMOTION,
192
+ MessageBuilderImpl,
193
+ STATUS,
194
+ STATUS_ORDER,
195
+ STATUS_TRANSITIONS,
196
+ TYPE,
197
+ VARIANT,
198
+ analyzePlain,
199
+ argumentNames,
200
+ assertCatalogParts,
201
+ assertEmotionTag,
202
+ assertScope,
203
+ assertStatusTag,
204
+ assertTypeTag,
205
+ assertVariantTag,
206
+ canTransitionStatus,
207
+ createFullIcu,
208
+ createI18n,
209
+ createLiteIcu,
210
+ createT,
211
+ detectDialect,
212
+ isEmotionTag,
213
+ isStatusTag,
214
+ isTypeTag,
215
+ isVariantTag,
216
+ joinCanonical,
217
+ nextStatuses,
218
+ reconcileEntryStatus,
219
+ resolveEntryId,
220
+ statusOf,
221
+ statusOrder
222
+ };
223
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/icu/full.ts","../src/create-full.ts"],"sourcesContent":["import { mf1ToMessage } from \"@messageformat/icu-messageformat-1\";\nimport { MessageFormat } from \"messageformat\";\nimport { analyzePlain, detectDialect } from \"./detect.js\";\nimport type {\n IcuAnalysis,\n IcuError,\n IcuFormatOptions,\n IcuFormatResult,\n IcuPartsResult,\n IcuRuntime,\n MessagePart,\n} from \"./types.js\";\n\ninterface Formatter {\n format(values: Record<string, unknown>, onError?: (error: unknown) => void): string;\n formatToParts(\n values: Record<string, unknown>,\n onError?: (error: unknown) => void,\n ): readonly unknown[];\n}\n\ntype Compiled = { kind: \"plain\"; text: string } | { kind: \"message\"; formatter: Formatter };\n\nfunction toIcuError(error: unknown): IcuError {\n if (typeof error === \"object\" && error !== null) {\n const record = error as Record<string, unknown>;\n return {\n type: String(record.type ?? \"error\"),\n message: String(record.message ?? error),\n ...(typeof record.source === \"string\" ? { source: record.source } : {}),\n };\n }\n return { type: \"error\", message: String(error) };\n}\n\nfunction compile(message: string, locale: string): Compiled {\n const dialect = detectDialect(message);\n if (dialect === \"plain\") return { kind: \"plain\", text: message };\n const formatter =\n dialect === \"mf1\"\n ? (mf1ToMessage(locale, message) as unknown as Formatter)\n : (new MessageFormat(locale, message) as unknown as Formatter);\n return { kind: \"message\", formatter };\n}\n\nfunction formatNestedParts(parts: readonly unknown[]): string {\n return normalizeParts(parts)\n .filter((part) => part.type !== \"markup\")\n .map((part) => (part.type === \"literal\" ? part.value : part.value))\n .join(\"\");\n}\n\nfunction normalizeParts(parts: readonly unknown[]): MessagePart[] {\n const normalized: MessagePart[] = [];\n for (const raw of parts) {\n if (typeof raw !== \"object\" || raw === null) continue;\n const part = raw as Record<string, unknown>;\n const type = String(part.type ?? \"\");\n if (type === \"literal\" || type === \"text\") {\n normalized.push({ type: \"literal\", value: String(part.value ?? \"\") });\n continue;\n }\n if (type === \"bidiIsolation\") continue;\n if (type === \"markup\") {\n const kind = String(part.kind ?? \"standalone\");\n normalized.push({\n type: \"markup\",\n kind: kind === \"open\" || kind === \"close\" ? kind : \"standalone\",\n name: String(part.name ?? \"\"),\n source: String(part.source ?? \"\"),\n });\n continue;\n }\n const nested = Array.isArray(part.parts)\n ? formatNestedParts(part.parts)\n : typeof part.value === \"string\"\n ? part.value\n : String(part.value ?? \"\");\n normalized.push({\n type: \"expression\",\n source: String(part.source ?? \"\"),\n value: nested,\n ...(typeof part.locale === \"string\" ? { locale: part.locale } : {}),\n });\n }\n return normalized;\n}\n\nexport function createFullIcu(): IcuRuntime {\n const cache = new Map<string, Compiled | { kind: \"error\"; error: IcuError }>();\n\n const get = (message: string, locale: string): Compiled | { kind: \"error\"; error: IcuError } => {\n const cacheKey = `${locale}\\u0000${message}`;\n const cached = cache.get(cacheKey);\n if (cached !== undefined) return cached;\n try {\n const compiled = compile(message, locale);\n cache.set(cacheKey, compiled);\n return compiled;\n } catch (error) {\n const failed = { kind: \"error\" as const, error: toIcuError(error) };\n cache.set(cacheKey, failed);\n return failed;\n }\n };\n\n const formatResult = (\n message: string,\n locale: string,\n values: Record<string, unknown>,\n _options: IcuFormatOptions = {},\n ): IcuFormatResult => {\n const compiled = get(message, locale);\n if (compiled.kind === \"error\") return { text: message, errors: [compiled.error] };\n if (compiled.kind === \"plain\") return { text: compiled.text, errors: [] };\n\n const errors: IcuError[] = [];\n try {\n const parts = compiled.formatter.formatToParts(values, (error) => {\n errors.push(toIcuError(error));\n });\n const text = normalizeParts(parts)\n .filter((part) => part.type !== \"markup\")\n .map((part) => (part.type === \"literal\" ? part.value : part.value))\n .join(\"\");\n return { text, errors };\n } catch (error) {\n const fallbackErrors = [toIcuError(error)];\n try {\n const text = compiled.formatter.format(values, (runtimeError) => {\n fallbackErrors.push(toIcuError(runtimeError));\n });\n return { text: String(text), errors: fallbackErrors };\n } catch (fallbackError) {\n fallbackErrors.push(toIcuError(fallbackError));\n return { text: message, errors: fallbackErrors };\n }\n }\n };\n\n return {\n format(message, locale, values, options) {\n return formatResult(message, locale, values, options);\n },\n formatToParts(message, locale, values, _options): IcuPartsResult {\n const compiled = get(message, locale);\n if (compiled.kind === \"error\") {\n return {\n parts: [{ type: \"literal\", value: message }],\n errors: [compiled.error],\n };\n }\n if (compiled.kind === \"plain\") {\n return { parts: [{ type: \"literal\", value: compiled.text }], errors: [] };\n }\n const errors: IcuError[] = [];\n try {\n const parts = compiled.formatter.formatToParts(values, (error) => {\n errors.push(toIcuError(error));\n });\n return { parts: normalizeParts(parts), errors };\n } catch (error) {\n return {\n parts: [{ type: \"literal\", value: message }],\n errors: [toIcuError(error)],\n };\n }\n },\n analyze(message): IcuAnalysis {\n const dialect = detectDialect(message);\n const errors: IcuError[] = [];\n if (dialect !== \"plain\") {\n const compiled = get(message, \"en\");\n if (compiled.kind === \"error\") errors.push(compiled.error);\n }\n return analyzePlain(message, dialect, errors);\n },\n };\n}\n","import { createI18nEngine } from \"./engine.js\";\nimport { createFullIcu } from \"./icu/full.js\";\nimport type { I18n, I18nOptions } from \"./types.js\";\n\nexport function createI18n<EntryIds extends string = string>(options: I18nOptions): I18n<EntryIds> {\n return createI18nEngine<EntryIds>(options, options.icu ?? createFullIcu());\n}\n"],"mappings":"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","names":[]}