@danielarndt0/brutils-cli 1.1.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.
- package/LICENSE +21 -0
- package/README.md +146 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +3346 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +442 -0
- package/dist/index.js +2286 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/create-program.ts","../src/services/zip/resolve-zip-output.ts","../src/services/zip/collect-zip-inputs.ts","../src/core/errors/brutils.error.ts","../src/services/zip/create-zip.ts","../src/services/zip/list-zip.ts","../src/services/archive/zip-archive.ts","../src/core/utils/glob.ts","../src/services/zip/test-zip.ts","../src/services/unzip/resolve-unzip-output.ts","../src/services/unzip/extract-zip.ts","../src/services/unzip/list-unzip.ts","../src/services/unzip/test-unzip.ts","../src/cli/ui/theme.ts","../src/cli/shared/help.ts","../src/cli/shared/parsers.ts","../src/cli/shared/constants.ts","../src/cli/ui/output.ts","../src/cli/commands/register-archive.ts","../src/core/utils/digits.ts","../src/services/cep/cep.shared.ts","../src/core/utils/format.ts","../src/services/cep/cep.formatter.ts","../src/core/utils/mask.ts","../src/services/cep/cep.masker.ts","../src/core/utils/random.ts","../src/services/cep/cep.generator.ts","../src/services/cep/cep.validator.ts","../src/services/cnpj/cnpj.shared.ts","../src/services/cnpj/cnpj.formatter.ts","../src/services/cnpj/cnpj.masker.ts","../src/services/cnpj/cnpj.generator.ts","../src/services/cnpj/cnpj.validator.ts","../src/services/cpf/cpf.shared.ts","../src/services/cpf/cpf.formatter.ts","../src/services/cpf/cpf.masker.ts","../src/services/cpf/cpf.generator.ts","../src/services/cpf/cpf.validator.ts","../src/services/credit-card/credit-card.constants.ts","../src/services/credit-card/credit-card.detector.ts","../src/core/utils/array.ts","../src/services/credit-card/credit-card.generator.ts","../src/services/credit-card/credit-card.validator.ts","../src/cli/commands/register-brazilian.ts","../src/services/date/date.service.ts","../src/services/hash/hash.service.ts","../src/services/id/id.service.ts","../src/cli/commands/register-helpers.ts","../src/core/utils/seeded-random.ts","../src/services/number-picker/number-picker.service.ts","../src/services/random-number/random-number.generator.ts","../src/cli/shared/io.ts","../src/services/json/json.service.ts","../src/cli/commands/register-random.ts","../src/services/str/str.service.ts","../src/cli/commands/register-text-data.ts","../src/cli.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { registerArchiveCommands } from \"./commands/register-archive.js\";\nimport { registerBrazilianCommands } from \"./commands/register-brazilian.js\";\nimport { registerHelperCommands } from \"./commands/register-helpers.js\";\nimport { registerRandomCommands } from \"./commands/register-random.js\";\nimport { registerTextDataCommands } from \"./commands/register-text-data.js\";\nimport { rootFooter } from \"./shared/help.js\";\nimport { configureProgramUi } from \"./ui/output.js\";\n\nconst CLI_VERSION = \"1.1.0\";\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n configureProgramUi(program);\n\n program\n .name(\"brutils\")\n .description(\"Core Brazilian developer utilities CLI.\")\n .version(CLI_VERSION)\n .showHelpAfterError(\"(use --help for detailed usage)\")\n .showSuggestionAfterError(true)\n .addHelpText(\"after\", rootFooter());\n\n registerBrazilianCommands(program);\n registerTextDataCommands(program);\n registerHelperCommands(program);\n registerRandomCommands(program);\n registerArchiveCommands(program);\n\n return program;\n}\n","import path from \"node:path\";\n\nexport function resolveZipOutputPath(\n sourcePath: string,\n explicitOut?: string\n): string {\n if (explicitOut) {\n return explicitOut;\n }\n\n const normalizedSource = path.resolve(sourcePath);\n const parsed = path.parse(normalizedSource);\n\n if (path.basename(normalizedSource) === \".\") {\n const cwd = process.cwd();\n return path.join(cwd, `${path.basename(cwd)}.zip`);\n }\n\n if (parsed.ext) {\n return path.join(parsed.dir, `${parsed.name}.zip`);\n }\n\n return path.join(parsed.dir, `${parsed.base}.zip`);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport type { ZipCommandOptions, ZipInputEntry } from \"./zip.types.js\";\n\nfunction normalizeEntryName(value: string): string {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction isDirectory(sourcePath: string): boolean {\n return fs.statSync(sourcePath).isDirectory();\n}\n\nfunction isFile(sourcePath: string): boolean {\n return fs.statSync(sourcePath).isFile();\n}\n\nexport function collectZipInputs(\n sourcePath: string,\n outputPath: string,\n options: ZipCommandOptions = {}\n): ZipInputEntry[] {\n const resolvedSource = path.resolve(sourcePath);\n\n if (!fs.existsSync(resolvedSource)) {\n throw new BRUtilsError(`Source path does not exist: ${sourcePath}`);\n }\n\n if (isFile(resolvedSource)) {\n return [\n {\n type: \"file\",\n sourcePath: resolvedSource,\n entryName: path.basename(resolvedSource)\n }\n ];\n }\n\n if (!isDirectory(resolvedSource)) {\n throw new BRUtilsError(`Unsupported source type: ${sourcePath}`);\n }\n\n const excludePatterns = options.exclude ?? [];\n const outputAbsolutePath = path.resolve(outputPath);\n const rootEntryName = path.basename(resolvedSource);\n const entries = fg.sync([\"**/*\", \"**/.*\"], {\n cwd: resolvedSource,\n onlyFiles: false,\n onlyDirectories: false,\n dot: true,\n followSymbolicLinks: options.followSymlinks ?? false,\n unique: true,\n ignore: excludePatterns,\n markDirectories: true\n });\n\n if (entries.length === 0) {\n return options.contentsOnly\n ? []\n : [\n {\n type: \"directory\",\n sourcePath: resolvedSource,\n entryName: `${rootEntryName}/`\n }\n ];\n }\n\n return entries\n .map<ZipInputEntry | null>((entry) => {\n const cleanedEntry = entry.endsWith(\"/\") ? entry.slice(0, -1) : entry;\n const absoluteEntryPath = path.join(resolvedSource, cleanedEntry);\n\n if (path.resolve(absoluteEntryPath) === outputAbsolutePath) {\n return null;\n }\n\n const relativeEntryName = options.contentsOnly\n ? cleanedEntry\n : path.join(rootEntryName, cleanedEntry);\n\n const entryType = entry.endsWith(\"/\") ? \"directory\" : \"file\";\n\n return {\n type: entryType,\n sourcePath: absoluteEntryPath,\n entryName: normalizeEntryName(\n entryType === \"directory\"\n ? `${relativeEntryName}/`\n : relativeEntryName\n )\n };\n })\n .filter((entry): entry is ZipInputEntry => entry !== null);\n}\n","export class BRUtilsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BRUtilsError\";\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport archiver from \"archiver\";\nimport { collectZipInputs } from \"./collect-zip-inputs.js\";\nimport { resolveZipOutputPath } from \"./resolve-zip-output.js\";\nimport { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport type { ZipCommandOptions, ZipExecutionPlan } from \"./zip.types.js\";\n\nfunction resolveCompressionLevel(level?: number): number {\n const resolvedLevel = level ?? 9;\n\n if (\n !Number.isInteger(resolvedLevel) ||\n resolvedLevel < 0 ||\n resolvedLevel > 9\n ) {\n throw new BRUtilsError(\n \"Compression level must be an integer between 0 and 9.\"\n );\n }\n\n return resolvedLevel;\n}\n\nfunction getSourceType(sourcePath: string): \"file\" | \"directory\" {\n return fs.statSync(sourcePath).isDirectory() ? \"directory\" : \"file\";\n}\n\nfunction ensureOutputCanBeWritten(outputPath: string, force = false): void {\n if (fs.existsSync(outputPath) && !force) {\n throw new BRUtilsError(\n `Output file already exists: ${outputPath}. Use --force to overwrite it.`\n );\n }\n\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n}\n\nexport function createZipExecutionPlan(\n sourcePath: string,\n positionalOut?: string,\n options: ZipCommandOptions = {}\n): ZipExecutionPlan {\n if (positionalOut && options.out) {\n throw new BRUtilsError(\"Use either positional [out] or --out, not both.\");\n }\n\n const resolvedOutputPath = path.resolve(\n resolveZipOutputPath(sourcePath, positionalOut ?? options.out)\n );\n\n return {\n sourcePath: path.resolve(sourcePath),\n outputPath: resolvedOutputPath,\n sourceType: getSourceType(path.resolve(sourcePath)),\n exclude: options.exclude ?? [],\n contentsOnly: options.contentsOnly ?? false,\n level: resolveCompressionLevel(options.level),\n followSymlinks: options.followSymlinks ?? false,\n store: options.store ?? false\n };\n}\n\nexport async function createZip(\n sourcePath: string,\n positionalOut?: string,\n options: ZipCommandOptions = {}\n): Promise<ZipExecutionPlan> {\n const plan = createZipExecutionPlan(sourcePath, positionalOut, options);\n\n if (options.dryRun) {\n return plan;\n }\n\n ensureOutputCanBeWritten(plan.outputPath, options.force);\n\n const outputStream = fs.createWriteStream(plan.outputPath);\n const archive = archiver(\"zip\", {\n zlib: { level: plan.store ? 0 : plan.level },\n store: plan.store\n });\n\n await new Promise<void>((resolve, reject) => {\n outputStream.on(\"close\", () => resolve());\n archive.on(\"error\", (error) => reject(error));\n archive.pipe(outputStream);\n\n const inputs = collectZipInputs(plan.sourcePath, plan.outputPath, options);\n\n for (const input of inputs) {\n if (options.verbose && !options.quiet) {\n console.log(`[zip] adding ${input.entryName}`);\n }\n\n if (input.type === \"directory\") {\n archive.append(\"\", { name: input.entryName });\n } else {\n archive.file(input.sourcePath, { name: input.entryName });\n }\n }\n\n archive.finalize().catch(reject);\n });\n\n return plan;\n}\n","import path from \"node:path\";\nimport { listZipArchiveEntries } from \"../archive/zip-archive.js\";\nimport type { ZipListResult } from \"./zip.types.js\";\n\nexport async function listZip(\n sourcePath: string,\n match?: string\n): Promise<ZipListResult> {\n return listZipArchiveEntries(\n path.resolve(sourcePath),\n match ? { match } : {}\n );\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport yauzl from \"yauzl\";\nimport { matchesGlob } from \"../../core/utils/glob.js\";\nimport { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport type {\n ZipArchiveEntryInfo,\n ZipListOptions,\n ZipTestOptions,\n ZipTestResult\n} from \"./zip-archive.types.js\";\n\nfunction normalizeEntryPath(entryPath: string): string {\n return entryPath.replace(/\\\\/g, \"/\");\n}\n\nexport function ensureZipSourceIsValid(sourcePath: string): void {\n if (!fs.existsSync(sourcePath)) {\n throw new BRUtilsError(`Zip file does not exist: ${sourcePath}`);\n }\n\n if (!fs.statSync(sourcePath).isFile()) {\n throw new BRUtilsError(`Source is not a file: ${sourcePath}`);\n }\n\n if (path.extname(sourcePath).toLowerCase() !== \".zip\") {\n throw new BRUtilsError(\"Only .zip files are supported.\");\n }\n}\n\nfunction openZipFile(sourcePath: string): Promise<yauzl.ZipFile> {\n ensureZipSourceIsValid(sourcePath);\n\n return new Promise((resolve, reject) => {\n yauzl.open(\n sourcePath,\n {\n lazyEntries: true,\n decodeStrings: true,\n validateEntrySizes: true\n },\n (error, zipFile) => {\n if (error) {\n reject(error);\n return;\n }\n\n if (!zipFile) {\n reject(new BRUtilsError(\"Could not open zip file.\"));\n return;\n }\n\n resolve(zipFile);\n }\n );\n });\n}\n\nfunction shouldIncludeEntry(entryPath: string, match?: string): boolean {\n if (!match) {\n return true;\n }\n\n return matchesGlob(normalizeEntryPath(entryPath), match);\n}\n\nexport async function listZipArchiveEntries(\n sourcePath: string,\n options: ZipListOptions = {}\n): Promise<ZipArchiveEntryInfo[]> {\n const zipFile = await openZipFile(sourcePath);\n\n return new Promise((resolve, reject) => {\n const entries: ZipArchiveEntryInfo[] = [];\n\n zipFile.on(\"entry\", (entry) => {\n const entryPath = normalizeEntryPath(entry.fileName);\n\n if (shouldIncludeEntry(entryPath, options.match)) {\n entries.push({\n path: entryPath,\n type: entryPath.endsWith(\"/\") ? \"directory\" : \"file\",\n compressedSize: entry.compressedSize,\n uncompressedSize: entry.uncompressedSize\n });\n }\n\n zipFile.readEntry();\n });\n\n zipFile.once(\"end\", () => {\n zipFile.close();\n resolve(entries);\n });\n\n zipFile.once(\"error\", (error) => {\n zipFile.close();\n reject(error);\n });\n\n zipFile.readEntry();\n });\n}\n\nasync function drainEntryStream(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n zipFile.openReadStream(entry, async (error, stream) => {\n if (error) {\n reject(error);\n return;\n }\n\n if (!stream) {\n reject(\n new BRUtilsError(`Could not read archive entry: ${entry.fileName}`)\n );\n return;\n }\n\n try {\n await pipeline(\n stream,\n new Writable({\n write(_chunk, _encoding, callback) {\n callback();\n }\n })\n );\n\n resolve();\n } catch (streamError) {\n reject(streamError);\n }\n });\n });\n}\n\nexport async function testZipArchive(\n sourcePath: string,\n options: ZipTestOptions = {}\n): Promise<ZipTestResult> {\n const zipFile = await openZipFile(sourcePath);\n let testedEntries = 0;\n\n return new Promise((resolve, reject) => {\n zipFile.on(\"entry\", (entry) => {\n const entryPath = normalizeEntryPath(entry.fileName);\n\n void (async () => {\n try {\n if (\n !shouldIncludeEntry(entryPath, options.match) ||\n entryPath.endsWith(\"/\")\n ) {\n zipFile.readEntry();\n return;\n }\n\n await drainEntryStream(zipFile, entry);\n testedEntries += 1;\n zipFile.readEntry();\n } catch (error) {\n zipFile.close();\n reject(error);\n }\n })();\n });\n\n zipFile.once(\"end\", () => {\n zipFile.close();\n resolve({\n sourcePath: path.resolve(sourcePath),\n testedEntries,\n ok: true\n });\n });\n\n zipFile.once(\"error\", (error) => {\n zipFile.close();\n reject(error);\n });\n\n zipFile.readEntry();\n });\n}\n","import * as minimatchModule from \"minimatch\";\n\ntype MinimatchLike = (\n input: string,\n pattern: string,\n options?: { dot?: boolean }\n) => boolean;\n\nfunction resolveMinimatch(): MinimatchLike {\n const moduleValue = minimatchModule as unknown as {\n minimatch?: MinimatchLike;\n default?: MinimatchLike;\n } & MinimatchLike;\n\n if (typeof moduleValue.minimatch === \"function\") {\n return moduleValue.minimatch;\n }\n\n if (typeof moduleValue.default === \"function\") {\n return moduleValue.default;\n }\n\n if (typeof moduleValue === \"function\") {\n return moduleValue;\n }\n\n throw new Error(\"Could not resolve minimatch implementation.\");\n}\n\nconst minimatch = resolveMinimatch();\n\nexport function matchesGlob(input: string, pattern: string): boolean {\n return minimatch(input, pattern, { dot: true });\n}\n","import path from \"node:path\";\nimport { testZipArchive } from \"../archive/zip-archive.js\";\nimport type { ZipTestExecutionResult } from \"./zip.types.js\";\n\nexport async function testZip(\n sourcePath: string,\n match?: string\n): Promise<ZipTestExecutionResult> {\n return testZipArchive(path.resolve(sourcePath), match ? { match } : {});\n}\n","import path from \"node:path\";\n\nexport function resolveUnzipOutputPath(\n sourcePath: string,\n explicitOut?: string\n): string {\n if (explicitOut) {\n return explicitOut;\n }\n\n const resolvedSource = path.resolve(sourcePath);\n const parsed = path.parse(resolvedSource);\n\n return path.join(parsed.dir, parsed.name);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport yauzl from \"yauzl\";\nimport { matchesGlob } from \"../../core/utils/glob.js\";\nimport { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport { ensureZipSourceIsValid } from \"../archive/zip-archive.js\";\nimport { resolveUnzipOutputPath } from \"./resolve-unzip-output.js\";\nimport type { UnzipCommandOptions, UnzipExecutionPlan } from \"./unzip.types.js\";\n\nfunction ensureOutputCanBeExtracted(outputDir: string, force = false): void {\n if (fs.existsSync(outputDir) && !force) {\n throw new BRUtilsError(\n `Output directory already exists: ${outputDir}. Use --force to overwrite it.`\n );\n }\n\n if (fs.existsSync(outputDir) && force) {\n fs.rmSync(outputDir, { recursive: true, force: true });\n }\n\n fs.mkdirSync(outputDir, { recursive: true });\n}\n\nfunction normalizeEntryPath(entryPath: string): string {\n return entryPath.replace(/\\\\/g, \"/\");\n}\n\nfunction shouldIncludeEntry(entryPath: string, match?: string): boolean {\n if (!match) {\n return true;\n }\n\n return matchesGlob(normalizeEntryPath(entryPath), match);\n}\n\nfunction resolveTargetRelativePath(entryPath: string, flat: boolean): string {\n if (!flat) {\n return normalizeEntryPath(entryPath);\n }\n\n return path.posix.basename(normalizeEntryPath(entryPath));\n}\n\nfunction resolveSafeDestination(\n outputDir: string,\n relativePath: string\n): string {\n const destination = path.resolve(outputDir, relativePath);\n const resolvedOutputDir = path.resolve(outputDir);\n const outputPrefix = `${resolvedOutputDir}${path.sep}`;\n\n if (\n destination !== resolvedOutputDir &&\n !destination.startsWith(outputPrefix)\n ) {\n throw new BRUtilsError(`Unsafe zip entry path detected: ${relativePath}`);\n }\n\n return destination;\n}\n\nfunction openZipFile(sourcePath: string): Promise<yauzl.ZipFile> {\n ensureZipSourceIsValid(sourcePath);\n\n return new Promise((resolve, reject) => {\n yauzl.open(\n sourcePath,\n {\n lazyEntries: true,\n decodeStrings: true,\n validateEntrySizes: true\n },\n (error, zipFile) => {\n if (error) {\n reject(error);\n return;\n }\n\n if (!zipFile) {\n reject(new BRUtilsError(\"Could not open zip file.\"));\n return;\n }\n\n resolve(zipFile);\n }\n );\n });\n}\n\nexport function createUnzipExecutionPlan(\n sourcePath: string,\n positionalOut?: string,\n options: UnzipCommandOptions = {}\n): UnzipExecutionPlan {\n if (positionalOut && options.out) {\n throw new BRUtilsError(\"Use either positional [out] or --out, not both.\");\n }\n\n const resolvedSourcePath = path.resolve(sourcePath);\n const resolvedOutputDir = path.resolve(\n resolveUnzipOutputPath(sourcePath, positionalOut ?? options.out)\n );\n\n return {\n sourcePath: resolvedSourcePath,\n outputDir: resolvedOutputDir,\n flat: options.flat ?? false,\n ...(options.match ? { match: options.match } : {})\n };\n}\n\nexport async function extractZipFile(\n sourcePath: string,\n positionalOut?: string,\n options: UnzipCommandOptions = {}\n): Promise<UnzipExecutionPlan> {\n const plan = createUnzipExecutionPlan(sourcePath, positionalOut, options);\n\n ensureZipSourceIsValid(plan.sourcePath);\n\n if (options.dryRun) {\n return plan;\n }\n\n ensureOutputCanBeExtracted(plan.outputDir, options.force);\n\n if (options.verbose && !options.quiet) {\n console.log(`[unzip] extracting ${plan.sourcePath} -> ${plan.outputDir}`);\n }\n\n const zipFile = await openZipFile(plan.sourcePath);\n const flatTargets = new Set<string>();\n\n await new Promise<void>((resolve, reject) => {\n zipFile.on(\"entry\", (entry) => {\n const entryPath = normalizeEntryPath(entry.fileName);\n\n void (async () => {\n try {\n if (!shouldIncludeEntry(entryPath, options.match)) {\n zipFile.readEntry();\n return;\n }\n\n const isDirectory = entryPath.endsWith(\"/\");\n const targetRelativePath = resolveTargetRelativePath(\n entryPath,\n options.flat ?? false\n );\n\n if (!targetRelativePath) {\n zipFile.readEntry();\n return;\n }\n\n if (\n (options.flat ?? false) &&\n flatTargets.has(targetRelativePath) &&\n !isDirectory\n ) {\n throw new BRUtilsError(\n `Flat extraction would overwrite a file more than once: ${targetRelativePath}`\n );\n }\n\n if ((options.flat ?? false) && !isDirectory) {\n flatTargets.add(targetRelativePath);\n }\n\n const destinationPath = resolveSafeDestination(\n plan.outputDir,\n targetRelativePath\n );\n\n if (options.verbose && !options.quiet) {\n console.log(`[unzip] extracting ${entryPath}`);\n }\n\n if (isDirectory) {\n if (!(options.flat ?? false)) {\n fs.mkdirSync(destinationPath, { recursive: true });\n }\n\n zipFile.readEntry();\n return;\n }\n\n fs.mkdirSync(path.dirname(destinationPath), { recursive: true });\n\n await new Promise<void>((entryResolve, entryReject) => {\n zipFile.openReadStream(entry, async (error, stream) => {\n if (error) {\n entryReject(error);\n return;\n }\n\n if (!stream) {\n entryReject(\n new BRUtilsError(\n `Could not read archive entry: ${entry.fileName}`\n )\n );\n return;\n }\n\n try {\n await pipeline(stream, fs.createWriteStream(destinationPath));\n entryResolve();\n } catch (streamError) {\n entryReject(streamError);\n }\n });\n });\n\n zipFile.readEntry();\n } catch (error) {\n zipFile.close();\n reject(error);\n }\n })();\n });\n\n zipFile.once(\"end\", () => {\n zipFile.close();\n resolve();\n });\n\n zipFile.once(\"error\", (error) => {\n zipFile.close();\n reject(error);\n });\n\n zipFile.readEntry();\n });\n\n return plan;\n}\n","import path from \"node:path\";\nimport { listZipArchiveEntries } from \"../archive/zip-archive.js\";\nimport type { UnzipListResult } from \"./unzip.types.js\";\n\nexport async function listUnzip(\n sourcePath: string,\n match?: string\n): Promise<UnzipListResult> {\n return listZipArchiveEntries(\n path.resolve(sourcePath),\n match ? { match } : {}\n );\n}\n","import path from \"node:path\";\nimport { testZipArchive } from \"../archive/zip-archive.js\";\nimport type { UnzipTestResult } from \"./unzip.types.js\";\n\nexport async function testUnzip(\n sourcePath: string,\n match?: string\n): Promise<UnzipTestResult> {\n return testZipArchive(path.resolve(sourcePath), match ? { match } : {});\n}\n","const colorsEnabled =\n process.stdout.isTTY &&\n !process.argv.includes(\"--no-color\") &&\n process.env.NO_COLOR === undefined;\n\nfunction paint(code: number, value: string): string {\n if (!colorsEnabled) {\n return value;\n }\n\n return `\\u001B[${code}m${value}\\u001B[0m`;\n}\n\nexport const theme = {\n muted: (value: string) => paint(90, value),\n red: (value: string) => paint(31, value),\n green: (value: string) => paint(32, value),\n yellow: (value: string) => paint(33, value),\n blue: (value: string) => paint(34, value),\n magenta: (value: string) => paint(35, value),\n cyan: (value: string) => paint(36, value),\n bold: (value: string) => paint(1, value),\n\n section: (value: string) => paint(36, paint(1, value)),\n command: (value: string) => paint(36, value),\n flag: (value: string) => paint(33, value),\n value: (value: string) => paint(32, value),\n errorLabel: (value: string) => paint(31, paint(1, value)),\n successLabel: (value: string) => paint(32, paint(1, value))\n};\n","import { theme } from \"../ui/theme.js\";\n\nexport function examples(lines: string[]): string {\n return `\n${theme.section(\"Examples\")}\n${lines.map((line) => ` ${theme.command(line)}`).join(\"\\n\")}\n`;\n}\n\nexport function notes(lines: string[]): string {\n return `\n${theme.section(\"Notes\")}\n${lines.map((line) => ` ${theme.muted(line)}`).join(\"\\n\")}\n`;\n}\n\nexport function rootFooter(): string {\n return `\n${theme.section(\"Quick start\")}\n ${theme.command(\"brutils <command> --help\")}\n ${theme.command(\"brutils <command> <action> --help\")}\n\n${theme.section(\"Examples\")}\n ${theme.command(\"brutils cpf generate --formatted\")}\n ${theme.command('brutils str slug --text \"Hello Cool World\"')}\n ${theme.command(\"brutils json format --file ./config.json --sort-keys\")}\n ${theme.command(\"brutils hash sha256 --text hello\")}\n ${theme.command(\"brutils id token --length 24 --charset base64url\")}\n ${theme.command(\"brutils date diff --from 2024-01-01T00:00:00Z --to 2024-01-03T00:00:00Z --unit days\")}\n ${theme.command(\"brutils random-number int --min 1 --max 60 --count 6 --unique --sorted\")}\n ${theme.command(\"brutils zip create ./folder --out ./backup.zip --force\")}\n\n${theme.section(\"Tips\")}\n ${theme.muted(\"The official interface is the brutils command.\")}\n ${theme.muted(\"Use --no-color if you want plain output.\")}\n ${theme.muted(\"Use module-specific --help to see focused examples.\")}\n`;\n}\n","import { InvalidArgumentError } from \"commander\";\n\nimport type { CEPStateCode } from \"../../services/cep/index.js\";\nimport type { CPFStateCode } from \"../../services/cpf/index.js\";\nimport type { CreditCardBrand } from \"../../services/credit-card/index.js\";\nimport type { DateDiffUnit } from \"../../services/date/index.js\";\nimport type { CharsetName } from \"../../services/id/index.js\";\nimport type {\n StringCaseStyle,\n StringCodecMode,\n StringPadSide\n} from \"../../services/str/index.js\";\nimport {\n BRAZILIAN_STATES,\n CARD_BRANDS,\n CHARSET_NAMES,\n DATE_DIFF_UNITS,\n RANDOM_OUTPUT_FORMATS,\n STRING_CASE_STYLES,\n STRING_CODEC_MODES,\n STRING_PAD_SIDES,\n type CharsetNameOption,\n type DateDiffUnitOption,\n type RandomOutputFormat,\n type StringCaseStyleOption,\n type StringCodecModeOption,\n type StringPadSideOption\n} from \"./constants.js\";\n\nexport function parseInteger(value: string): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed)) {\n throw new InvalidArgumentError(`Expected an integer, received \"${value}\".`);\n }\n\n return parsed;\n}\n\nexport function parsePositiveInteger(value: string): number {\n const parsed = parseInteger(value);\n\n if (parsed < 1) {\n throw new InvalidArgumentError(\n `Expected a positive integer, received \"${value}\".`\n );\n }\n\n return parsed;\n}\n\nexport function parseNumber(value: string): number {\n const parsed = Number(value);\n\n if (!Number.isFinite(parsed)) {\n throw new InvalidArgumentError(\n `Expected a numeric value, received \"${value}\".`\n );\n }\n\n return parsed;\n}\n\nexport function parseState(value: string): CPFStateCode | CEPStateCode {\n const normalized = value.toUpperCase();\n\n if (\n !BRAZILIAN_STATES.includes(normalized as (typeof BRAZILIAN_STATES)[number])\n ) {\n throw new InvalidArgumentError(\n `Invalid state \"${value}\". Use one of: ${BRAZILIAN_STATES.join(\", \")}.`\n );\n }\n\n return normalized as CPFStateCode | CEPStateCode;\n}\n\nexport function parseCardBrand(value: string): CreditCardBrand {\n const normalized = value.toLowerCase();\n\n if (!CARD_BRANDS.includes(normalized as CreditCardBrand)) {\n throw new InvalidArgumentError(\n `Invalid brand \"${value}\". Use one of: ${CARD_BRANDS.join(\", \")}.`\n );\n }\n\n return normalized as CreditCardBrand;\n}\n\nexport function parseRandomFormat(value: string): RandomOutputFormat {\n const normalized = value.toLowerCase();\n\n if (!RANDOM_OUTPUT_FORMATS.includes(normalized as RandomOutputFormat)) {\n throw new InvalidArgumentError(\n `Invalid output format \"${value}\". Use one of: ${RANDOM_OUTPUT_FORMATS.join(\", \")}.`\n );\n }\n\n return normalized as RandomOutputFormat;\n}\n\nexport function parseStringCaseStyle(value: string): StringCaseStyle {\n const normalized = value.toLowerCase();\n\n if (!STRING_CASE_STYLES.includes(normalized as StringCaseStyleOption)) {\n throw new InvalidArgumentError(\n `Invalid string case style \"${value}\". Use one of: ${STRING_CASE_STYLES.join(\", \")}.`\n );\n }\n\n return normalized as StringCaseStyle;\n}\n\nexport function parseStringCodecMode(value: string): StringCodecMode {\n const normalized = value.toLowerCase();\n\n if (!STRING_CODEC_MODES.includes(normalized as StringCodecModeOption)) {\n throw new InvalidArgumentError(\n `Invalid codec mode \"${value}\". Use one of: ${STRING_CODEC_MODES.join(\", \")}.`\n );\n }\n\n return normalized as StringCodecMode;\n}\n\nexport function parseStringPadSide(value: string): StringPadSide {\n const normalized = value.toLowerCase();\n\n if (!STRING_PAD_SIDES.includes(normalized as StringPadSideOption)) {\n throw new InvalidArgumentError(\n `Invalid pad side \"${value}\". Use one of: ${STRING_PAD_SIDES.join(\", \")}.`\n );\n }\n\n return normalized as StringPadSide;\n}\n\nexport function parseCharsetName(value: string): CharsetName {\n const normalized = value.toLowerCase();\n\n if (!CHARSET_NAMES.includes(normalized as CharsetNameOption)) {\n throw new InvalidArgumentError(\n `Invalid charset \"${value}\". Use one of: ${CHARSET_NAMES.join(\", \")}.`\n );\n }\n\n return normalized as CharsetName;\n}\n\nexport function parseDateDiffUnit(value: string): DateDiffUnit {\n const normalized = value.toLowerCase();\n\n if (!DATE_DIFF_UNITS.includes(normalized as DateDiffUnitOption)) {\n throw new InvalidArgumentError(\n `Invalid diff unit \"${value}\". Use one of: ${DATE_DIFF_UNITS.join(\", \")}.`\n );\n }\n\n return normalized as DateDiffUnit;\n}\n","export const BRAZILIAN_STATES = [\n \"AC\",\n \"AL\",\n \"AM\",\n \"AP\",\n \"BA\",\n \"CE\",\n \"DF\",\n \"ES\",\n \"GO\",\n \"MA\",\n \"MG\",\n \"MS\",\n \"MT\",\n \"PA\",\n \"PB\",\n \"PE\",\n \"PI\",\n \"PR\",\n \"RJ\",\n \"RN\",\n \"RO\",\n \"RR\",\n \"RS\",\n \"SC\",\n \"SE\",\n \"SP\",\n \"TO\"\n] as const;\n\nexport const CARD_BRANDS = [\"visa\", \"mastercard\", \"amex\", \"elo\"] as const;\n\nexport const RANDOM_OUTPUT_FORMATS = [\"plain\", \"json\", \"csv\"] as const;\n\nexport const STRING_CASE_STYLES = [\n \"camel\",\n \"snake\",\n \"kebab\",\n \"pascal\",\n \"constant\",\n \"title\"\n] as const;\n\nexport const STRING_CODEC_MODES = [\"encode\", \"decode\"] as const;\n\nexport const STRING_PAD_SIDES = [\"left\", \"right\", \"both\"] as const;\n\nexport const CHARSET_NAMES = [\n \"alnum\",\n \"alpha\",\n \"numeric\",\n \"hex\",\n \"base64url\",\n \"lower\",\n \"upper\"\n] as const;\n\nexport const DATE_DIFF_UNITS = [\"seconds\", \"minutes\", \"hours\", \"days\"] as const;\n\nexport type RandomOutputFormat = (typeof RANDOM_OUTPUT_FORMATS)[number];\nexport type StringCaseStyleOption = (typeof STRING_CASE_STYLES)[number];\nexport type StringCodecModeOption = (typeof STRING_CODEC_MODES)[number];\nexport type StringPadSideOption = (typeof STRING_PAD_SIDES)[number];\nexport type CharsetNameOption = (typeof CHARSET_NAMES)[number];\nexport type DateDiffUnitOption = (typeof DATE_DIFF_UNITS)[number];\n","import type { Command, Option } from \"commander\";\n\nimport { theme } from \"./theme.js\";\n\nexport function configureProgramUi(program: Command): void {\n program.configureOutput({\n writeErr: (str) => process.stderr.write(str),\n outputError: (str, write) => {\n write(theme.red(str));\n }\n });\n\n program.configureHelp({\n subcommandTerm: (cmd) => theme.command(cmd.name()),\n optionTerm: (option: Option) => theme.flag(option.flags)\n });\n}\n\nexport function printValue(value: unknown): void {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n console.log(value);\n return;\n }\n\n if (Array.isArray(value)) {\n if (\n value.every(\n (item) => typeof item === \"string\" || typeof item === \"number\"\n )\n ) {\n console.log(value.join(\"\\n\"));\n return;\n }\n }\n\n console.log(JSON.stringify(value, null, 2));\n}\n\nexport function printRandomValues(\n values: Array<string | number>,\n format: \"plain\" | \"json\" | \"csv\"\n): void {\n if (format === \"json\") {\n console.log(JSON.stringify(values, null, 2));\n return;\n }\n\n if (format === \"csv\") {\n console.log(values.join(\",\"));\n return;\n }\n\n console.log(values.join(\"\\n\"));\n}\n\nexport function handleCliError(error: unknown): never {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`${theme.errorLabel(\"error\")} ${message}`);\n process.exit(1);\n}\n","import type { Command } from \"commander\";\n\nimport { createZip, listZip, testZip } from \"../../services/zip/index.js\";\nimport {\n extractZipFile,\n listUnzip,\n testUnzip\n} from \"../../services/unzip/index.js\";\nimport { examples } from \"../shared/help.js\";\nimport { parseInteger } from \"../shared/parsers.js\";\nimport { printValue } from \"../ui/output.js\";\n\nexport function registerArchiveCommands(program: Command): void {\n const zip = program\n .command(\"zip\")\n .description(\"Create zip archives and inspect them.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils zip create ./folder\",\n \"brutils zip create ./folder ./backup.zip\",\n \"brutils zip create ./folder --out ./backup.zip --force\",\n \"brutils zip create ./folder --contents-only --exclude node_modules --exclude dist\",\n 'brutils zip list ./backup.zip --match \"**/*.txt\"',\n \"brutils zip test ./backup.zip\"\n ])\n );\n\n zip\n .command(\"create\")\n .alias(\"run\")\n .argument(\"<source>\", \"File or folder to archive.\")\n .argument(\"[out]\", \"Optional output .zip file path.\")\n .description(\"Create a zip archive from a source path.\")\n .option(\"-o, --out <path>\", \"Explicit output file path.\")\n .option(\n \"-l, --level <number>\",\n \"Compression level from 0 to 9.\",\n parseInteger\n )\n .option(\n \"-x, --exclude <glob...>\",\n \"Glob patterns to exclude when zipping folder contents.\"\n )\n .option(\n \"--contents-only\",\n \"Zip only the folder contents instead of the folder root.\"\n )\n .option(\"-f, --force\", \"Overwrite output if it already exists.\")\n .option(\n \"--dry-run\",\n \"Print the execution plan without writing the archive.\"\n )\n .option(\"-v, --verbose\", \"Show verbose archive creation logs.\")\n .option(\"-q, --quiet\", \"Suppress non-error output.\")\n .option(\n \"--follow-symlinks\",\n \"Follow symbolic links while collecting inputs.\"\n )\n .option(\"--store\", \"Store files without compression.\")\n .action(\n async (\n source: string,\n out: string | undefined,\n options: {\n out?: string;\n level?: number;\n exclude?: string[];\n contentsOnly?: boolean;\n force?: boolean;\n dryRun?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n followSymlinks?: boolean;\n store?: boolean;\n }\n ) => {\n const plan = await createZip(source, out, options);\n\n if (!options.quiet) {\n printValue(plan);\n }\n }\n );\n\n zip\n .command(\"list\")\n .argument(\"<source>\", \"Existing .zip file to inspect.\")\n .description(\"List archive contents without extracting.\")\n .option(\"--match <pattern>\", \"Filter which archive entries are included.\")\n .option(\"-q, --quiet\", \"Suppress non-error output.\")\n .action(\n async (source: string, options: { match?: string; quiet?: boolean }) => {\n const result = await listZip(source, options.match);\n\n if (!options.quiet) {\n printValue(result);\n }\n }\n );\n\n zip\n .command(\"test\")\n .argument(\"<source>\", \"Existing .zip file to validate.\")\n .description(\"Test archive readability without extracting files.\")\n .option(\"--match <pattern>\", \"Filter which archive entries are included.\")\n .option(\"-q, --quiet\", \"Suppress non-error output.\")\n .action(\n async (source: string, options: { match?: string; quiet?: boolean }) => {\n const result = await testZip(source, options.match);\n\n if (!options.quiet) {\n printValue(result);\n }\n }\n );\n\n const unzip = program\n .command(\"unzip\")\n .description(\"Extract zip archives and inspect them.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils unzip extract ./backup.zip\",\n \"brutils unzip extract ./backup.zip ./output\",\n \"brutils unzip extract ./backup.zip --out ./output --force\",\n 'brutils unzip extract ./backup.zip --flat --match \"**/*.txt\"',\n \"brutils unzip list ./backup.zip\",\n \"brutils unzip test ./backup.zip\"\n ])\n );\n\n unzip\n .command(\"extract\")\n .alias(\"run\")\n .argument(\"<source>\", \"Existing .zip file to extract.\")\n .argument(\"[out]\", \"Optional destination directory.\")\n .description(\"Extract a zip archive.\")\n .option(\"-o, --out <path>\", \"Explicit output directory.\")\n .option(\n \"-f, --force\",\n \"Overwrite the target directory if it already exists.\"\n )\n .option(\"--dry-run\", \"Print the extraction plan without writing files.\")\n .option(\"-v, --verbose\", \"Show verbose extraction logs.\")\n .option(\"-q, --quiet\", \"Suppress non-error output.\")\n .option(\"--flat\", \"Extract files without preserving nested folders.\")\n .option(\"--match <pattern>\", \"Filter which archive entries are extracted.\")\n .action(\n async (\n source: string,\n out: string | undefined,\n options: {\n out?: string;\n force?: boolean;\n dryRun?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n flat?: boolean;\n match?: string;\n }\n ) => {\n const plan = await extractZipFile(source, out, options);\n\n if (!options.quiet) {\n printValue(plan);\n }\n }\n );\n\n unzip\n .command(\"list\")\n .argument(\"<source>\", \"Existing .zip file to inspect.\")\n .description(\"List archive contents without extracting.\")\n .option(\"--match <pattern>\", \"Filter which archive entries are included.\")\n .option(\"-q, --quiet\", \"Suppress non-error output.\")\n .action(\n async (source: string, options: { match?: string; quiet?: boolean }) => {\n const result = await listUnzip(source, options.match);\n\n if (!options.quiet) {\n printValue(result);\n }\n }\n );\n\n unzip\n .command(\"test\")\n .argument(\"<source>\", \"Existing .zip file to validate.\")\n .description(\"Test archive readability without extracting files.\")\n .option(\"--match <pattern>\", \"Filter which archive entries are included.\")\n .option(\"-q, --quiet\", \"Suppress non-error output.\")\n .action(\n async (source: string, options: { match?: string; quiet?: boolean }) => {\n const result = await testUnzip(source, options.match);\n\n if (!options.quiet) {\n printValue(result);\n }\n }\n );\n}\n","export function onlyDigits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\nexport function allDigitsEqual(value: string): boolean {\n return /^(\\d)\\1+$/.test(value);\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport { onlyDigits } from \"../../core/utils/digits.js\";\nimport type { CEPStateCode } from \"./cep.types.js\";\nconst CEP_STATE_LEADING_DIGIT_MAP: Record<CEPStateCode, number[]> = {\n AC: [6],\n AL: [5],\n AM: [6],\n AP: [6],\n BA: [4],\n CE: [6],\n DF: [7],\n ES: [2],\n GO: [7],\n MA: [6],\n MG: [3],\n MS: [7],\n MT: [7],\n PA: [6],\n PB: [5],\n PE: [5],\n PI: [6],\n PR: [8],\n RJ: [2],\n RN: [5],\n RO: [7],\n RR: [6],\n RS: [9],\n SC: [8],\n SE: [4],\n SP: [0, 1],\n TO: [7]\n};\nexport function normalizeCEP(value: string): string {\n return onlyDigits(value);\n}\nexport function stripCEP(value: string): string {\n return normalizeCEP(value);\n}\nexport function ensureCEPLength(value: string): string {\n const digits = normalizeCEP(value);\n if (digits.length !== 8)\n throw new BRUtilsError(\"CEP must contain exactly 8 digits.\");\n return digits;\n}\nexport function resolveCEPLeadingDigits(\n state?: CEPStateCode\n): number[] | undefined {\n return state ? CEP_STATE_LEADING_DIGIT_MAP[state] : undefined;\n}\n","export function formatCPF(value: string): string {\n return value.replace(/(\\d{3})(\\d{3})(\\d{3})(\\d{2})/, \"$1.$2.$3-$4\");\n}\n\nexport function formatCNPJ(value: string): string {\n return value.replace(/(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})/, \"$1.$2.$3/$4-$5\");\n}\n\nexport function formatCEP(value: string): string {\n return value.replace(/(\\d{5})(\\d{3})/, \"$1-$2\");\n}\n","import { formatCEP } from \"../../core/utils/format.js\";\nimport { ensureCEPLength, stripCEP } from \"./cep.shared.js\";\nexport function formatCEPValue(value: string): string {\n return formatCEP(ensureCEPLength(value));\n}\nexport { stripCEP };\n","import { BRUtilsError } from \"../errors/brutils.error.js\";\n\nexport function applyDigitMask(value: string, pattern: string): string {\n let index = 0;\n let result = \"\";\n for (const token of pattern) {\n if (token === \"*\") {\n if (value[index] === undefined)\n throw new BRUtilsError(\n \"Mask pattern consumes more digits than the input provides.\"\n );\n result += \"*\";\n index += 1;\n continue;\n }\n if (token === \"#\" || /\\d/.test(token)) {\n const digit = value[index];\n if (digit === undefined)\n throw new BRUtilsError(\n \"Mask pattern consumes more digits than the input provides.\"\n );\n result += digit;\n index += 1;\n continue;\n }\n result += token;\n }\n if (index != value.length)\n throw new BRUtilsError(\n `Mask pattern consumed ${index} digits, but the input has ${value.length}.`\n );\n return result;\n}\n","import { applyDigitMask } from \"../../core/utils/mask.js\";\nimport { ensureCEPLength } from \"./cep.shared.js\";\nimport type { CEPMaskOptions } from \"./cep.types.js\";\nconst DEFAULT_CEP_MASK_PATTERN = \"*****-###\";\nexport function maskCEP(value: string, options: CEPMaskOptions = {}): string {\n return applyDigitMask(\n ensureCEPLength(value),\n options.pattern ?? DEFAULT_CEP_MASK_PATTERN\n );\n}\n","export function randomDigit(): number {\n return Math.floor(Math.random() * 10);\n}\n\nexport function randomDigits(length: number): number[] {\n return Array.from({ length }, () => randomDigit());\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport { formatCEP } from \"../../core/utils/format.js\";\nimport { randomDigit, randomDigits } from \"../../core/utils/random.js\";\nimport { resolveCEPLeadingDigits } from \"./cep.shared.js\";\nimport type {\n CEPGenerateBatchOptions,\n CEPGenerateOptions\n} from \"./cep.types.js\";\nexport function generateCEP(options: CEPGenerateOptions = {}): string {\n const stateLeadingDigits = resolveCEPLeadingDigits(options.state);\n const firstDigit = stateLeadingDigits\n ? stateLeadingDigits[Math.floor(Math.random() * stateLeadingDigits.length)]!\n : randomDigit();\n const digits = [firstDigit, ...randomDigits(7)].join(\"\");\n return options.formatted ? formatCEP(digits) : digits;\n}\nexport function generateCEPBatch(options: CEPGenerateBatchOptions): string[] {\n const count = options.count;\n if (!Number.isInteger(count) || count <= 0)\n throw new BRUtilsError(\"Count must be a positive integer.\");\n return Array.from({ length: count }, () =>\n generateCEP({ formatted: options.formatted, state: options.state })\n );\n}\n","import { allDigitsEqual } from \"../../core/utils/digits.js\";\nimport { formatCEP } from \"../../core/utils/format.js\";\nimport { normalizeCEP } from \"./cep.shared.js\";\nimport type { CEPValidateOptions, CEPValidationResult } from \"./cep.types.js\";\nexport function validateCEP(\n value: string,\n options: CEPValidateOptions = {}\n): CEPValidationResult {\n const digits = normalizeCEP(value);\n const hasValidLength = digits.length === 8;\n const passesStrictRules = !options.strict || !allDigitsEqual(digits);\n return {\n isValid: hasValidLength && passesStrictRules,\n value: digits,\n formatted: hasValidLength ? formatCEP(digits) : undefined\n };\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport { onlyDigits } from \"../../core/utils/digits.js\";\nexport function normalizeCNPJ(value: string): string {\n return onlyDigits(value);\n}\nexport function stripCNPJ(value: string): string {\n return normalizeCNPJ(value);\n}\nexport function ensureCNPJLength(value: string): string {\n const digits = normalizeCNPJ(value);\n if (digits.length !== 14)\n throw new BRUtilsError(\"CNPJ must contain exactly 14 digits.\");\n return digits;\n}\nexport function normalizeCNPJBranch(value?: string): string {\n const branch = normalizeCNPJ(value ?? \"0001\");\n if (!/^\\d{1,4}$/.test(branch))\n throw new BRUtilsError(\"Branch must contain between 1 and 4 digits.\");\n return branch.padStart(4, \"0\");\n}\nexport function calculateCNPJCheckDigit(digits: number[]): number {\n const weights =\n digits.length === 12\n ? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n : [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n const sum = digits.reduce(\n (acc, digit, index) => acc + digit * weights[index]!,\n 0\n );\n const remainder = sum % 11;\n return remainder < 2 ? 0 : 11 - remainder;\n}\nexport function resolveCNPJBranch(value: string): string | undefined {\n const digits = normalizeCNPJ(value);\n return digits.length < 12 ? undefined : digits.slice(8, 12);\n}\n","import { formatCNPJ } from \"../../core/utils/format.js\";\nimport { ensureCNPJLength, stripCNPJ } from \"./cnpj.shared.js\";\nexport function formatCNPJValue(value: string): string {\n return formatCNPJ(ensureCNPJLength(value));\n}\nexport { stripCNPJ };\n","import { applyDigitMask } from \"../../core/utils/mask.js\";\nimport { ensureCNPJLength } from \"./cnpj.shared.js\";\nimport type { CNPJMaskOptions } from \"./cnpj.types.js\";\nconst DEFAULT_CNPJ_MASK_PATTERN = \"**.***.***/****-##\";\nexport function maskCNPJ(value: string, options: CNPJMaskOptions = {}): string {\n return applyDigitMask(\n ensureCNPJLength(value),\n options.pattern ?? DEFAULT_CNPJ_MASK_PATTERN\n );\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport { formatCNPJ } from \"../../core/utils/format.js\";\nimport { randomDigits } from \"../../core/utils/random.js\";\nimport { calculateCNPJCheckDigit, normalizeCNPJBranch } from \"./cnpj.shared.js\";\nimport type {\n CNPJGenerateBatchOptions,\n CNPJGenerateOptions\n} from \"./cnpj.types.js\";\nexport function generateCNPJ(options: CNPJGenerateOptions = {}): string {\n const rootDigits = randomDigits(8);\n const branchDigits = normalizeCNPJBranch(options.branch)\n .split(\"\")\n .map(Number);\n const baseDigits = [...rootDigits, ...branchDigits];\n const firstCheckDigit = calculateCNPJCheckDigit(baseDigits);\n const secondCheckDigit = calculateCNPJCheckDigit([\n ...baseDigits,\n firstCheckDigit\n ]);\n const cnpj = [...baseDigits, firstCheckDigit, secondCheckDigit].join(\"\");\n return options.formatted ? formatCNPJ(cnpj) : cnpj;\n}\nexport function generateCNPJBatch(options: CNPJGenerateBatchOptions): string[] {\n const count = options.count;\n if (!Number.isInteger(count) || count <= 0)\n throw new BRUtilsError(\"Count must be a positive integer.\");\n if (!options.unique)\n return Array.from({ length: count }, () =>\n generateCNPJ({ formatted: options.formatted, branch: options.branch })\n );\n const seen = new Set<string>();\n const values: string[] = [];\n while (values.length < count) {\n const value = generateCNPJ({\n formatted: options.formatted,\n branch: options.branch\n });\n if (!seen.has(value)) {\n seen.add(value);\n values.push(value);\n }\n }\n return values;\n}\n","import { allDigitsEqual } from \"../../core/utils/digits.js\";\nimport { formatCNPJ } from \"../../core/utils/format.js\";\nimport {\n calculateCNPJCheckDigit,\n normalizeCNPJ,\n resolveCNPJBranch\n} from \"./cnpj.shared.js\";\nimport type {\n CNPJValidateOptions,\n CNPJValidationResult\n} from \"./cnpj.types.js\";\nexport function validateCNPJ(\n value: string,\n options: CNPJValidateOptions = {}\n): CNPJValidationResult {\n const digits = normalizeCNPJ(value);\n if (digits.length !== 14) return { isValid: false, value: digits };\n if (options.strict && allDigitsEqual(digits))\n return {\n isValid: false,\n value: digits,\n formatted: formatCNPJ(digits),\n branch: resolveCNPJBranch(digits)\n };\n const baseDigits = digits.slice(0, 12).split(\"\").map(Number);\n const firstCheckDigit = calculateCNPJCheckDigit(baseDigits);\n const secondCheckDigit = calculateCNPJCheckDigit([\n ...baseDigits,\n firstCheckDigit\n ]);\n const expectedCNPJ = [...baseDigits, firstCheckDigit, secondCheckDigit].join(\n \"\"\n );\n return {\n isValid: digits === expectedCNPJ,\n value: digits,\n formatted: formatCNPJ(digits),\n branch: resolveCNPJBranch(digits)\n };\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport { onlyDigits } from \"../../core/utils/digits.js\";\nimport type { CPFStateCode } from \"./cpf.types.js\";\nconst CPF_STATE_REGION_MAP: Record<CPFStateCode, number> = {\n AC: 2,\n AL: 4,\n AM: 2,\n AP: 2,\n BA: 5,\n CE: 3,\n DF: 1,\n ES: 7,\n GO: 1,\n MA: 3,\n MG: 6,\n MS: 1,\n MT: 1,\n PA: 2,\n PB: 4,\n PE: 4,\n PI: 3,\n PR: 9,\n RJ: 7,\n RN: 4,\n RO: 2,\n RR: 2,\n RS: 0,\n SC: 9,\n SE: 5,\n SP: 8,\n TO: 1\n};\nconst REGION_TO_STATE: Record<number, CPFStateCode> = {\n 0: \"RS\",\n 1: \"DF\",\n 2: \"AC\",\n 3: \"CE\",\n 4: \"AL\",\n 5: \"BA\",\n 6: \"MG\",\n 7: \"RJ\",\n 8: \"SP\",\n 9: \"PR\"\n};\nexport function normalizeCPF(value: string): string {\n return onlyDigits(value);\n}\nexport function stripCPF(value: string): string {\n return normalizeCPF(value);\n}\nexport function ensureCPFLength(value: string): string {\n const digits = normalizeCPF(value);\n if (digits.length !== 11)\n throw new BRUtilsError(\"CPF must contain exactly 11 digits.\");\n return digits;\n}\nexport function calculateCPFCheckDigit(digits: number[]): number {\n const factorStart = digits.length + 1;\n const sum = digits.reduce(\n (acc, digit, index) => acc + digit * (factorStart - index),\n 0\n );\n const remainder = (sum * 10) % 11;\n return remainder === 10 ? 0 : remainder;\n}\nexport function resolveCPFRegionDigit(\n state?: CPFStateCode\n): number | undefined {\n return state ? CPF_STATE_REGION_MAP[state] : undefined;\n}\nexport function resolveCPFStateFromDigits(\n value: string\n): CPFStateCode | undefined {\n const digits = normalizeCPF(value);\n if (digits.length < 9) return undefined;\n return REGION_TO_STATE[Number(digits[8])];\n}\n","import { formatCPF } from \"../../core/utils/format.js\";\nimport { ensureCPFLength, stripCPF } from \"./cpf.shared.js\";\nexport function formatCPFValue(value: string): string {\n return formatCPF(ensureCPFLength(value));\n}\nexport { stripCPF };\n","import { applyDigitMask } from \"../../core/utils/mask.js\";\nimport { ensureCPFLength } from \"./cpf.shared.js\";\nimport type { CPFMaskOptions } from \"./cpf.types.js\";\nconst DEFAULT_CPF_MASK_PATTERN = \"***.***.***-##\";\nexport function maskCPF(value: string, options: CPFMaskOptions = {}): string {\n return applyDigitMask(\n ensureCPFLength(value),\n options.pattern ?? DEFAULT_CPF_MASK_PATTERN\n );\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport { formatCPF } from \"../../core/utils/format.js\";\nimport { randomDigit, randomDigits } from \"../../core/utils/random.js\";\nimport { calculateCPFCheckDigit, resolveCPFRegionDigit } from \"./cpf.shared.js\";\nimport type {\n CPFGenerateBatchOptions,\n CPFGenerateOptions\n} from \"./cpf.types.js\";\nexport function generateCPF(options: CPFGenerateOptions = {}): string {\n const firstEightDigits = randomDigits(8);\n const regionDigit = resolveCPFRegionDigit(options.state) ?? randomDigit();\n const baseDigits = [...firstEightDigits, regionDigit];\n const firstCheckDigit = calculateCPFCheckDigit(baseDigits);\n const secondCheckDigit = calculateCPFCheckDigit([\n ...baseDigits,\n firstCheckDigit\n ]);\n const cpf = [...baseDigits, firstCheckDigit, secondCheckDigit].join(\"\");\n return options.formatted ? formatCPF(cpf) : cpf;\n}\nexport function generateCPFBatch(options: CPFGenerateBatchOptions): string[] {\n const count = options.count;\n if (!Number.isInteger(count) || count <= 0)\n throw new BRUtilsError(\"Count must be a positive integer.\");\n if (!options.unique)\n return Array.from({ length: count }, () =>\n generateCPF({ formatted: options.formatted, state: options.state })\n );\n const seen = new Set<string>();\n const values: string[] = [];\n while (values.length < count) {\n const value = generateCPF({\n formatted: options.formatted,\n state: options.state\n });\n if (!seen.has(value)) {\n seen.add(value);\n values.push(value);\n }\n }\n return values;\n}\n","import { allDigitsEqual } from \"../../core/utils/digits.js\";\nimport { formatCPF } from \"../../core/utils/format.js\";\nimport {\n calculateCPFCheckDigit,\n normalizeCPF,\n resolveCPFStateFromDigits\n} from \"./cpf.shared.js\";\nimport type { CPFValidateOptions, CPFValidationResult } from \"./cpf.types.js\";\nexport function validateCPF(\n value: string,\n options: CPFValidateOptions = {}\n): CPFValidationResult {\n const digits = normalizeCPF(value);\n if (digits.length !== 11) return { isValid: false, value: digits };\n if (options.strict && allDigitsEqual(digits))\n return { isValid: false, value: digits, formatted: formatCPF(digits) };\n const baseDigits = digits.slice(0, 9).split(\"\").map(Number);\n const firstCheckDigit = calculateCPFCheckDigit(baseDigits);\n const secondCheckDigit = calculateCPFCheckDigit([\n ...baseDigits,\n firstCheckDigit\n ]);\n const expectedCPF = [...baseDigits, firstCheckDigit, secondCheckDigit].join(\n \"\"\n );\n return {\n isValid: digits === expectedCPF,\n value: digits,\n formatted: formatCPF(digits),\n state: resolveCPFStateFromDigits(digits)\n };\n}\n","import type { CreditCardBrand } from \"./credit-card.types.js\";\n\nexport const CREDIT_CARD_BRAND_PREFIXES: Record<CreditCardBrand, string[]> = {\n visa: [\"4\"],\n mastercard: [\"51\", \"52\", \"53\", \"54\", \"55\"],\n amex: [\"34\", \"37\"],\n elo: [\n \"401178\",\n \"401179\",\n \"431274\",\n \"438935\",\n \"451416\",\n \"457393\",\n \"457631\",\n \"457632\",\n \"504175\",\n \"627780\",\n \"636297\",\n \"636368\"\n ]\n};\n\nexport const CREDIT_CARD_BRAND_LENGTHS: Record<CreditCardBrand, number[]> = {\n visa: [16],\n mastercard: [16],\n amex: [15],\n elo: [16]\n};\n\nexport const CREDIT_CARD_BRAND_CVV_LENGTH: Record<CreditCardBrand, number> = {\n visa: 3,\n mastercard: 3,\n amex: 4,\n elo: 3\n};\n","import { onlyDigits } from \"../../core/utils/digits.js\";\nimport {\n CREDIT_CARD_BRAND_LENGTHS,\n CREDIT_CARD_BRAND_PREFIXES\n} from \"./credit-card.constants.js\";\nimport type { CreditCardBrand } from \"./credit-card.types.js\";\n\nexport function detectCreditCardBrand(\n number: string\n): CreditCardBrand | \"unknown\" {\n const digits = onlyDigits(number);\n\n const brands = Object.keys(CREDIT_CARD_BRAND_PREFIXES) as CreditCardBrand[];\n\n for (const brand of brands) {\n const prefixes = CREDIT_CARD_BRAND_PREFIXES[brand];\n const lengths = CREDIT_CARD_BRAND_LENGTHS[brand];\n\n const matchesPrefix = prefixes.some((prefix) => digits.startsWith(prefix));\n const matchesLength = lengths.includes(digits.length);\n\n if (matchesPrefix && matchesLength) {\n return brand;\n }\n }\n\n return \"unknown\";\n}\n","import { BRUtilsError } from \"../errors/brutils.error.js\";\n\nexport type RandomSource = () => number;\n\nexport function pickRandomItem<T>(\n items: T[],\n randomSource: RandomSource = Math.random\n): T {\n const item = items[Math.floor(randomSource() * items.length)];\n\n if (item === undefined) {\n throw new BRUtilsError(\"Cannot pick a random item from an empty array.\");\n }\n\n return item;\n}\n\nexport function getItemAtIndex<T>(items: T[], index: number): T {\n const item = items[index];\n\n if (item === undefined) {\n throw new BRUtilsError(`Array index out of bounds: ${index}`);\n }\n\n return item;\n}\n\nexport function shuffleArray<T>(\n items: T[],\n randomSource: RandomSource = Math.random\n): T[] {\n const result = [...items];\n\n for (let index = result.length - 1; index > 0; index -= 1) {\n const swapIndex = Math.floor(randomSource() * (index + 1));\n\n const currentValue = getItemAtIndex(result, index);\n const swapValue = getItemAtIndex(result, swapIndex);\n\n result[index] = swapValue;\n result[swapIndex] = currentValue;\n }\n\n return result;\n}\n","import { onlyDigits } from \"../../core/utils/digits.js\";\nimport { pickRandomItem } from \"../../core/utils/array.js\";\nimport { randomDigit } from \"../../core/utils/random.js\";\nimport {\n CREDIT_CARD_BRAND_CVV_LENGTH,\n CREDIT_CARD_BRAND_LENGTHS,\n CREDIT_CARD_BRAND_PREFIXES\n} from \"./credit-card.constants.js\";\nimport type {\n CreditCardBrand,\n CreditCardData,\n CreditCardGenerateOptions\n} from \"./credit-card.types.js\";\n\nfunction generateRandomNumericString(length: number): string {\n return Array.from({ length }, () => String(randomDigit())).join(\"\");\n}\n\nfunction formatCreditCardNumber(value: string): string {\n return onlyDigits(value)\n .replace(/(\\d{4})(?=\\d)/g, \"$1 \")\n .trim();\n}\n\nfunction calculateLuhnCheckDigit(partialNumber: string): number {\n const digits = partialNumber.split(\"\").map(Number).reverse();\n\n const sum = digits.reduce((accumulator, digit, index) => {\n if (index % 2 === 0) {\n const doubled = digit * 2;\n return accumulator + (doubled > 9 ? doubled - 9 : doubled);\n }\n\n return accumulator + digit;\n }, 0);\n\n return (10 - (sum % 10)) % 10;\n}\n\nfunction generateCardNumber(brand: CreditCardBrand): string {\n const prefixes = CREDIT_CARD_BRAND_PREFIXES[brand];\n const lengths = CREDIT_CARD_BRAND_LENGTHS[brand];\n\n const prefix = pickRandomItem(prefixes);\n const totalLength = pickRandomItem(lengths);\n\n const bodyLength = totalLength - prefix.length - 1;\n\n const partialNumber = prefix + generateRandomNumericString(bodyLength);\n const checkDigit = calculateLuhnCheckDigit(partialNumber);\n\n return partialNumber + String(checkDigit);\n}\n\nfunction generateExpiry(expiryYearsAhead = 5): {\n expiryMonth: string;\n expiryYear: string;\n expiry: string;\n} {\n const now = new Date();\n const month = String(Math.floor(Math.random() * 12) + 1).padStart(2, \"0\");\n const futureYear =\n now.getFullYear() +\n Math.floor(Math.random() * Math.max(expiryYearsAhead, 1)) +\n 1;\n\n const yearTwoDigits = String(futureYear).slice(-2);\n\n return {\n expiryMonth: month,\n expiryYear: yearTwoDigits,\n expiry: `${month}/${yearTwoDigits}`\n };\n}\n\nfunction generateCVV(brand: CreditCardBrand): string {\n const length = CREDIT_CARD_BRAND_CVV_LENGTH[brand];\n return generateRandomNumericString(length);\n}\n\nexport function generateCreditCard(\n options: CreditCardGenerateOptions = {}\n): CreditCardData {\n const brand = options.brand ?? \"visa\";\n const rawNumber = generateCardNumber(brand);\n const number = options.formatted\n ? formatCreditCardNumber(rawNumber)\n : rawNumber;\n const { expiryMonth, expiryYear, expiry } = generateExpiry(\n options.expiryYearsAhead\n );\n const cvv = generateCVV(brand);\n\n return {\n brand,\n number,\n expiryMonth,\n expiryYear,\n expiry,\n cvv\n };\n}\n","import { onlyDigits } from \"../../core/utils/digits.js\";\nimport {\n CREDIT_CARD_BRAND_CVV_LENGTH,\n CREDIT_CARD_BRAND_LENGTHS\n} from \"./credit-card.constants.js\";\nimport { detectCreditCardBrand } from \"./credit-card.detector.js\";\nimport type {\n CreditCardValidationInput,\n CreditCardValidationResult\n} from \"./credit-card.types.js\";\n\nfunction isValidLuhn(number: string): boolean {\n const digits = onlyDigits(number);\n\n let sum = 0;\n let shouldDouble = false;\n\n for (let index = digits.length - 1; index >= 0; index -= 1) {\n let digit = Number(digits[index]);\n\n if (shouldDouble) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n shouldDouble = !shouldDouble;\n }\n\n return sum % 10 === 0;\n}\n\nfunction isValidExpiry(\n expiryMonth?: string,\n expiryYear?: string,\n expiry?: string\n): boolean {\n let month = expiryMonth;\n let year = expiryYear;\n\n if ((!month || !year) && expiry) {\n const match = expiry.match(/^(\\d{2})\\/(\\d{2})$/);\n if (!match) {\n return false;\n }\n\n month = match[1];\n year = match[2];\n }\n\n if (!month || !year) {\n return false;\n }\n\n const monthNumber = Number(month);\n const yearNumber = Number(year);\n\n if (monthNumber < 1 || monthNumber > 12) {\n return false;\n }\n\n const now = new Date();\n const currentYear = Number(String(now.getFullYear()).slice(-2));\n const currentMonth = now.getMonth() + 1;\n\n if (yearNumber > currentYear) {\n return true;\n }\n\n if (yearNumber === currentYear && monthNumber >= currentMonth) {\n return true;\n }\n\n return false;\n}\n\nfunction isValidCVV(brand: string, cvv?: string): boolean {\n if (!cvv) {\n return false;\n }\n\n const digits = onlyDigits(cvv);\n\n if (brand === \"unknown\") {\n return digits.length >= 3 && digits.length <= 4;\n }\n\n const expectedLength =\n CREDIT_CARD_BRAND_CVV_LENGTH[\n brand as keyof typeof CREDIT_CARD_BRAND_CVV_LENGTH\n ];\n\n return digits.length === expectedLength;\n}\n\nexport function validateCreditCard(\n input: CreditCardValidationInput\n): CreditCardValidationResult {\n const number = onlyDigits(input.number);\n const brand = detectCreditCardBrand(number);\n const numberValid =\n brand !== \"unknown\" &&\n CREDIT_CARD_BRAND_LENGTHS[brand].includes(number.length) &&\n isValidLuhn(number);\n\n const expiryValid = isValidExpiry(\n input.expiryMonth,\n input.expiryYear,\n input.expiry\n );\n\n const cvvValid = isValidCVV(brand, input.cvv);\n\n return {\n isValid: numberValid && expiryValid && cvvValid,\n brand,\n number,\n numberValid,\n expiryValid,\n cvvValid\n };\n}\n","import type { Command } from \"commander\";\n\nimport {\n formatCEPValue,\n generateCEP,\n generateCEPBatch,\n maskCEP,\n stripCEP,\n validateCEP,\n type CEPStateCode\n} from \"../../services/cep/index.js\";\nimport {\n formatCNPJValue,\n generateCNPJ,\n generateCNPJBatch,\n maskCNPJ,\n stripCNPJ,\n validateCNPJ\n} from \"../../services/cnpj/index.js\";\nimport {\n formatCPFValue,\n generateCPF,\n generateCPFBatch,\n maskCPF,\n stripCPF,\n validateCPF,\n type CPFStateCode\n} from \"../../services/cpf/index.js\";\nimport {\n detectCreditCardBrand,\n generateCreditCard,\n validateCreditCard,\n type CreditCardBrand\n} from \"../../services/credit-card/index.js\";\nimport { examples } from \"../shared/help.js\";\nimport {\n parseCardBrand,\n parsePositiveInteger,\n parseState\n} from \"../shared/parsers.js\";\nimport { printValue } from \"../ui/output.js\";\n\nexport function registerBrazilianCommands(program: Command): void {\n const cpf = program\n .command(\"cpf\")\n .description(\"Generate, validate, format, strip and mask CPF values.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils cpf generate --formatted\",\n \"brutils cpf generate --formatted --state SP --count 5 --unique\",\n \"brutils cpf validate 52998224725 --strict\",\n \"brutils cpf format 52998224725\",\n \"brutils cpf strip 529.982.247-25\",\n 'brutils cpf mask 52998224725 --mask \"***.###.***-##\"'\n ])\n );\n\n cpf\n .command(\"generate\")\n .description(\"Generate synthetic valid CPF values.\")\n .option(\"--formatted\", \"Return generated values with CPF punctuation.\")\n .option(\n \"--state <uf>\",\n \"Bias the region digit using a Brazilian state code.\",\n parseState\n )\n .option(\n \"--count <number>\",\n \"Generate multiple CPFs.\",\n parsePositiveInteger,\n 1\n )\n .option(\"--unique\", \"Avoid duplicates during batch generation.\")\n .action(\n (options: {\n formatted?: boolean;\n state?: CPFStateCode;\n count: number;\n unique?: boolean;\n }) => {\n const values =\n options.count > 1\n ? generateCPFBatch({\n formatted: options.formatted,\n state: options.state,\n count: options.count,\n unique: options.unique\n })\n : [\n generateCPF({\n formatted: options.formatted,\n state: options.state\n })\n ];\n\n printValue(values);\n }\n );\n\n cpf\n .command(\"validate\")\n .argument(\"<value>\", \"CPF value to validate.\")\n .description(\n \"Validate a CPF using size, check digits and optional strict repeated-pattern rejection.\"\n )\n .option(\"--strict\", \"Reject repeated patterns such as 11111111111.\")\n .action((value: string, options: { strict?: boolean }) => {\n printValue(validateCPF(value, { strict: options.strict }));\n });\n\n cpf\n .command(\"format\")\n .argument(\"<value>\", \"CPF value to format.\")\n .description(\"Format a CPF as 000.000.000-00.\")\n .action((value: string) => {\n printValue(formatCPFValue(value));\n });\n\n cpf\n .command(\"strip\")\n .argument(\"<value>\", \"CPF value to normalize to digits only.\")\n .description(\"Remove punctuation and keep digits only.\")\n .action((value: string) => {\n printValue(stripCPF(value));\n });\n\n cpf\n .command(\"mask\")\n .argument(\"<value>\", \"CPF value to mask.\")\n .description(\"Mask a CPF for safe display.\")\n .option(\n \"--mask <pattern>\",\n 'Custom mask. Use \"*\" to hide digits and \"#\" to reveal them.'\n )\n .action((value: string, options: { mask?: string }) => {\n printValue(maskCPF(value, { pattern: options.mask }));\n });\n\n const cnpj = program\n .command(\"cnpj\")\n .description(\"Generate, validate, format, strip and mask CNPJ values.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils cnpj generate --formatted\",\n \"brutils cnpj generate --branch 12 --count 3 --unique\",\n \"brutils cnpj validate 11.444.777/0001-61 --strict\",\n \"brutils cnpj format 11444777000161\",\n \"brutils cnpj strip 11.444.777/0001-61\",\n 'brutils cnpj mask 11444777000161 --mask \"##.***.***/****-##\"'\n ])\n );\n\n cnpj\n .command(\"generate\")\n .description(\"Generate synthetic valid CNPJ values.\")\n .option(\"--formatted\", \"Return generated values with CNPJ punctuation.\")\n .option(\n \"--branch <number>\",\n \"Force a branch identifier. Values are left-padded to 4 digits.\"\n )\n .option(\n \"--count <number>\",\n \"Generate multiple CNPJs.\",\n parsePositiveInteger,\n 1\n )\n .option(\"--unique\", \"Avoid duplicates during batch generation.\")\n .action(\n (options: {\n formatted?: boolean;\n branch?: string;\n count: number;\n unique?: boolean;\n }) => {\n const values =\n options.count > 1\n ? generateCNPJBatch({\n formatted: options.formatted,\n branch: options.branch,\n count: options.count,\n unique: options.unique\n })\n : [\n generateCNPJ({\n formatted: options.formatted,\n branch: options.branch\n })\n ];\n\n printValue(values);\n }\n );\n\n cnpj\n .command(\"validate\")\n .argument(\"<value>\", \"CNPJ value to validate.\")\n .description(\n \"Validate a CNPJ using size, check digits and optional strict repeated-pattern rejection.\"\n )\n .option(\"--strict\", \"Reject repeated patterns such as 00000000000000.\")\n .action((value: string, options: { strict?: boolean }) => {\n printValue(validateCNPJ(value, { strict: options.strict }));\n });\n\n cnpj\n .command(\"format\")\n .argument(\"<value>\", \"CNPJ value to format.\")\n .description(\"Format a CNPJ as 00.000.000/0000-00.\")\n .action((value: string) => {\n printValue(formatCNPJValue(value));\n });\n\n cnpj\n .command(\"strip\")\n .argument(\"<value>\", \"CNPJ value to normalize to digits only.\")\n .description(\"Remove punctuation and keep digits only.\")\n .action((value: string) => {\n printValue(stripCNPJ(value));\n });\n\n cnpj\n .command(\"mask\")\n .argument(\"<value>\", \"CNPJ value to mask.\")\n .description(\"Mask a CNPJ for safe display.\")\n .option(\n \"--mask <pattern>\",\n 'Custom mask. Use \"*\" to hide digits and \"#\" to reveal them.'\n )\n .action((value: string, options: { mask?: string }) => {\n printValue(maskCNPJ(value, { pattern: options.mask }));\n });\n\n const cep = program\n .command(\"cep\")\n .description(\"Generate, validate, format, strip and mask CEP values.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils cep generate --formatted\",\n \"brutils cep generate --state PR --count 5\",\n \"brutils cep validate 86010-190 --strict\",\n \"brutils cep format 86010190\",\n \"brutils cep strip 86010-190\",\n 'brutils cep mask 86010190 --mask \"###**-***\"'\n ])\n );\n\n cep\n .command(\"generate\")\n .description(\"Generate synthetic CEP values for testing.\")\n .option(\"--formatted\", \"Return generated values with CEP punctuation.\")\n .option(\n \"--state <uf>\",\n \"Bias the leading digit using a Brazilian state code.\",\n parseState\n )\n .option(\n \"--count <number>\",\n \"Generate multiple CEP values.\",\n parsePositiveInteger,\n 1\n )\n .action(\n (options: {\n formatted?: boolean;\n state?: CEPStateCode;\n count: number;\n }) => {\n const values =\n options.count > 1\n ? generateCEPBatch({\n formatted: options.formatted,\n state: options.state,\n count: options.count\n })\n : [\n generateCEP({\n formatted: options.formatted,\n state: options.state\n })\n ];\n\n printValue(values);\n }\n );\n\n cep\n .command(\"validate\")\n .argument(\"<value>\", \"CEP value to validate.\")\n .description(\n \"Validate CEP structure and optional strict repeated-pattern rejection.\"\n )\n .option(\"--strict\", \"Reject repeated patterns such as 11111111.\")\n .action((value: string, options: { strict?: boolean }) => {\n printValue(validateCEP(value, { strict: options.strict }));\n });\n\n cep\n .command(\"format\")\n .argument(\"<value>\", \"CEP value to format.\")\n .description(\"Format a CEP as 00000-000.\")\n .action((value: string) => {\n printValue(formatCEPValue(value));\n });\n\n cep\n .command(\"strip\")\n .argument(\"<value>\", \"CEP value to normalize to digits only.\")\n .description(\"Remove punctuation and keep digits only.\")\n .action((value: string) => {\n printValue(stripCEP(value));\n });\n\n cep\n .command(\"mask\")\n .argument(\"<value>\", \"CEP value to mask.\")\n .description(\"Mask a CEP for safe display.\")\n .option(\n \"--mask <pattern>\",\n 'Custom mask. Use \"*\" to hide digits and \"#\" to reveal them.'\n )\n .action((value: string, options: { mask?: string }) => {\n printValue(maskCEP(value, { pattern: options.mask }));\n });\n\n const creditCard = program\n .command(\"credit-card\")\n .alias(\"card\")\n .description(\"Generate, validate and detect test credit card data.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils credit-card generate --brand visa --formatted\",\n \"brutils credit-card validate --number 4111111111111111 --expiry 12/30 --cvv 123\",\n \"brutils credit-card validate --number 4111111111111111 --expiry-month 12 --expiry-year 30 --cvv 123\",\n \"brutils credit-card detect 4111111111111111\"\n ])\n );\n\n creditCard\n .command(\"generate\")\n .description(\"Generate synthetic card test data.\")\n .option(\"--brand <brand>\", \"Card brand to generate.\", parseCardBrand)\n .option(\"--formatted\", \"Return the card number with spaces every 4 digits.\")\n .option(\n \"--expiry-years-ahead <number>\",\n \"Maximum number of years ahead for generated expiry.\",\n parsePositiveInteger\n )\n .action(\n (options: {\n brand?: CreditCardBrand;\n formatted?: boolean;\n expiryYearsAhead?: number;\n }) => {\n printValue(generateCreditCard(options));\n }\n );\n\n creditCard\n .command(\"validate\")\n .description(\"Validate card number, expiry and CVV.\")\n .requiredOption(\"--number <value>\", \"Card number to validate.\")\n .option(\"--expiry <value>\", \"Expiry in MM/YY format.\")\n .option(\"--expiry-month <value>\", \"Expiry month.\")\n .option(\"--expiry-year <value>\", \"Expiry year.\")\n .requiredOption(\"--cvv <value>\", \"CVV to validate.\")\n .action(\n (options: {\n number: string;\n expiry?: string;\n expiryMonth?: string;\n expiryYear?: string;\n cvv: string;\n }) => {\n printValue(validateCreditCard(options));\n }\n );\n\n creditCard\n .command(\"detect\")\n .argument(\"<number>\", \"Card number to inspect.\")\n .description(\"Detect the card brand from a card number.\")\n .action((number: string) => {\n printValue(detectCreditCardBrand(number));\n });\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport type {\n DateAdjustOptions,\n DateDiffResult,\n DateDiffUnit,\n DateSnapshot,\n ParsedDateResult,\n TimeZoneConversionResult,\n UnixConversionResult\n} from \"./date.types.js\";\n\nconst DATE_DIFF_FACTORS: Record<DateDiffUnit, number> = {\n seconds: 1000,\n minutes: 60 * 1000,\n hours: 60 * 60 * 1000,\n days: 24 * 60 * 60 * 1000\n};\n\nfunction ensureValidDate(date: Date, input: string): void {\n if (Number.isNaN(date.getTime())) {\n throw new BRUtilsError(`Invalid date value: ${input}`);\n }\n}\n\nfunction parseDate(input: string): Date {\n const date = new Date(input);\n ensureValidDate(date, input);\n return date;\n}\n\nfunction ensureValidInteger(value: number | undefined, label: string): number {\n const resolved = value ?? 0;\n\n if (!Number.isInteger(resolved)) {\n throw new BRUtilsError(`${label} must be an integer.`);\n }\n\n return resolved;\n}\n\nfunction pad2(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction snapshot(date: Date): DateSnapshot {\n const unixMs = date.getTime();\n\n return {\n iso: date.toISOString(),\n unix: Math.floor(unixMs / 1000),\n unixMs\n };\n}\n\nfunction formatUtcDate(date: Date, pattern: string): string {\n const replacements: Record<string, string> = {\n YYYY: String(date.getUTCFullYear()),\n MM: pad2(date.getUTCMonth() + 1),\n DD: pad2(date.getUTCDate()),\n HH: pad2(date.getUTCHours()),\n mm: pad2(date.getUTCMinutes()),\n ss: pad2(date.getUTCSeconds())\n };\n\n return pattern.replace(\n /YYYY|MM|DD|HH|mm|ss/g,\n (token) => replacements[token]!\n );\n}\n\nfunction adjustDate(\n date: Date,\n options: DateAdjustOptions,\n multiplier: 1 | -1\n): Date {\n const days = ensureValidInteger(options.days, \"Days\");\n const hours = ensureValidInteger(options.hours, \"Hours\");\n const minutes = ensureValidInteger(options.minutes, \"Minutes\");\n const seconds = ensureValidInteger(options.seconds, \"Seconds\");\n\n const totalMs =\n days * DATE_DIFF_FACTORS.days +\n hours * DATE_DIFF_FACTORS.hours +\n minutes * DATE_DIFF_FACTORS.minutes +\n seconds * DATE_DIFF_FACTORS.seconds;\n\n return new Date(date.getTime() + multiplier * totalMs);\n}\n\nfunction ensureTimeZone(value: string): string {\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: value }).format(new Date());\n return value;\n } catch {\n throw new BRUtilsError(`Invalid time zone: ${value}`);\n }\n}\n\nfunction timeZoneParts(date: Date, timeZone: string): Record<string, string> {\n const formatter = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false\n });\n\n return formatter\n .formatToParts(date)\n .reduce<Record<string, string>>((acc, part) => {\n if (part.type !== \"literal\") {\n acc[part.type] = part.value;\n }\n\n return acc;\n }, {});\n}\n\nexport function currentDateTime(): DateSnapshot {\n return snapshot(new Date());\n}\n\nexport function formatDateValue(value: string, pattern: string): string {\n return formatUtcDate(parseDate(value), pattern);\n}\n\nexport function parseDateValue(value: string): ParsedDateResult {\n return {\n input: value,\n ...snapshot(parseDate(value))\n };\n}\n\nexport function addToDate(value: string, options: DateAdjustOptions): string {\n return adjustDate(parseDate(value), options, 1).toISOString();\n}\n\nexport function subtractFromDate(\n value: string,\n options: DateAdjustOptions\n): string {\n return adjustDate(parseDate(value), options, -1).toISOString();\n}\n\nexport function diffDates(\n from: string,\n to: string,\n unit: DateDiffUnit = \"seconds\"\n): DateDiffResult {\n const left = parseDate(from);\n const right = parseDate(to);\n const factor = DATE_DIFF_FACTORS[unit];\n const raw = (right.getTime() - left.getTime()) / factor;\n\n return {\n from,\n to,\n unit,\n value: Number(raw.toFixed(6))\n };\n}\n\nexport function convertDateToUnix(value: string): UnixConversionResult {\n return {\n input: value,\n sourceUnit: \"milliseconds\",\n ...snapshot(parseDate(value))\n };\n}\n\nexport function convertUnixValue(value: string | number): UnixConversionResult {\n const normalized = String(value).trim();\n\n if (!/^-?\\d+$/.test(normalized)) {\n throw new BRUtilsError(`Invalid Unix timestamp value: ${value}`);\n }\n\n const numeric = Number(normalized);\n const sourceUnit =\n Math.abs(numeric) >= 1_000_000_000_000 ? \"milliseconds\" : \"seconds\";\n const unixMs = sourceUnit === \"seconds\" ? numeric * 1000 : numeric;\n const date = new Date(unixMs);\n\n ensureValidDate(date, normalized);\n\n return {\n input: value,\n sourceUnit,\n ...snapshot(date)\n };\n}\n\nexport function convertDateToTimeZone(\n value: string,\n timeZone: string\n): TimeZoneConversionResult {\n const date = parseDate(value);\n const normalizedTimeZone = ensureTimeZone(timeZone);\n const parts = timeZoneParts(date, normalizedTimeZone);\n\n return {\n input: value,\n timeZone: normalizedTimeZone,\n formatted: `${parts.year}-${parts.month}-${parts.day} ${parts.hour}:${parts.minute}:${parts.second}`,\n iso: date.toISOString()\n };\n}\n\nexport const DATE_DIFF_UNITS: DateDiffUnit[] = [\n \"seconds\",\n \"minutes\",\n \"hours\",\n \"days\"\n];\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\n\nimport { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport type {\n ChecksumOptions,\n CompareHashOptions,\n CompareHashResult,\n FixedHashAlgorithm,\n HashSourceOptions,\n HmacOptions\n} from \"./hash.types.js\";\n\ninterface ResolvedHashSource {\n kind: \"text\" | \"file\";\n content: Buffer;\n}\n\nfunction resolveHashSource(options: HashSourceOptions): ResolvedHashSource {\n if (options.text !== undefined && options.file !== undefined) {\n throw new BRUtilsError(\"Use either --text or --file, not both.\");\n }\n\n if (options.text !== undefined) {\n return {\n kind: \"text\",\n content: Buffer.from(options.text, \"utf-8\")\n };\n }\n\n if (options.file !== undefined) {\n if (!fs.existsSync(options.file) || !fs.statSync(options.file).isFile()) {\n throw new BRUtilsError(`File does not exist: ${options.file}`);\n }\n\n return {\n kind: \"file\",\n content: fs.readFileSync(options.file)\n };\n }\n\n throw new BRUtilsError(\"One of --text or --file is required.\");\n}\n\nfunction normalizeAlgorithm(value: string): string {\n const algorithm = value.toLowerCase();\n\n if (!crypto.getHashes().includes(algorithm)) {\n throw new BRUtilsError(`Unsupported hash algorithm: ${value}`);\n }\n\n return algorithm;\n}\n\nfunction digestBuffer(buffer: Buffer, algorithm: string): string {\n return crypto\n .createHash(normalizeAlgorithm(algorithm))\n .update(buffer)\n .digest(\"hex\");\n}\n\nfunction normalizeExpectedHash(value: string): string {\n return value.trim().toLowerCase();\n}\n\nexport function computeHash(\n options: HashSourceOptions,\n algorithm: string\n): string {\n const source = resolveHashSource(options);\n return digestBuffer(source.content, algorithm);\n}\n\nexport function computeMd5(options: HashSourceOptions): string {\n return computeHash(options, \"md5\");\n}\n\nexport function computeSha1(options: HashSourceOptions): string {\n return computeHash(options, \"sha1\");\n}\n\nexport function computeSha256(options: HashSourceOptions): string {\n return computeHash(options, \"sha256\");\n}\n\nexport function computeSha512(options: HashSourceOptions): string {\n return computeHash(options, \"sha512\");\n}\n\nexport function computeHmac(options: HmacOptions): string {\n const source = resolveHashSource(options);\n\n return crypto\n .createHmac(normalizeAlgorithm(options.algo), options.key)\n .update(source.content)\n .digest(\"hex\");\n}\n\nexport function computeChecksum(options: ChecksumOptions): string {\n return computeHash({ file: options.file }, options.algo ?? \"sha256\");\n}\n\nexport function compareHash(options: CompareHashOptions): CompareHashResult {\n const source = resolveHashSource(options);\n const algorithm = normalizeAlgorithm(options.algo ?? \"sha256\");\n const actual = digestBuffer(source.content, algorithm);\n const expected = normalizeExpectedHash(options.expected);\n\n return {\n algorithm,\n actual,\n expected,\n matches: actual === expected,\n source: source.kind\n };\n}\n\nexport const FIXED_HASH_ALGORITHMS: FixedHashAlgorithm[] = [\n \"md5\",\n \"sha1\",\n \"sha256\",\n \"sha512\"\n];\n","import crypto from \"node:crypto\";\n\nimport { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport type {\n CharsetName,\n PasswordGenerateOptions,\n TokenGenerateOptions,\n UuidGenerateOptions\n} from \"./id.types.js\";\n\nconst LOWERCASE = \"abcdefghijklmnopqrstuvwxyz\";\nconst UPPERCASE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nconst DIGITS = \"0123456789\";\nconst SYMBOLS = \"!@#$%^&*()-_=+[]{};:,.?/|~\";\n\nconst CHARSET_MAP: Record<CharsetName, string> = {\n alnum: `${LOWERCASE}${UPPERCASE}${DIGITS}`,\n alpha: `${LOWERCASE}${UPPERCASE}`,\n numeric: DIGITS,\n hex: \"0123456789abcdef\",\n base64url: `${LOWERCASE}${UPPERCASE}${DIGITS}-_`,\n lower: LOWERCASE,\n upper: UPPERCASE\n};\n\nfunction ensurePositiveInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 1) {\n throw new BRUtilsError(`${label} must be a positive integer.`);\n }\n}\n\nfunction resolveCount(count?: number): number {\n const resolved = count ?? 1;\n ensurePositiveInteger(resolved, \"Count\");\n return resolved;\n}\n\nfunction resolveLength(length: number | undefined, fallback: number): number {\n const resolved = length ?? fallback;\n ensurePositiveInteger(resolved, \"Length\");\n return resolved;\n}\n\nfunction charsetByName(name: CharsetName): string {\n return CHARSET_MAP[name];\n}\n\nfunction randomCharacter(charset: string): string {\n return charset[crypto.randomInt(0, charset.length)]!;\n}\n\nfunction randomString(length: number, charset: string): string {\n return Array.from({ length }, () => randomCharacter(charset)).join(\"\");\n}\n\nfunction ensureNotEmptyCharset(charset: string): void {\n if (charset.length === 0) {\n throw new BRUtilsError(\n \"The selected options produced an empty character set.\"\n );\n }\n}\n\nfunction ensureUppercasePresence(value: string): string {\n if (/[A-Z]/.test(value)) {\n return value;\n }\n\n const index = crypto.randomInt(0, value.length);\n const replacement = randomCharacter(UPPERCASE);\n\n return `${value.slice(0, index)}${replacement}${value.slice(index + 1)}`;\n}\n\nfunction resolveTokenCharset(charset?: CharsetName): string {\n return charsetByName(charset ?? \"alnum\");\n}\n\nfunction resolvePasswordCharset(options: PasswordGenerateOptions): string {\n let charset = options.charset\n ? charsetByName(options.charset)\n : `${LOWERCASE}${UPPERCASE}${DIGITS}${SYMBOLS}`;\n\n if (options.noNumbers) {\n charset = charset.replace(/[0-9]/g, \"\");\n }\n\n if (options.noSymbols) {\n charset = charset.replace(/[!@#$%^&*()_=+[\\]{};:,.?/|~-]/g, \"\");\n }\n\n if (options.uppercase && !/[A-Z]/.test(charset)) {\n charset += UPPERCASE;\n }\n\n ensureNotEmptyCharset(charset);\n return charset;\n}\n\nexport function generateUuidValues(\n options: UuidGenerateOptions = {}\n): string[] {\n const count = resolveCount(options.count);\n return Array.from({ length: count }, () => crypto.randomUUID());\n}\n\nexport function generateTokenValues(\n options: TokenGenerateOptions = {}\n): string[] {\n const count = resolveCount(options.count);\n const length = resolveLength(options.length, 32);\n const charset = resolveTokenCharset(options.charset);\n\n return Array.from({ length: count }, () => randomString(length, charset));\n}\n\nexport function generatePasswordValues(\n options: PasswordGenerateOptions = {}\n): string[] {\n const count = resolveCount(options.count);\n const length = resolveLength(options.length, 16);\n const charset = resolvePasswordCharset(options);\n\n return Array.from({ length: count }, () => {\n let password = randomString(length, charset);\n\n if (options.uppercase) {\n password = ensureUppercasePresence(password);\n }\n\n return password;\n });\n}\n\nexport const CHARSET_NAMES: CharsetName[] = [\n \"alnum\",\n \"alpha\",\n \"numeric\",\n \"hex\",\n \"base64url\",\n \"lower\",\n \"upper\"\n];\n","import type { Command } from \"commander\";\n\nimport {\n addToDate,\n convertDateToTimeZone,\n convertDateToUnix,\n convertUnixValue,\n currentDateTime,\n diffDates,\n formatDateValue,\n parseDateValue,\n subtractFromDate,\n type DateDiffUnit\n} from \"../../services/date/index.js\";\nimport {\n computeChecksum,\n compareHash,\n computeHmac,\n computeMd5,\n computeSha1,\n computeSha256,\n computeSha512\n} from \"../../services/hash/index.js\";\nimport {\n generatePasswordValues,\n generateTokenValues,\n generateUuidValues,\n type CharsetName\n} from \"../../services/id/index.js\";\nimport { examples } from \"../shared/help.js\";\nimport {\n parseCharsetName,\n parseDateDiffUnit,\n parsePositiveInteger\n} from \"../shared/parsers.js\";\nimport { printValue } from \"../ui/output.js\";\n\nfunction printStringBatch(values: string[]): void {\n if (values.length === 1) {\n printValue(values[0]!);\n return;\n }\n\n printValue(values);\n}\n\nexport function registerHelperCommands(program: Command): void {\n const hash = program\n .command(\"hash\")\n .description(\"Digest helpers for text, files and HMAC operations.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils hash md5 --text hello\",\n \"brutils hash sha256 --file ./README.md\",\n \"brutils hash hmac --algo sha256 --key secret --text hello\",\n \"brutils hash checksum --file ./dist/cli.js --algo sha512\",\n \"brutils hash compare --file ./README.md --algo sha256 --expected <hash>\"\n ])\n );\n\n hash\n .command(\"md5\")\n .description(\"Compute an MD5 digest for text or a file.\")\n .option(\"--text <value>\", \"Inline value to hash.\")\n .option(\"--file <path>\", \"File to hash.\")\n .action((options: { text?: string; file?: string }) => {\n printValue(computeMd5(options));\n });\n\n hash\n .command(\"sha1\")\n .description(\"Compute a SHA-1 digest for text or a file.\")\n .option(\"--text <value>\", \"Inline value to hash.\")\n .option(\"--file <path>\", \"File to hash.\")\n .action((options: { text?: string; file?: string }) => {\n printValue(computeSha1(options));\n });\n\n hash\n .command(\"sha256\")\n .description(\"Compute a SHA-256 digest for text or a file.\")\n .option(\"--text <value>\", \"Inline value to hash.\")\n .option(\"--file <path>\", \"File to hash.\")\n .action((options: { text?: string; file?: string }) => {\n printValue(computeSha256(options));\n });\n\n hash\n .command(\"sha512\")\n .description(\"Compute a SHA-512 digest for text or a file.\")\n .option(\"--text <value>\", \"Inline value to hash.\")\n .option(\"--file <path>\", \"File to hash.\")\n .action((options: { text?: string; file?: string }) => {\n printValue(computeSha512(options));\n });\n\n hash\n .command(\"hmac\")\n .description(\"Compute an HMAC with a chosen algorithm.\")\n .requiredOption(\"--key <value>\", \"Secret key for the HMAC.\")\n .option(\"--algo <name>\", \"Hash algorithm to use.\", \"sha256\")\n .option(\"--text <value>\", \"Inline value to hash.\")\n .option(\"--file <path>\", \"File to hash.\")\n .action(\n (options: {\n key: string;\n algo: string;\n text?: string;\n file?: string;\n }) => {\n printValue(computeHmac(options));\n }\n );\n\n hash\n .command(\"checksum\")\n .description(\"Compute a digest for a file.\")\n .requiredOption(\"--file <path>\", \"File to hash.\")\n .option(\"--algo <name>\", \"Hash algorithm to use.\", \"sha256\")\n .action((options: { file: string; algo?: string }) => {\n printValue(computeChecksum(options));\n });\n\n hash\n .command(\"compare\")\n .description(\"Compare a computed hash against an expected value.\")\n .requiredOption(\"--expected <hash>\", \"Expected hash value.\")\n .option(\"--algo <name>\", \"Hash algorithm to use.\", \"sha256\")\n .option(\"--text <value>\", \"Inline value to hash.\")\n .option(\"--file <path>\", \"File to hash.\")\n .action(\n (options: {\n expected: string;\n algo?: string;\n text?: string;\n file?: string;\n }) => {\n printValue(compareHash(options));\n }\n );\n\n const id = program\n .command(\"id\")\n .description(\"UUID, token and password generation helpers.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils id uuid\",\n \"brutils id uuid --count 3\",\n \"brutils id token --length 24 --charset base64url\",\n \"brutils id password --length 20 --uppercase\",\n \"brutils id password --length 16 --no-symbols --no-numbers\"\n ])\n );\n\n id.command(\"uuid\")\n .description(\"Generate UUID values.\")\n .option(\n \"--count <number>\",\n \"How many UUIDs to generate.\",\n parsePositiveInteger,\n 1\n )\n .action((options: { count: number }) => {\n printStringBatch(generateUuidValues(options));\n });\n\n id.command(\"token\")\n .description(\"Generate random tokens.\")\n .option(\n \"--count <number>\",\n \"How many tokens to generate.\",\n parsePositiveInteger,\n 1\n )\n .option(\"--length <number>\", \"Desired token length.\", parsePositiveInteger)\n .option(\n \"--charset <name>\",\n \"Allowed character preset: alnum, alpha, numeric, hex, base64url, lower or upper.\",\n parseCharsetName\n )\n .action(\n (options: { count: number; length?: number; charset?: CharsetName }) => {\n printStringBatch(generateTokenValues(options));\n }\n );\n\n id.command(\"password\")\n .description(\"Generate strong passwords.\")\n .option(\n \"--count <number>\",\n \"How many passwords to generate.\",\n parsePositiveInteger,\n 1\n )\n .option(\n \"--length <number>\",\n \"Desired password length.\",\n parsePositiveInteger\n )\n .option(\n \"--charset <name>\",\n \"Allowed character preset: alnum, alpha, numeric, hex, base64url, lower or upper.\",\n parseCharsetName\n )\n .option(\"--no-symbols\", \"Exclude symbols from generated passwords.\")\n .option(\"--no-numbers\", \"Exclude digits from generated passwords.\")\n .option(\"--uppercase\", \"Ensure at least one uppercase letter.\")\n .action(\n (options: {\n count: number;\n length?: number;\n charset?: CharsetName;\n noSymbols?: boolean;\n noNumbers?: boolean;\n uppercase?: boolean;\n }) => {\n printStringBatch(generatePasswordValues(options));\n }\n );\n\n const date = program\n .command(\"date\")\n .description(\"Date formatting, arithmetic and timezone helpers.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils date now\",\n 'brutils date format --date 2024-01-02T03:04:05Z --pattern \"YYYY-MM-DD HH:mm:ss\"',\n \"brutils date add --date 2024-01-01T00:00:00Z --days 7\",\n \"brutils date diff --from 2024-01-01T00:00:00Z --to 2024-01-03T00:00:00Z --unit days\",\n \"brutils date unix --date 2024-01-01T00:00:00Z\",\n \"brutils date tz --from 2024-01-01T12:00:00Z --to America/Sao_Paulo\"\n ])\n );\n\n date\n .command(\"now\")\n .description(\"Print the current date and time.\")\n .action(() => {\n printValue(currentDateTime());\n });\n\n date\n .command(\"format\")\n .description(\"Format a date using a token pattern.\")\n .requiredOption(\"--date <value>\", \"Input date/time value.\")\n .requiredOption(\"--pattern <value>\", \"Formatting pattern.\")\n .action((options: { date: string; pattern: string }) => {\n printValue(formatDateValue(options.date, options.pattern));\n });\n\n date\n .command(\"parse\")\n .description(\"Parse a date string and return normalized metadata.\")\n .requiredOption(\"--date <value>\", \"Input date/time value.\")\n .action((options: { date: string }) => {\n printValue(parseDateValue(options.date));\n });\n\n date\n .command(\"add\")\n .description(\"Add time to a date.\")\n .requiredOption(\"--date <value>\", \"Input date/time value.\")\n .option(\"--days <number>\", \"Day delta.\", parsePositiveInteger)\n .option(\"--hours <number>\", \"Hour delta.\", parsePositiveInteger)\n .option(\"--minutes <number>\", \"Minute delta.\", parsePositiveInteger)\n .option(\"--seconds <number>\", \"Second delta.\", parsePositiveInteger)\n .action(\n (options: {\n date: string;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n }) => {\n printValue(addToDate(options.date, options));\n }\n );\n\n date\n .command(\"sub\")\n .description(\"Subtract time from a date.\")\n .requiredOption(\"--date <value>\", \"Input date/time value.\")\n .option(\"--days <number>\", \"Day delta.\", parsePositiveInteger)\n .option(\"--hours <number>\", \"Hour delta.\", parsePositiveInteger)\n .option(\"--minutes <number>\", \"Minute delta.\", parsePositiveInteger)\n .option(\"--seconds <number>\", \"Second delta.\", parsePositiveInteger)\n .action(\n (options: {\n date: string;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n }) => {\n printValue(subtractFromDate(options.date, options));\n }\n );\n\n date\n .command(\"diff\")\n .description(\"Calculate the difference between two dates.\")\n .requiredOption(\"--from <value>\", \"Source date/time value.\")\n .requiredOption(\"--to <value>\", \"Target date/time value.\")\n .option(\n \"--unit <name>\",\n \"Output unit: seconds, minutes, hours or days.\",\n parseDateDiffUnit,\n \"seconds\"\n )\n .action((options: { from: string; to: string; unit: DateDiffUnit }) => {\n printValue(diffDates(options.from, options.to, options.unit));\n });\n\n date\n .command(\"unix\")\n .argument(\"[value]\", \"Unix seconds or milliseconds to convert to ISO.\")\n .description(\"Convert to or from Unix timestamps.\")\n .option(\"--date <value>\", \"Date/time value to convert to Unix.\")\n .action((value: string | undefined, options: { date?: string }) => {\n if (options.date !== undefined) {\n printValue(convertDateToUnix(options.date));\n return;\n }\n\n if (value === undefined) {\n throw new Error(\"Provide either a positional unix value or --date.\");\n }\n\n printValue(convertUnixValue(value));\n });\n\n date\n .command(\"tz\")\n .description(\"Convert a date/time to a target time zone representation.\")\n .requiredOption(\"--from <value>\", \"Source date/time value.\")\n .requiredOption(\n \"--to <value>\",\n \"Target IANA time zone, such as America/Sao_Paulo.\"\n )\n .action((options: { from: string; to: string }) => {\n printValue(convertDateToTimeZone(options.from, options.to));\n });\n}\n","export type RandomSource = () => number;\n\nexport function createRandomSource(seed?: number): RandomSource {\n if (seed === undefined) {\n return Math.random;\n }\n\n let state = Math.trunc(seed) >>> 0;\n\n return () => {\n state = (state + 0x6d2b79f5) >>> 0;\n let value = state;\n value = Math.imul(value ^ (value >>> 15), value | 1);\n value ^= value + Math.imul(value ^ (value >>> 7), value | 61);\n\n return ((value ^ (value >>> 14)) >>> 0) / 4294967296;\n };\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport { createRandomSource } from \"../../core/utils/seeded-random.js\";\nimport type { NumberPickerOptions } from \"./number-picker.types.js\";\n\nfunction resolveMin(min?: number): number {\n return min ?? Number.MIN_SAFE_INTEGER;\n}\n\nfunction resolveMax(max?: number): number {\n return max ?? Number.MAX_SAFE_INTEGER;\n}\n\nexport function pickRandomNumber(options: NumberPickerOptions = {}): number {\n const min = resolveMin(options.min);\n const max = resolveMax(options.max);\n const randomSource = createRandomSource(options.seed);\n\n if (!Number.isInteger(min) || !Number.isInteger(max)) {\n throw new BRUtilsError(\"Minimum and maximum values must be integers.\");\n }\n\n if (min > max) {\n throw new BRUtilsError(\n \"Minimum value cannot be greater than maximum value.\"\n );\n }\n\n return Math.floor(randomSource() * (max - min + 1)) + min;\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport { pickRandomItem, shuffleArray } from \"../../core/utils/array.js\";\nimport { createRandomSource } from \"../../core/utils/seeded-random.js\";\nimport type {\n CoinFlipOptions,\n DiceRollOptions,\n RandomFloatGenerateOptions,\n RandomIntegerGenerateOptions,\n RandomPickOptions,\n RandomNumberGenerateOptions,\n RandomShuffleOptions\n} from \"./random-number.types.js\";\n\nfunction resolveIntegerMin(min?: number): number {\n return min ?? Number.MIN_SAFE_INTEGER;\n}\n\nfunction resolveIntegerMax(max?: number): number {\n return max ?? Number.MAX_SAFE_INTEGER;\n}\n\nfunction resolveFloatMin(min?: number): number {\n return min ?? 0;\n}\n\nfunction resolveFloatMax(max?: number): number {\n return max ?? 1;\n}\n\nfunction randomIntegerBetween(\n min: number,\n max: number,\n randomSource: () => number\n): number {\n return Math.floor(randomSource() * (max - min + 1)) + min;\n}\n\nfunction randomFloatBetween(\n min: number,\n max: number,\n randomSource: () => number\n): number {\n return randomSource() * (max - min) + min;\n}\n\nfunction validateRange(min: number, max: number, integerOnly = true): void {\n if (integerOnly && (!Number.isInteger(min) || !Number.isInteger(max))) {\n throw new BRUtilsError(\"Minimum and maximum values must be integers.\");\n }\n\n if (min > max) {\n throw new BRUtilsError(\n \"Minimum value cannot be greater than maximum value.\"\n );\n }\n}\n\nfunction validateCount(count: number): void {\n if (!Number.isInteger(count) || count < 1) {\n throw new BRUtilsError(\"Count must be a positive integer.\");\n }\n}\n\nfunction normalizePrecision(precision?: number): number | undefined {\n if (precision === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(precision) || precision < 0) {\n throw new BRUtilsError(\"Precision must be a non-negative integer.\");\n }\n\n return precision;\n}\n\nfunction normalizeItems(items: string[]): string[] {\n const normalized = items.map((item) => item.trim()).filter(Boolean);\n\n if (normalized.length === 0) {\n throw new BRUtilsError(\"At least one item must be provided.\");\n }\n\n return normalized;\n}\n\nfunction applyFloatPrecision(value: number, precision?: number): number {\n if (precision === undefined) {\n return value;\n }\n\n return Number(value.toFixed(precision));\n}\n\nexport function generateRandomIntegers(\n options: RandomIntegerGenerateOptions = {}\n): number[] {\n const min = resolveIntegerMin(options.min);\n const max = resolveIntegerMax(options.max);\n const count = options.count ?? 1;\n const unique = options.unique ?? false;\n const sorted = options.sorted ?? false;\n const randomSource = createRandomSource(options.seed);\n\n validateRange(min, max, true);\n validateCount(count);\n\n const availableNumbers = max - min + 1;\n\n if (unique && count > availableNumbers) {\n throw new BRUtilsError(\n \"Cannot generate more unique numbers than the available range size.\"\n );\n }\n\n let result: number[];\n\n if (unique) {\n const pool = Array.from(\n { length: availableNumbers },\n (_, index) => min + index\n );\n result = shuffleArray(pool, randomSource).slice(0, count);\n } else {\n result = Array.from({ length: count }, () =>\n randomIntegerBetween(min, max, randomSource)\n );\n }\n\n if (sorted) {\n result.sort((a, b) => a - b);\n }\n\n return result;\n}\n\nexport function generateRandomNumbers(\n options: RandomNumberGenerateOptions = {}\n): number[] {\n return generateRandomIntegers(options);\n}\n\nexport function generateRandomFloats(\n options: RandomFloatGenerateOptions = {}\n): number[] {\n const min = resolveFloatMin(options.min);\n const max = resolveFloatMax(options.max);\n const count = options.count ?? 1;\n const sorted = options.sorted ?? false;\n const precision = normalizePrecision(options.precision);\n const randomSource = createRandomSource(options.seed);\n\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n throw new BRUtilsError(\n \"Minimum and maximum values must be finite numbers.\"\n );\n }\n\n validateRange(min, max, false);\n validateCount(count);\n\n const result = Array.from({ length: count }, () =>\n applyFloatPrecision(randomFloatBetween(min, max, randomSource), precision)\n );\n\n if (sorted) {\n result.sort((a, b) => a - b);\n }\n\n return result;\n}\n\nexport function pickRandomItems(options: RandomPickOptions): string[] {\n const items = normalizeItems(options.items);\n const count = options.count ?? 1;\n const unique = options.unique ?? false;\n const randomSource = createRandomSource(options.seed);\n\n validateCount(count);\n\n if (unique && count > items.length) {\n throw new BRUtilsError(\n \"Cannot pick more unique items than the available item count.\"\n );\n }\n\n if (unique) {\n return shuffleArray(items, randomSource).slice(0, count);\n }\n\n return Array.from({ length: count }, () =>\n pickRandomItem(items, randomSource)\n );\n}\n\nexport function shuffleRandomItems(options: RandomShuffleOptions): string[] {\n return shuffleArray(\n normalizeItems(options.items),\n createRandomSource(options.seed)\n );\n}\n\nexport function rollDice(options: DiceRollOptions = {}): number[] {\n const faces = options.faces ?? 6;\n const count = options.count ?? 1;\n const randomSource = createRandomSource(options.seed);\n\n if (!Number.isInteger(faces) || faces < 2) {\n throw new BRUtilsError(\n \"Dice faces must be an integer greater than or equal to 2.\"\n );\n }\n\n validateCount(count);\n\n return Array.from({ length: count }, () =>\n randomIntegerBetween(1, faces, randomSource)\n );\n}\n\nexport function flipCoin(options: CoinFlipOptions = {}): \"heads\" | \"tails\" {\n const randomSource = createRandomSource(options.seed);\n\n return randomSource() < 0.5 ? \"heads\" : \"tails\";\n}\n","import fs from \"node:fs\";\n\nimport { parseJsonInput } from \"../../services/json/index.js\";\n\nexport function readTextSource(options: {\n text?: string;\n file?: string;\n}): string {\n if (options.text && options.file) {\n throw new Error(\"Use either --text or --file, not both.\");\n }\n\n if (options.text !== undefined) {\n return options.text;\n }\n\n if (options.file) {\n return fs.readFileSync(options.file, \"utf-8\");\n }\n\n throw new Error(\"One of --text or --file is required.\");\n}\n\nexport function normalizeStringList(value?: string | string[]): string[] {\n if (value === undefined) {\n return [];\n }\n\n return Array.isArray(value) ? value : [value];\n}\n\nexport function readSingleJsonSource(options: {\n file?: string;\n value?: string;\n}): {\n sourcePath?: string;\n raw: string;\n parsed: unknown;\n} {\n if (options.file && options.value) {\n throw new Error(\"Use either --file or --value, not both.\");\n }\n\n if (options.file) {\n const raw = fs.readFileSync(options.file, \"utf-8\");\n\n return {\n sourcePath: options.file,\n raw,\n parsed: parseJsonInput(raw)\n };\n }\n\n if (options.value !== undefined) {\n return {\n raw: options.value,\n parsed: parseJsonInput(options.value)\n };\n }\n\n throw new Error(\"One of --file or --value is required.\");\n}\n\nexport function readMultipleJsonSources(options: {\n file?: string | string[];\n value?: string | string[];\n}): unknown[] {\n const fileValues = normalizeStringList(options.file);\n const inlineValues = normalizeStringList(options.value);\n\n if (fileValues.length + inlineValues.length < 2) {\n throw new Error(\n \"Provide at least two JSON sources via --file and/or --value.\"\n );\n }\n\n return [\n ...fileValues.map((filePath) => {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n return parseJsonInput(raw);\n }),\n ...inlineValues.map((value) => parseJsonInput(value))\n ];\n}\n\nexport function readDiffJsonSource(value: string): unknown {\n if (fs.existsSync(value) && fs.statSync(value).isFile()) {\n return parseJsonInput(fs.readFileSync(value, \"utf-8\"));\n }\n\n return parseJsonInput(value);\n}\n\nexport function writeTextFile(pathValue: string, content: string): void {\n fs.writeFileSync(pathValue, content, \"utf-8\");\n}\n\nexport function readItems(items?: string, file?: string): string[] {\n if (items && file) {\n throw new Error(\"Use either --items or --file, not both.\");\n }\n\n if (!items && !file) {\n throw new Error(\"One of --items or --file is required.\");\n }\n\n if (items) {\n const parsed = items\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n\n if (parsed.length === 0) {\n throw new Error(\"The --items value did not produce any usable items.\");\n }\n\n return parsed;\n }\n\n const content = fs.readFileSync(file!, \"utf-8\");\n const parsed = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (parsed.length === 0) {\n throw new Error(\n \"The file passed to --file did not contain any usable items.\"\n );\n }\n\n return parsed;\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport type {\n JsonDiffEntry,\n JsonDiffResult,\n JsonValidationResult\n} from \"./json.types.js\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction cloneJsonValue<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction sortKeysDeep(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => sortKeysDeep(item));\n }\n\n if (isPlainObject(value)) {\n return Object.keys(value)\n .sort((left, right) => left.localeCompare(right))\n .reduce<Record<string, unknown>>((accumulator, key) => {\n accumulator[key] = sortKeysDeep(value[key]);\n return accumulator;\n }, {});\n }\n\n return value;\n}\n\nfunction formatYamlScalar(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (typeof value === \"string\") {\n if (/^[A-Za-z0-9_-]+$/.test(value)) {\n return value;\n }\n\n return JSON.stringify(value);\n }\n\n return JSON.stringify(value);\n}\n\nfunction toYamlLines(value: unknown, depth = 0): string[] {\n const indent = \" \".repeat(depth);\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return [`${indent}[]`];\n }\n\n return value.flatMap((item) => {\n if (Array.isArray(item) || isPlainObject(item)) {\n const nested = toYamlLines(item, depth + 1);\n return [`${indent}-`, ...nested];\n }\n\n return [`${indent}- ${formatYamlScalar(item)}`];\n });\n }\n\n if (isPlainObject(value)) {\n const keys = Object.keys(value);\n\n if (keys.length === 0) {\n return [`${indent}{}`];\n }\n\n return keys.flatMap((key) => {\n const child = value[key];\n\n if (Array.isArray(child) || isPlainObject(child)) {\n return [`${indent}${key}:`, ...toYamlLines(child, depth + 1)];\n }\n\n return [`${indent}${key}: ${formatYamlScalar(child)}`];\n });\n }\n\n return [`${indent}${formatYamlScalar(value)}`];\n}\n\nfunction parsePath(path: string): string[] {\n const segments = path.match(/[^.[\\]]+/g) ?? [];\n\n if (segments.length === 0) {\n throw new BRUtilsError(\"JSON path cannot be empty.\");\n }\n\n return segments;\n}\n\nfunction getContainerForPath(root: unknown, segments: string[]): unknown {\n let current: unknown = root;\n\n for (const segment of segments) {\n if (Array.isArray(current)) {\n const index = Number(segment);\n\n if (!Number.isInteger(index)) {\n return undefined;\n }\n\n current = current[index];\n continue;\n }\n\n if (isPlainObject(current)) {\n current = current[segment];\n continue;\n }\n\n return undefined;\n }\n\n return current;\n}\n\nfunction appendDiffPath(basePath: string, segment: string | number): string {\n if (typeof segment === \"number\") {\n return `${basePath}[${segment}]`;\n }\n\n return basePath === \"$\" ? `$.${segment}` : `${basePath}.${segment}`;\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction diffValues(\n left: unknown,\n right: unknown,\n basePath = \"$\"\n): JsonDiffEntry[] {\n if (deepEqual(left, right)) {\n return [];\n }\n\n if (Array.isArray(left) && Array.isArray(right)) {\n const result: JsonDiffEntry[] = [];\n const maxLength = Math.max(left.length, right.length);\n\n for (let index = 0; index < maxLength; index += 1) {\n if (index >= left.length) {\n result.push({\n path: appendDiffPath(basePath, index),\n type: \"added\",\n right: right[index]\n });\n continue;\n }\n\n if (index >= right.length) {\n result.push({\n path: appendDiffPath(basePath, index),\n type: \"removed\",\n left: left[index]\n });\n continue;\n }\n\n result.push(\n ...diffValues(\n left[index],\n right[index],\n appendDiffPath(basePath, index)\n )\n );\n }\n\n return result;\n }\n\n if (isPlainObject(left) && isPlainObject(right)) {\n const result: JsonDiffEntry[] = [];\n const keys = new Set([...Object.keys(left), ...Object.keys(right)]);\n\n for (const key of Array.from(keys).sort((a, b) => a.localeCompare(b))) {\n if (!(key in left)) {\n result.push({\n path: appendDiffPath(basePath, key),\n type: \"added\",\n right: right[key]\n });\n continue;\n }\n\n if (!(key in right)) {\n result.push({\n path: appendDiffPath(basePath, key),\n type: \"removed\",\n left: left[key]\n });\n continue;\n }\n\n result.push(\n ...diffValues(left[key], right[key], appendDiffPath(basePath, key))\n );\n }\n\n return result;\n }\n\n return [\n {\n path: basePath,\n type: \"changed\",\n left,\n right\n }\n ];\n}\n\nfunction deepMerge(left: unknown, right: unknown): unknown {\n if (Array.isArray(left) && Array.isArray(right)) {\n return cloneJsonValue(right);\n }\n\n if (isPlainObject(left) && isPlainObject(right)) {\n const result: Record<string, unknown> = cloneJsonValue(left);\n\n for (const [key, value] of Object.entries(right)) {\n if (key in result) {\n result[key] = deepMerge(result[key], value);\n } else {\n result[key] = cloneJsonValue(value);\n }\n }\n\n return result;\n }\n\n return cloneJsonValue(right);\n}\n\nexport function parseJsonInput(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown JSON parse error.\";\n throw new BRUtilsError(message);\n }\n}\n\nexport function validateJsonInput(value: string): JsonValidationResult {\n try {\n JSON.parse(value);\n return { isValid: true };\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown JSON parse error.\";\n return { isValid: false, error: message };\n }\n}\n\nexport function formatJsonValue(\n value: unknown,\n indent = 2,\n sortKeys = false\n): string {\n if (!Number.isInteger(indent) || indent < 0) {\n throw new BRUtilsError(\"Indent must be a non-negative integer.\");\n }\n\n const normalized = sortKeys ? sortKeysDeep(value) : value;\n return JSON.stringify(normalized, null, indent);\n}\n\nexport function minifyJsonValue(value: unknown): string {\n return JSON.stringify(value);\n}\n\nexport function getJsonPathValue(value: unknown, path: string): unknown {\n return getContainerForPath(value, parsePath(path));\n}\n\nexport function setJsonPathValue(\n value: unknown,\n path: string,\n newValue: unknown\n): unknown {\n const root = cloneJsonValue(value);\n const segments = parsePath(path);\n let current: unknown = root;\n\n segments.forEach((segment, index) => {\n const isLast = index === segments.length - 1;\n const nextSegment = segments[index + 1];\n const nextShouldBeArray =\n nextSegment !== undefined && /^\\d+$/.test(nextSegment);\n\n if (Array.isArray(current)) {\n const currentIndex = Number(segment);\n\n if (!Number.isInteger(currentIndex)) {\n throw new BRUtilsError(`Invalid array index in path: ${segment}`);\n }\n\n if (isLast) {\n current[currentIndex] = newValue;\n return;\n }\n\n if (current[currentIndex] === undefined) {\n current[currentIndex] = nextShouldBeArray ? [] : {};\n }\n\n current = current[currentIndex];\n return;\n }\n\n if (!isPlainObject(current)) {\n throw new BRUtilsError(`Cannot set nested path at segment: ${segment}`);\n }\n\n if (isLast) {\n current[segment] = newValue;\n return;\n }\n\n if (current[segment] === undefined) {\n current[segment] = nextShouldBeArray ? [] : {};\n }\n\n current = current[segment];\n });\n\n return root;\n}\n\nexport function deleteJsonPathValue(value: unknown, path: string): unknown {\n const root = cloneJsonValue(value);\n const segments = parsePath(path);\n const parent = getContainerForPath(root, segments.slice(0, -1));\n const lastSegment = segments[segments.length - 1]!;\n\n if (Array.isArray(parent)) {\n const index = Number(lastSegment);\n\n if (!Number.isInteger(index)) {\n throw new BRUtilsError(`Invalid array index in path: ${lastSegment}`);\n }\n\n parent.splice(index, 1);\n return root;\n }\n\n if (isPlainObject(parent)) {\n delete parent[lastSegment];\n return root;\n }\n\n if (segments.length === 1 && isPlainObject(root)) {\n delete root[lastSegment];\n return root;\n }\n\n throw new BRUtilsError(`Path not found: ${path}`);\n}\n\nexport function diffJsonValues(left: unknown, right: unknown): JsonDiffResult {\n const changes = diffValues(left, right);\n return {\n isEqual: changes.length === 0,\n changes\n };\n}\n\nexport function mergeJsonValues(values: unknown[]): unknown {\n if (values.length < 2) {\n throw new BRUtilsError(\"Merge requires at least two JSON sources.\");\n }\n\n return values.slice(1).reduce((accumulator, current) => {\n return deepMerge(accumulator, current);\n }, cloneJsonValue(values[0]));\n}\n\nexport function convertJsonToYaml(value: unknown): string {\n return toYamlLines(value).join(\"\\n\");\n}\n","import type { Command } from \"commander\";\n\nimport { pickRandomNumber } from \"../../services/number-picker/index.js\";\nimport {\n flipCoin,\n generateRandomFloats,\n generateRandomIntegers,\n pickRandomItems,\n rollDice,\n shuffleRandomItems\n} from \"../../services/random-number/index.js\";\nimport { type RandomOutputFormat } from \"../shared/constants.js\";\nimport { examples } from \"../shared/help.js\";\nimport { readItems } from \"../shared/io.js\";\nimport {\n parseInteger,\n parseNumber,\n parsePositiveInteger,\n parseRandomFormat\n} from \"../shared/parsers.js\";\nimport { printRandomValues, printValue } from \"../ui/output.js\";\n\nexport function registerRandomCommands(program: Command): void {\n const randomNumber = program\n .command(\"random-number\")\n .alias(\"rand\")\n .description(\n \"Generate random integers, floats, picks, shuffles, dice rolls and coin flips.\"\n )\n .addHelpText(\n \"after\",\n examples([\n \"brutils random-number int --min 1 --max 100 --count 5 --sorted\",\n \"brutils random-number float --min 0 --max 1 --count 3 --precision 4\",\n 'brutils random-number pick --items \"red,blue,green\" --count 2 --unique',\n \"brutils random-number shuffle --file ./items.txt\",\n \"brutils random-number dice --faces 20 --count 2\",\n \"brutils random-number coin --seed 42\"\n ])\n );\n\n randomNumber\n .command(\"int\")\n .alias(\"generate\")\n .description(\"Generate random integers within a range.\")\n .option(\"--min <number>\", \"Minimum integer value.\", parseInteger)\n .option(\"--max <number>\", \"Maximum integer value.\", parseInteger)\n .option(\n \"--count <number>\",\n \"How many values to generate.\",\n parsePositiveInteger,\n 1\n )\n .option(\"--unique\", \"Avoid duplicates when generating multiple values.\")\n .option(\"--sorted\", \"Sort the generated values in ascending order.\")\n .option(\n \"--seed <number>\",\n \"Seed used for deterministic output.\",\n parseInteger\n )\n .option(\n \"--format <mode>\",\n \"Output mode: plain, json or csv.\",\n parseRandomFormat,\n \"plain\"\n )\n .action(\n (options: {\n min?: number;\n max?: number;\n count: number;\n unique?: boolean;\n sorted?: boolean;\n seed?: number;\n format: RandomOutputFormat;\n }) => {\n printRandomValues(generateRandomIntegers(options), options.format);\n }\n );\n\n randomNumber\n .command(\"float\")\n .description(\"Generate random floating-point numbers within a range.\")\n .option(\"--min <number>\", \"Minimum numeric value.\", parseNumber)\n .option(\"--max <number>\", \"Maximum numeric value.\", parseNumber)\n .option(\n \"--count <number>\",\n \"How many values to generate.\",\n parsePositiveInteger,\n 1\n )\n .option(\"--sorted\", \"Sort the generated values in ascending order.\")\n .option(\n \"--precision <number>\",\n \"Number of decimal places to preserve.\",\n parsePositiveInteger\n )\n .option(\n \"--seed <number>\",\n \"Seed used for deterministic output.\",\n parseInteger\n )\n .option(\n \"--format <mode>\",\n \"Output mode: plain, json or csv.\",\n parseRandomFormat,\n \"plain\"\n )\n .action(\n (options: {\n min?: number;\n max?: number;\n count: number;\n sorted?: boolean;\n precision?: number;\n seed?: number;\n format: RandomOutputFormat;\n }) => {\n printRandomValues(generateRandomFloats(options), options.format);\n }\n );\n\n randomNumber\n .command(\"pick\")\n .description(\"Pick one or more items from a list.\")\n .option(\"--items <csv>\", \"Comma-separated items to pick from.\")\n .option(\n \"--file <path>\",\n \"Read source items from a text file (one per line).\"\n )\n .option(\n \"--count <number>\",\n \"How many items to pick.\",\n parsePositiveInteger,\n 1\n )\n .option(\"--unique\", \"Avoid duplicate picks when possible.\")\n .option(\n \"--seed <number>\",\n \"Seed used for deterministic output.\",\n parseInteger\n )\n .option(\n \"--format <mode>\",\n \"Output mode: plain, json or csv.\",\n parseRandomFormat,\n \"plain\"\n )\n .action(\n (options: {\n items?: string;\n file?: string;\n count: number;\n unique?: boolean;\n seed?: number;\n format: RandomOutputFormat;\n }) => {\n const values = pickRandomItems({\n items: readItems(options.items, options.file),\n count: options.count,\n ...(options.unique !== undefined ? { unique: options.unique } : {}),\n ...(options.seed !== undefined ? { seed: options.seed } : {})\n });\n\n printRandomValues(values, options.format);\n }\n );\n\n randomNumber\n .command(\"shuffle\")\n .description(\"Shuffle a list of items.\")\n .option(\"--items <csv>\", \"Comma-separated items to shuffle.\")\n .option(\n \"--file <path>\",\n \"Read source items from a text file (one per line).\"\n )\n .option(\n \"--seed <number>\",\n \"Seed used for deterministic output.\",\n parseInteger\n )\n .option(\n \"--format <mode>\",\n \"Output mode: plain, json or csv.\",\n parseRandomFormat,\n \"plain\"\n )\n .action(\n (options: {\n items?: string;\n file?: string;\n seed?: number;\n format: RandomOutputFormat;\n }) => {\n const values = shuffleRandomItems({\n items: readItems(options.items, options.file),\n ...(options.seed !== undefined ? { seed: options.seed } : {})\n });\n\n printRandomValues(values, options.format);\n }\n );\n\n randomNumber\n .command(\"dice\")\n .description(\"Roll one or more dice.\")\n .option(\n \"--faces <number>\",\n \"Number of faces on the die.\",\n parsePositiveInteger,\n 6\n )\n .option(\n \"--count <number>\",\n \"How many rolls to generate.\",\n parsePositiveInteger,\n 1\n )\n .option(\n \"--seed <number>\",\n \"Seed used for deterministic output.\",\n parseInteger\n )\n .option(\n \"--format <mode>\",\n \"Output mode: plain, json or csv.\",\n parseRandomFormat,\n \"plain\"\n )\n .action(\n (options: {\n faces: number;\n count: number;\n seed?: number;\n format: RandomOutputFormat;\n }) => {\n printRandomValues(rollDice(options), options.format);\n }\n );\n\n randomNumber\n .command(\"coin\")\n .description(\"Flip a coin once.\")\n .option(\n \"--seed <number>\",\n \"Seed used for deterministic output.\",\n parseInteger\n )\n .action((options: { seed?: number }) => {\n printValue(flipCoin(options));\n });\n\n const numberPicker = program\n .command(\"number-picker\")\n .alias(\"pick-number\")\n .description(\"Pick a single random integer within a range.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils number-picker run --min 1 --max 10\",\n \"brutils number-picker run --min 100 --max 999 --seed 42\"\n ])\n );\n\n numberPicker\n .command(\"run\")\n .description(\"Pick one random integer.\")\n .option(\"--min <number>\", \"Minimum integer value.\", parseInteger)\n .option(\"--max <number>\", \"Maximum integer value.\", parseInteger)\n .option(\n \"--seed <number>\",\n \"Seed used for deterministic output.\",\n parseInteger\n )\n .action((options: { min?: number; max?: number; seed?: number }) => {\n printValue(pickRandomNumber(options));\n });\n}\n","import { BRUtilsError } from \"../../core/errors/brutils.error.js\";\nimport type {\n ExtractTextOptions,\n PadTextOptions,\n ReplaceTextOptions,\n StringCaseStyle,\n StringCodecMode,\n StringPadSide,\n TruncateTextOptions\n} from \"./str.types.js\";\n\nfunction ensureNonNegativeInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new BRUtilsError(`${label} must be a non-negative integer.`);\n }\n}\n\nfunction splitWords(value: string): string[] {\n return value\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\")\n .replace(/[_\\-.]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((word) => word.toLowerCase());\n}\n\nfunction capitalize(word: string): string {\n if (word.length === 0) {\n return word;\n }\n\n return word[0]!.toUpperCase() + word.slice(1).toLowerCase();\n}\n\nfunction encodeHtmlEntities(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n}\n\nfunction buildGlobalRegex(pattern: string): RegExp {\n try {\n return new RegExp(pattern, \"g\");\n } catch {\n throw new BRUtilsError(`Invalid regex pattern: ${pattern}`);\n }\n}\n\nfunction extractUsingDelimiters(value: string, query: string): string[] {\n const separatorIndex = query.indexOf(\"|\");\n\n if (separatorIndex === -1) {\n throw new BRUtilsError(\n 'Delimiter extraction expects a query in the format \"start|end\".'\n );\n }\n\n const startDelimiter = query.slice(0, separatorIndex);\n const endDelimiter = query.slice(separatorIndex + 1);\n\n if (startDelimiter.length === 0 || endDelimiter.length === 0) {\n throw new BRUtilsError(\n \"Delimiter extraction expects non-empty start and end delimiters.\"\n );\n }\n\n const matches: string[] = [];\n let cursor = 0;\n\n while (cursor < value.length) {\n const startIndex = value.indexOf(startDelimiter, cursor);\n\n if (startIndex === -1) {\n break;\n }\n\n const contentStart = startIndex + startDelimiter.length;\n const endIndex = value.indexOf(endDelimiter, contentStart);\n\n if (endIndex === -1) {\n break;\n }\n\n matches.push(value.slice(contentStart, endIndex));\n cursor = endIndex + endDelimiter.length;\n }\n\n return matches;\n}\n\nexport function slugifyText(value: string): string {\n return removeAccents(value)\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-{2,}/g, \"-\");\n}\n\nexport function convertStringCase(\n value: string,\n style: StringCaseStyle\n): string {\n const words = splitWords(value);\n\n if (words.length === 0) {\n return \"\";\n }\n\n switch (style) {\n case \"camel\":\n return words[0]! + words.slice(1).map(capitalize).join(\"\");\n case \"snake\":\n return words.join(\"_\");\n case \"kebab\":\n return words.join(\"-\");\n case \"pascal\":\n return words.map(capitalize).join(\"\");\n case \"constant\":\n return words.join(\"_\").toUpperCase();\n case \"title\":\n return words.map(capitalize).join(\" \");\n }\n}\n\nexport function trimText(value: string): string {\n return value.trim();\n}\n\nexport function truncateText(\n value: string,\n options: TruncateTextOptions\n): string {\n ensureNonNegativeInteger(options.max, \"Maximum length\");\n\n if (value.length <= options.max) {\n return value;\n }\n\n const suffix = options.suffix ?? \"\";\n\n if (suffix.length >= options.max) {\n return suffix.slice(0, options.max);\n }\n\n return value.slice(0, options.max - suffix.length) + suffix;\n}\n\nexport function replaceText(\n value: string,\n options: ReplaceTextOptions\n): string {\n if (options.regex) {\n return value.replace(buildGlobalRegex(options.from), options.with);\n }\n\n return value.replaceAll(options.from, options.with);\n}\n\nexport function normalizeText(value: string): string {\n return value.normalize(\"NFC\");\n}\n\nexport function removeAccents(value: string): string {\n return value.normalize(\"NFD\").replace(/[̀-ͯ]/g, \"\");\n}\n\nexport function padText(value: string, options: PadTextOptions): string {\n ensureNonNegativeInteger(options.length, \"Target length\");\n\n const side: StringPadSide = options.side ?? \"right\";\n\n if (value.length >= options.length) {\n return value;\n }\n\n switch (side) {\n case \"left\":\n return value.padStart(options.length);\n case \"right\":\n return value.padEnd(options.length);\n case \"both\": {\n const totalPadding = options.length - value.length;\n const leftPadding = Math.floor(totalPadding / 2);\n const rightPadding = totalPadding - leftPadding;\n return `${\" \".repeat(leftPadding)}${value}${\" \".repeat(rightPadding)}`;\n }\n }\n}\n\nexport function extractText(\n value: string,\n query: string,\n options: ExtractTextOptions = {}\n): string[] {\n if (options.regex) {\n const matches = Array.from(value.matchAll(buildGlobalRegex(query)));\n\n return matches.flatMap((match) => {\n const groups = match\n .slice(1)\n .filter((group): group is string => group !== undefined);\n return groups.length > 0 ? groups : [match[0]];\n });\n }\n\n return extractUsingDelimiters(value, query);\n}\n\nexport function transformBase64(\n value: string,\n mode: StringCodecMode = \"encode\"\n): string {\n if (mode === \"decode\") {\n return Buffer.from(value, \"base64\").toString(\"utf-8\");\n }\n\n return Buffer.from(value, \"utf-8\").toString(\"base64\");\n}\n\nexport function transformUrlEncoding(\n value: string,\n mode: StringCodecMode = \"encode\"\n): string {\n if (mode === \"decode\") {\n return decodeURIComponent(value);\n }\n\n return encodeURIComponent(value);\n}\n\nexport function transformHtmlEntities(\n value: string,\n mode: StringCodecMode = \"encode\"\n): string {\n if (mode === \"decode\") {\n return decodeHtmlEntities(value);\n }\n\n return encodeHtmlEntities(value);\n\n}\n\nexport function getLevenshteinDistance(a: string, b: string): number {\n a = a.trim()\n b = b.trim()\n \n const n = a.length;\n const m = b.length;\n\n const dp: number[][] = Array.from({ length: n + 1 }, () =>\n new Array(m + 1).fill(0)\n );\n\n for (let i = 0; i <= n; i++) dp[i]![0] = i;\n for (let j = 0; j <= m; j++) dp[0]![j] = j;\n\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\n dp[i]![j] = Math.min(\n dp[i - 1]![j]! + 1,\n dp[i]![j - 1]! + 1,\n dp[i - 1]![j - 1]! + cost\n );\n }\n }\n\n return dp[n]![m]!;\n}","import type { Command } from \"commander\";\n\nimport {\n convertJsonToYaml,\n deleteJsonPathValue,\n diffJsonValues,\n formatJsonValue,\n getJsonPathValue,\n mergeJsonValues,\n minifyJsonValue,\n parseJsonInput,\n setJsonPathValue,\n validateJsonInput\n} from \"../../services/json/index.js\";\nimport {\n convertStringCase,\n extractText,\n getLevenshteinDistance,\n normalizeText,\n padText,\n removeAccents,\n replaceText,\n slugifyText,\n transformBase64,\n transformHtmlEntities,\n transformUrlEncoding,\n trimText,\n truncateText,\n type StringCaseStyle,\n type StringCodecMode,\n type StringPadSide\n} from \"../../services/str/index.js\";\nimport { examples } from \"../shared/help.js\";\nimport {\n readDiffJsonSource,\n readMultipleJsonSources,\n readSingleJsonSource,\n readTextSource,\n writeTextFile\n} from \"../shared/io.js\";\nimport {\n parseInteger,\n parsePositiveInteger,\n parseStringCaseStyle,\n parseStringCodecMode,\n parseStringPadSide\n} from \"../shared/parsers.js\";\nimport { printValue } from \"../ui/output.js\";\n\nexport function registerTextDataCommands(program: Command): void {\n const str = program\n .command(\"str\")\n .description(\"String transformations and encoding helpers.\")\n .addHelpText(\n \"after\",\n examples([\n 'brutils str slug --text \"Hello Cool World\"',\n 'brutils str case --text \"my cool variable\" --to camel',\n 'brutils str truncate --text \"hello world\" --max 8 --suffix \"...\"',\n 'brutils str replace --text \"hello 123\" --from \"\\\\\\\\d+\" --with \"X\" --regex',\n 'brutils str extract \"\\\\\\\\[(.*?)\\\\\\\\]\" --text \"[one] [two]\" --regex',\n 'brutils str base64 --text \"hello\" --mode encode',\n 'brutils str leven \"kitten\" \"sitting\"'\n ])\n );\n\n str\n .command(\"slug\")\n .description(\"Convert text to a URL-friendly slug.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .action((options: { text?: string; file?: string }) => {\n printValue(slugifyText(readTextSource(options)));\n });\n\n str\n .command(\"case\")\n .description(\"Convert text between casing styles.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .requiredOption(\n \"--to <style>\",\n \"Target style: camel, snake, kebab, pascal, constant or title.\",\n parseStringCaseStyle\n )\n .action(\n (options: { text?: string; file?: string; to: StringCaseStyle }) => {\n printValue(convertStringCase(readTextSource(options), options.to));\n }\n );\n\n str\n .command(\"trim\")\n .description(\"Remove surrounding spaces and newlines.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .action((options: { text?: string; file?: string }) => {\n printValue(trimText(readTextSource(options)));\n });\n\n str\n .command(\"truncate\")\n .description(\"Cut text to a maximum length.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .requiredOption(\"--max <number>\", \"Maximum length.\", parsePositiveInteger)\n .option(\"--suffix <value>\", \"Suffix to append after truncation.\")\n .action(\n (options: {\n text?: string;\n file?: string;\n max: number;\n suffix?: string;\n }) => {\n printValue(\n truncateText(readTextSource(options), {\n max: options.max,\n ...(options.suffix !== undefined ? { suffix: options.suffix } : {})\n })\n );\n }\n );\n\n str\n .command(\"replace\")\n .description(\"Replace text fragments or regex matches.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .requiredOption(\"--from <value>\", \"Text or regex pattern to replace.\")\n .requiredOption(\"--with <value>\", \"Replacement value.\")\n .option(\"--regex\", \"Interpret --from as a regex pattern.\")\n .action(\n (options: {\n text?: string;\n file?: string;\n from: string;\n with: string;\n regex?: boolean;\n }) => {\n printValue(\n replaceText(readTextSource(options), {\n from: options.from,\n with: options.with,\n ...(options.regex !== undefined ? { regex: options.regex } : {})\n })\n );\n }\n );\n\n str\n .command(\"normalize\")\n .description(\"Normalize text using Unicode NFC.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .action((options: { text?: string; file?: string }) => {\n printValue(normalizeText(readTextSource(options)));\n });\n\n str\n .command(\"remove-accents\")\n .description(\"Remove accents and diacritics from text.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .action((options: { text?: string; file?: string }) => {\n printValue(removeAccents(readTextSource(options)));\n });\n\n str\n .command(\"pad\")\n .description(\"Pad a string with spaces on the left, right or both sides.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .requiredOption(\n \"--length <number>\",\n \"Target text length.\",\n parsePositiveInteger\n )\n .option(\n \"--side <side>\",\n \"Pad direction: left, right or both.\",\n parseStringPadSide,\n \"right\"\n )\n .action(\n (options: {\n text?: string;\n file?: string;\n length: number;\n side: StringPadSide;\n }) => {\n printValue(\n padText(readTextSource(options), {\n length: options.length,\n side: options.side\n })\n );\n }\n );\n\n str\n .command(\"extract\")\n .argument(\"<query>\", 'Regex pattern or delimiter pair such as \"start|end\".')\n .description(\"Extract content by regex or by delimiter pairs.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .option(\"--regex\", \"Interpret the query as a regex pattern.\")\n .action(\n (\n query: string,\n options: { text?: string; file?: string; regex?: boolean }\n ) => {\n printValue(\n extractText(readTextSource(options), query, {\n ...(options.regex !== undefined ? { regex: options.regex } : {})\n })\n );\n }\n );\n\n str\n .command(\"base64\")\n .description(\"Encode or decode Base64 values.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .option(\n \"--mode <mode>\",\n \"Use encode or decode mode.\",\n parseStringCodecMode,\n \"encode\"\n )\n .action(\n (options: { text?: string; file?: string; mode: StringCodecMode }) => {\n printValue(transformBase64(readTextSource(options), options.mode));\n }\n );\n\n str\n .command(\"urlencode\")\n .description(\"Encode or decode URL-safe content.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .option(\n \"--mode <mode>\",\n \"Use encode or decode mode.\",\n parseStringCodecMode,\n \"encode\"\n )\n .action(\n (options: { text?: string; file?: string; mode: StringCodecMode }) => {\n printValue(transformUrlEncoding(readTextSource(options), options.mode));\n }\n );\n\n str\n .command(\"html\")\n .description(\"Encode or decode basic HTML entities.\")\n .option(\"--text <value>\", \"Inline text input.\")\n .option(\"--file <path>\", \"Read input text from a file.\")\n .option(\n \"--mode <mode>\",\n \"Use encode or decode mode.\",\n parseStringCodecMode,\n \"encode\"\n )\n .action(\n (options: { text?: string; file?: string; mode: StringCodecMode }) => {\n printValue(\n transformHtmlEntities(readTextSource(options), options.mode)\n );\n }\n );\n\n str\n .description(\"Calculates the Levenshtein distance between two strings\")\n .command(\"leven\")\n .argument(\"<a>\")\n .argument(\"<b>\")\n .action((a: string, b: string) => {\n printValue(getLevenshteinDistance(a, b));\n });\n\n const jsonCommand = program\n .command(\"json\")\n .description(\"Local JSON formatting, editing and diff helpers.\")\n .addHelpText(\n \"after\",\n examples([\n \"brutils json format --file ./config.json --sort-keys\",\n \"brutils json validate --value '{\\\"ok\\\":true}'\",\n \"brutils json get --file ./config.json --path server.port\",\n \"brutils json set --file ./config.json --path flags.dev --set-value true --in-place\",\n \"brutils json diff --left ./a.json --right ./b.json\",\n \"brutils json merge --file ./base.json --file ./override.json\",\n 'brutils json to-yaml --value \\'{\"name\":\"brutils\"}\\''\n ])\n );\n\n jsonCommand\n .command(\"format\")\n .description(\"Pretty-print JSON.\")\n .option(\"--file <path>\", \"Read JSON from a file.\")\n .option(\"--value <json>\", \"Read JSON inline.\")\n .option(\n \"--indent <number>\",\n \"Pretty-print indentation size.\",\n parseInteger,\n 2\n )\n .option(\"--sort-keys\", \"Sort object keys recursively before printing.\")\n .option(\"--in-place\", \"Write the formatted content back to the input file.\")\n .action(\n (options: {\n file?: string;\n value?: string;\n indent: number;\n sortKeys?: boolean;\n inPlace?: boolean;\n }) => {\n const source = readSingleJsonSource(options);\n const result = formatJsonValue(\n source.parsed,\n options.indent,\n options.sortKeys ?? false\n );\n\n if (options.inPlace) {\n if (!source.sourcePath) {\n throw new Error(\"--in-place requires --file.\");\n }\n\n writeTextFile(source.sourcePath, `${result}\\n`);\n }\n\n printValue(result);\n }\n );\n\n jsonCommand\n .command(\"minify\")\n .description(\"Minify JSON.\")\n .option(\"--file <path>\", \"Read JSON from a file.\")\n .option(\"--value <json>\", \"Read JSON inline.\")\n .option(\"--in-place\", \"Write the minified content back to the input file.\")\n .action((options: { file?: string; value?: string; inPlace?: boolean }) => {\n const source = readSingleJsonSource(options);\n const result = minifyJsonValue(source.parsed);\n\n if (options.inPlace) {\n if (!source.sourcePath) {\n throw new Error(\"--in-place requires --file.\");\n }\n\n writeTextFile(source.sourcePath, result);\n }\n\n printValue(result);\n });\n\n jsonCommand\n .command(\"validate\")\n .description(\"Validate JSON syntax.\")\n .option(\"--file <path>\", \"Read JSON from a file.\")\n .option(\"--value <json>\", \"Read JSON inline.\")\n .action((options: { file?: string; value?: string }) => {\n const source = readSingleJsonSource(options);\n printValue(validateJsonInput(source.raw));\n });\n\n jsonCommand\n .command(\"get\")\n .description(\"Read a path from JSON.\")\n .option(\"--file <path>\", \"Read JSON from a file.\")\n .option(\"--value <json>\", \"Read JSON inline.\")\n .requiredOption(\"--path <value>\", \"JSON path to read.\")\n .action((options: { file?: string; value?: string; path: string }) => {\n const source = readSingleJsonSource(options);\n printValue(getJsonPathValue(source.parsed, options.path));\n });\n\n jsonCommand\n .command(\"set\")\n .description(\"Write a path in JSON.\")\n .option(\"--file <path>\", \"Read JSON from a file.\")\n .option(\"--value <json>\", \"Read JSON inline.\")\n .requiredOption(\"--path <value>\", \"JSON path to update.\")\n .requiredOption(\n \"--set-value <json>\",\n \"New JSON value to write at the path.\"\n )\n .option(\"--in-place\", \"Write the updated content back to the input file.\")\n .action(\n (options: {\n file?: string;\n value?: string;\n path: string;\n setValue: string;\n inPlace?: boolean;\n }) => {\n const source = readSingleJsonSource(options);\n const updated = setJsonPathValue(\n source.parsed,\n options.path,\n parseJsonInput(options.setValue)\n );\n const formatted = formatJsonValue(updated, 2, false);\n\n if (options.inPlace) {\n if (!source.sourcePath) {\n throw new Error(\"--in-place requires --file.\");\n }\n\n writeTextFile(source.sourcePath, `${formatted}\\n`);\n }\n\n printValue(updated);\n }\n );\n\n jsonCommand\n .command(\"delete\")\n .description(\"Remove a path from JSON.\")\n .option(\"--file <path>\", \"Read JSON from a file.\")\n .option(\"--value <json>\", \"Read JSON inline.\")\n .requiredOption(\"--path <value>\", \"JSON path to delete.\")\n .option(\"--in-place\", \"Write the updated content back to the input file.\")\n .action(\n (options: {\n file?: string;\n value?: string;\n path: string;\n inPlace?: boolean;\n }) => {\n const source = readSingleJsonSource(options);\n const updated = deleteJsonPathValue(source.parsed, options.path);\n const formatted = formatJsonValue(updated, 2, false);\n\n if (options.inPlace) {\n if (!source.sourcePath) {\n throw new Error(\"--in-place requires --file.\");\n }\n\n writeTextFile(source.sourcePath, `${formatted}\\n`);\n }\n\n printValue(updated);\n }\n );\n\n jsonCommand\n .command(\"diff\")\n .description(\"Diff two JSON values or files.\")\n .requiredOption(\n \"--left <source>\",\n \"Left JSON file path or inline JSON value.\"\n )\n .requiredOption(\n \"--right <source>\",\n \"Right JSON file path or inline JSON value.\"\n )\n .action((options: { left: string; right: string }) => {\n printValue(\n diffJsonValues(\n readDiffJsonSource(options.left),\n readDiffJsonSource(options.right)\n )\n );\n });\n\n jsonCommand\n .command(\"merge\")\n .description(\"Merge multiple JSON sources.\")\n .option(\"--file <paths...>\", \"Read JSON from one or more files.\")\n .option(\"--value <json...>\", \"Read one or more inline JSON values.\")\n .action(\n (options: { file?: string | string[]; value?: string | string[] }) => {\n printValue(mergeJsonValues(readMultipleJsonSources(options)));\n }\n );\n\n jsonCommand\n .command(\"to-yaml\")\n .description(\"Convert JSON to YAML.\")\n .option(\"--file <path>\", \"Read JSON from a file.\")\n .option(\"--value <json>\", \"Read JSON inline.\")\n .action((options: { file?: string; value?: string }) => {\n const source = readSingleJsonSource(options);\n printValue(convertJsonToYaml(source.parsed));\n });\n}\n","import { buildProgram } from \"./cli/create-program.js\";\nimport { handleCliError } from \"./cli/ui/output.js\";\n\nbuildProgram()\n .parseAsync(process.argv)\n .catch((error: unknown) => {\n handleCliError(error);\n });\n"],"mappings":";;;AAAA,SAAS,eAAe;;;ACAxB,OAAO,UAAU;AAEV,SAAS,qBACd,YACA,aACQ;AACR,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,KAAK,QAAQ,UAAU;AAChD,QAAM,SAAS,KAAK,MAAM,gBAAgB;AAE1C,MAAI,KAAK,SAAS,gBAAgB,MAAM,KAAK;AAC3C,UAAM,MAAM,QAAQ,IAAI;AACxB,WAAO,KAAK,KAAK,KAAK,GAAG,KAAK,SAAS,GAAG,CAAC,MAAM;AAAA,EACnD;AAEA,MAAI,OAAO,KAAK;AACd,WAAO,KAAK,KAAK,OAAO,KAAK,GAAG,OAAO,IAAI,MAAM;AAAA,EACnD;AAEA,SAAO,KAAK,KAAK,OAAO,KAAK,GAAG,OAAO,IAAI,MAAM;AACnD;;;ACvBA,OAAO,QAAQ;AACf,OAAOA,WAAU;AACjB,OAAO,QAAQ;;;ACFR,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ADCA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,MAAM,QAAQ,OAAO,GAAG;AACjC;AAEA,SAAS,YAAY,YAA6B;AAChD,SAAO,GAAG,SAAS,UAAU,EAAE,YAAY;AAC7C;AAEA,SAAS,OAAO,YAA6B;AAC3C,SAAO,GAAG,SAAS,UAAU,EAAE,OAAO;AACxC;AAEO,SAAS,iBACd,YACA,YACA,UAA6B,CAAC,GACb;AACjB,QAAM,iBAAiBC,MAAK,QAAQ,UAAU;AAE9C,MAAI,CAAC,GAAG,WAAW,cAAc,GAAG;AAClC,UAAM,IAAI,aAAa,+BAA+B,UAAU,EAAE;AAAA,EACpE;AAEA,MAAI,OAAO,cAAc,GAAG;AAC1B,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,WAAWA,MAAK,SAAS,cAAc;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,cAAc,GAAG;AAChC,UAAM,IAAI,aAAa,4BAA4B,UAAU,EAAE;AAAA,EACjE;AAEA,QAAM,kBAAkB,QAAQ,WAAW,CAAC;AAC5C,QAAM,qBAAqBA,MAAK,QAAQ,UAAU;AAClD,QAAM,gBAAgBA,MAAK,SAAS,cAAc;AAClD,QAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,OAAO,GAAG;AAAA,IACzC,KAAK;AAAA,IACL,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,KAAK;AAAA,IACL,qBAAqB,QAAQ,kBAAkB;AAAA,IAC/C,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,iBAAiB;AAAA,EACnB,CAAC;AAED,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,QAAQ,eACX,CAAC,IACD;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,WAAW,GAAG,aAAa;AAAA,MAC7B;AAAA,IACF;AAAA,EACN;AAEA,SAAO,QACJ,IAA0B,CAAC,UAAU;AACpC,UAAM,eAAe,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AAChE,UAAM,oBAAoBA,MAAK,KAAK,gBAAgB,YAAY;AAEhE,QAAIA,MAAK,QAAQ,iBAAiB,MAAM,oBAAoB;AAC1D,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,QAAQ,eAC9B,eACAA,MAAK,KAAK,eAAe,YAAY;AAEzC,UAAM,YAAY,MAAM,SAAS,GAAG,IAAI,cAAc;AAEtD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,WAAW;AAAA,QACT,cAAc,cACV,GAAG,iBAAiB,MACpB;AAAA,MACN;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,CAAC,UAAkC,UAAU,IAAI;AAC7D;;;AE/FA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,cAAc;AAMrB,SAAS,wBAAwB,OAAwB;AACvD,QAAM,gBAAgB,SAAS;AAE/B,MACE,CAAC,OAAO,UAAU,aAAa,KAC/B,gBAAgB,KAChB,gBAAgB,GAChB;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,YAA0C;AAC/D,SAAOC,IAAG,SAAS,UAAU,EAAE,YAAY,IAAI,cAAc;AAC/D;AAEA,SAAS,yBAAyB,YAAoB,QAAQ,OAAa;AACzE,MAAIA,IAAG,WAAW,UAAU,KAAK,CAAC,OAAO;AACvC,UAAM,IAAI;AAAA,MACR,+BAA+B,UAAU;AAAA,IAC3C;AAAA,EACF;AAEA,EAAAA,IAAG,UAAUC,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D;AAEO,SAAS,uBACd,YACA,eACA,UAA6B,CAAC,GACZ;AAClB,MAAI,iBAAiB,QAAQ,KAAK;AAChC,UAAM,IAAI,aAAa,iDAAiD;AAAA,EAC1E;AAEA,QAAM,qBAAqBA,MAAK;AAAA,IAC9B,qBAAqB,YAAY,iBAAiB,QAAQ,GAAG;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL,YAAYA,MAAK,QAAQ,UAAU;AAAA,IACnC,YAAY;AAAA,IACZ,YAAY,cAAcA,MAAK,QAAQ,UAAU,CAAC;AAAA,IAClD,SAAS,QAAQ,WAAW,CAAC;AAAA,IAC7B,cAAc,QAAQ,gBAAgB;AAAA,IACtC,OAAO,wBAAwB,QAAQ,KAAK;AAAA,IAC5C,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,OAAO,QAAQ,SAAS;AAAA,EAC1B;AACF;AAEA,eAAsB,UACpB,YACA,eACA,UAA6B,CAAC,GACH;AAC3B,QAAM,OAAO,uBAAuB,YAAY,eAAe,OAAO;AAEtE,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,EACT;AAEA,2BAAyB,KAAK,YAAY,QAAQ,KAAK;AAEvD,QAAM,eAAeD,IAAG,kBAAkB,KAAK,UAAU;AACzD,QAAM,UAAU,SAAS,OAAO;AAAA,IAC9B,MAAM,EAAE,OAAO,KAAK,QAAQ,IAAI,KAAK,MAAM;AAAA,IAC3C,OAAO,KAAK;AAAA,EACd,CAAC;AAED,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,iBAAa,GAAG,SAAS,MAAM,QAAQ,CAAC;AACxC,YAAQ,GAAG,SAAS,CAAC,UAAU,OAAO,KAAK,CAAC;AAC5C,YAAQ,KAAK,YAAY;AAEzB,UAAM,SAAS,iBAAiB,KAAK,YAAY,KAAK,YAAY,OAAO;AAEzE,eAAW,SAAS,QAAQ;AAC1B,UAAI,QAAQ,WAAW,CAAC,QAAQ,OAAO;AACrC,gBAAQ,IAAI,gBAAgB,MAAM,SAAS,EAAE;AAAA,MAC/C;AAEA,UAAI,MAAM,SAAS,aAAa;AAC9B,gBAAQ,OAAO,IAAI,EAAE,MAAM,MAAM,UAAU,CAAC;AAAA,MAC9C,OAAO;AACL,gBAAQ,KAAK,MAAM,YAAY,EAAE,MAAM,MAAM,UAAU,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,YAAQ,SAAS,EAAE,MAAM,MAAM;AAAA,EACjC,CAAC;AAED,SAAO;AACT;;;ACzGA,OAAOE,WAAU;;;ACAjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,OAAO,WAAW;;;ACJlB,YAAY,qBAAqB;AAQjC,SAAS,mBAAkC;AACzC,QAAM,cAAc;AAKpB,MAAI,OAAO,YAAY,cAAc,YAAY;AAC/C,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI,OAAO,YAAY,YAAY,YAAY;AAC7C,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI,OAAO,gBAAgB,YAAY;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,6CAA6C;AAC/D;AAEA,IAAM,YAAY,iBAAiB;AAE5B,SAAS,YAAY,OAAe,SAA0B;AACnE,SAAO,UAAU,OAAO,SAAS,EAAE,KAAK,KAAK,CAAC;AAChD;;;ADnBA,SAAS,mBAAmB,WAA2B;AACrD,SAAO,UAAU,QAAQ,OAAO,GAAG;AACrC;AAEO,SAAS,uBAAuB,YAA0B;AAC/D,MAAI,CAACC,IAAG,WAAW,UAAU,GAAG;AAC9B,UAAM,IAAI,aAAa,4BAA4B,UAAU,EAAE;AAAA,EACjE;AAEA,MAAI,CAACA,IAAG,SAAS,UAAU,EAAE,OAAO,GAAG;AACrC,UAAM,IAAI,aAAa,yBAAyB,UAAU,EAAE;AAAA,EAC9D;AAEA,MAAIC,MAAK,QAAQ,UAAU,EAAE,YAAY,MAAM,QAAQ;AACrD,UAAM,IAAI,aAAa,gCAAgC;AAAA,EACzD;AACF;AAEA,SAAS,YAAY,YAA4C;AAC/D,yBAAuB,UAAU;AAEjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,aAAa;AAAA,QACb,eAAe;AAAA,QACf,oBAAoB;AAAA,MACtB;AAAA,MACA,CAAC,OAAO,YAAY;AAClB,YAAI,OAAO;AACT,iBAAO,KAAK;AACZ;AAAA,QACF;AAEA,YAAI,CAAC,SAAS;AACZ,iBAAO,IAAI,aAAa,0BAA0B,CAAC;AACnD;AAAA,QACF;AAEA,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBAAmB,WAAmB,OAAyB;AACtE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,YAAY,mBAAmB,SAAS,GAAG,KAAK;AACzD;AAEA,eAAsB,sBACpB,YACA,UAA0B,CAAC,GACK;AAChC,QAAM,UAAU,MAAM,YAAY,UAAU;AAE5C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,UAAiC,CAAC;AAExC,YAAQ,GAAG,SAAS,CAAC,UAAU;AAC7B,YAAM,YAAY,mBAAmB,MAAM,QAAQ;AAEnD,UAAI,mBAAmB,WAAW,QAAQ,KAAK,GAAG;AAChD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,MAAM,UAAU,SAAS,GAAG,IAAI,cAAc;AAAA,UAC9C,gBAAgB,MAAM;AAAA,UACtB,kBAAkB,MAAM;AAAA,QAC1B,CAAC;AAAA,MACH;AAEA,cAAQ,UAAU;AAAA,IACpB,CAAC;AAED,YAAQ,KAAK,OAAO,MAAM;AACxB,cAAQ,MAAM;AACd,cAAQ,OAAO;AAAA,IACjB,CAAC;AAED,YAAQ,KAAK,SAAS,CAAC,UAAU;AAC/B,cAAQ,MAAM;AACd,aAAO,KAAK;AAAA,IACd,CAAC;AAED,YAAQ,UAAU;AAAA,EACpB,CAAC;AACH;AAEA,eAAe,iBACb,SACA,OACe;AACf,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAQ,eAAe,OAAO,OAAO,OAAO,WAAW;AACrD,UAAI,OAAO;AACT,eAAO,KAAK;AACZ;AAAA,MACF;AAEA,UAAI,CAAC,QAAQ;AACX;AAAA,UACE,IAAI,aAAa,iCAAiC,MAAM,QAAQ,EAAE;AAAA,QACpE;AACA;AAAA,MACF;AAEA,UAAI;AACF,cAAM;AAAA,UACJ;AAAA,UACA,IAAI,SAAS;AAAA,YACX,MAAM,QAAQ,WAAW,UAAU;AACjC,uBAAS;AAAA,YACX;AAAA,UACF,CAAC;AAAA,QACH;AAEA,gBAAQ;AAAA,MACV,SAAS,aAAa;AACpB,eAAO,WAAW;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,eACpB,YACA,UAA0B,CAAC,GACH;AACxB,QAAM,UAAU,MAAM,YAAY,UAAU;AAC5C,MAAI,gBAAgB;AAEpB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAQ,GAAG,SAAS,CAAC,UAAU;AAC7B,YAAM,YAAY,mBAAmB,MAAM,QAAQ;AAEnD,YAAM,YAAY;AAChB,YAAI;AACF,cACE,CAAC,mBAAmB,WAAW,QAAQ,KAAK,KAC5C,UAAU,SAAS,GAAG,GACtB;AACA,oBAAQ,UAAU;AAClB;AAAA,UACF;AAEA,gBAAM,iBAAiB,SAAS,KAAK;AACrC,2BAAiB;AACjB,kBAAQ,UAAU;AAAA,QACpB,SAAS,OAAO;AACd,kBAAQ,MAAM;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,GAAG;AAAA,IACL,CAAC;AAED,YAAQ,KAAK,OAAO,MAAM;AACxB,cAAQ,MAAM;AACd,cAAQ;AAAA,QACN,YAAYA,MAAK,QAAQ,UAAU;AAAA,QACnC;AAAA,QACA,IAAI;AAAA,MACN,CAAC;AAAA,IACH,CAAC;AAED,YAAQ,KAAK,SAAS,CAAC,UAAU;AAC/B,cAAQ,MAAM;AACd,aAAO,KAAK;AAAA,IACd,CAAC;AAED,YAAQ,UAAU;AAAA,EACpB,CAAC;AACH;;;ADzLA,eAAsB,QACpB,YACA,OACwB;AACxB,SAAO;AAAA,IACLC,MAAK,QAAQ,UAAU;AAAA,IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EACvB;AACF;;;AGZA,OAAOC,WAAU;AAIjB,eAAsB,QACpB,YACA,OACiC;AACjC,SAAO,eAAeC,MAAK,QAAQ,UAAU,GAAG,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;AACxE;;;ACTA,OAAOC,WAAU;AAEV,SAAS,uBACd,YACA,aACQ;AACR,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiBA,MAAK,QAAQ,UAAU;AAC9C,QAAM,SAASA,MAAK,MAAM,cAAc;AAExC,SAAOA,MAAK,KAAK,OAAO,KAAK,OAAO,IAAI;AAC1C;;;ACdA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,YAAW;AAOlB,SAAS,2BAA2B,WAAmB,QAAQ,OAAa;AAC1E,MAAIC,IAAG,WAAW,SAAS,KAAK,CAAC,OAAO;AACtC,UAAM,IAAI;AAAA,MACR,oCAAoC,SAAS;AAAA,IAC/C;AAAA,EACF;AAEA,MAAIA,IAAG,WAAW,SAAS,KAAK,OAAO;AACrC,IAAAA,IAAG,OAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACvD;AAEA,EAAAA,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C;AAEA,SAASC,oBAAmB,WAA2B;AACrD,SAAO,UAAU,QAAQ,OAAO,GAAG;AACrC;AAEA,SAASC,oBAAmB,WAAmB,OAAyB;AACtE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,YAAYD,oBAAmB,SAAS,GAAG,KAAK;AACzD;AAEA,SAAS,0BAA0B,WAAmB,MAAuB;AAC3E,MAAI,CAAC,MAAM;AACT,WAAOA,oBAAmB,SAAS;AAAA,EACrC;AAEA,SAAOE,MAAK,MAAM,SAASF,oBAAmB,SAAS,CAAC;AAC1D;AAEA,SAAS,uBACP,WACA,cACQ;AACR,QAAM,cAAcE,MAAK,QAAQ,WAAW,YAAY;AACxD,QAAM,oBAAoBA,MAAK,QAAQ,SAAS;AAChD,QAAM,eAAe,GAAG,iBAAiB,GAAGA,MAAK,GAAG;AAEpD,MACE,gBAAgB,qBAChB,CAAC,YAAY,WAAW,YAAY,GACpC;AACA,UAAM,IAAI,aAAa,mCAAmC,YAAY,EAAE;AAAA,EAC1E;AAEA,SAAO;AACT;AAEA,SAASC,aAAY,YAA4C;AAC/D,yBAAuB,UAAU;AAEjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,IAAAC,OAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,aAAa;AAAA,QACb,eAAe;AAAA,QACf,oBAAoB;AAAA,MACtB;AAAA,MACA,CAAC,OAAO,YAAY;AAClB,YAAI,OAAO;AACT,iBAAO,KAAK;AACZ;AAAA,QACF;AAEA,YAAI,CAAC,SAAS;AACZ,iBAAO,IAAI,aAAa,0BAA0B,CAAC;AACnD;AAAA,QACF;AAEA,gBAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,yBACd,YACA,eACA,UAA+B,CAAC,GACZ;AACpB,MAAI,iBAAiB,QAAQ,KAAK;AAChC,UAAM,IAAI,aAAa,iDAAiD;AAAA,EAC1E;AAEA,QAAM,qBAAqBF,MAAK,QAAQ,UAAU;AAClD,QAAM,oBAAoBA,MAAK;AAAA,IAC7B,uBAAuB,YAAY,iBAAiB,QAAQ,GAAG;AAAA,EACjE;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,MAAM,QAAQ,QAAQ;AAAA,IACtB,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,EAClD;AACF;AAEA,eAAsB,eACpB,YACA,eACA,UAA+B,CAAC,GACH;AAC7B,QAAM,OAAO,yBAAyB,YAAY,eAAe,OAAO;AAExE,yBAAuB,KAAK,UAAU;AAEtC,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,EACT;AAEA,6BAA2B,KAAK,WAAW,QAAQ,KAAK;AAExD,MAAI,QAAQ,WAAW,CAAC,QAAQ,OAAO;AACrC,YAAQ,IAAI,sBAAsB,KAAK,UAAU,OAAO,KAAK,SAAS,EAAE;AAAA,EAC1E;AAEA,QAAM,UAAU,MAAMC,aAAY,KAAK,UAAU;AACjD,QAAM,cAAc,oBAAI,IAAY;AAEpC,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAQ,GAAG,SAAS,CAAC,UAAU;AAC7B,YAAM,YAAYH,oBAAmB,MAAM,QAAQ;AAEnD,YAAM,YAAY;AAChB,YAAI;AACF,cAAI,CAACC,oBAAmB,WAAW,QAAQ,KAAK,GAAG;AACjD,oBAAQ,UAAU;AAClB;AAAA,UACF;AAEA,gBAAMI,eAAc,UAAU,SAAS,GAAG;AAC1C,gBAAM,qBAAqB;AAAA,YACzB;AAAA,YACA,QAAQ,QAAQ;AAAA,UAClB;AAEA,cAAI,CAAC,oBAAoB;AACvB,oBAAQ,UAAU;AAClB;AAAA,UACF;AAEA,eACG,QAAQ,QAAQ,UACjB,YAAY,IAAI,kBAAkB,KAClC,CAACA,cACD;AACA,kBAAM,IAAI;AAAA,cACR,0DAA0D,kBAAkB;AAAA,YAC9E;AAAA,UACF;AAEA,eAAK,QAAQ,QAAQ,UAAU,CAACA,cAAa;AAC3C,wBAAY,IAAI,kBAAkB;AAAA,UACpC;AAEA,gBAAM,kBAAkB;AAAA,YACtB,KAAK;AAAA,YACL;AAAA,UACF;AAEA,cAAI,QAAQ,WAAW,CAAC,QAAQ,OAAO;AACrC,oBAAQ,IAAI,sBAAsB,SAAS,EAAE;AAAA,UAC/C;AAEA,cAAIA,cAAa;AACf,gBAAI,EAAE,QAAQ,QAAQ,QAAQ;AAC5B,cAAAN,IAAG,UAAU,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAAA,YACnD;AAEA,oBAAQ,UAAU;AAClB;AAAA,UACF;AAEA,UAAAA,IAAG,UAAUG,MAAK,QAAQ,eAAe,GAAG,EAAE,WAAW,KAAK,CAAC;AAE/D,gBAAM,IAAI,QAAc,CAAC,cAAc,gBAAgB;AACrD,oBAAQ,eAAe,OAAO,OAAO,OAAO,WAAW;AACrD,kBAAI,OAAO;AACT,4BAAY,KAAK;AACjB;AAAA,cACF;AAEA,kBAAI,CAAC,QAAQ;AACX;AAAA,kBACE,IAAI;AAAA,oBACF,iCAAiC,MAAM,QAAQ;AAAA,kBACjD;AAAA,gBACF;AACA;AAAA,cACF;AAEA,kBAAI;AACF,sBAAMI,UAAS,QAAQP,IAAG,kBAAkB,eAAe,CAAC;AAC5D,6BAAa;AAAA,cACf,SAAS,aAAa;AACpB,4BAAY,WAAW;AAAA,cACzB;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAED,kBAAQ,UAAU;AAAA,QACpB,SAAS,OAAO;AACd,kBAAQ,MAAM;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,GAAG;AAAA,IACL,CAAC;AAED,YAAQ,KAAK,OAAO,MAAM;AACxB,cAAQ,MAAM;AACd,cAAQ;AAAA,IACV,CAAC;AAED,YAAQ,KAAK,SAAS,CAAC,UAAU;AAC/B,cAAQ,MAAM;AACd,aAAO,KAAK;AAAA,IACd,CAAC;AAED,YAAQ,UAAU;AAAA,EACpB,CAAC;AAED,SAAO;AACT;;;AC7OA,OAAOQ,WAAU;AAIjB,eAAsB,UACpB,YACA,OAC0B;AAC1B,SAAO;AAAA,IACLC,MAAK,QAAQ,UAAU;AAAA,IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EACvB;AACF;;;ACZA,OAAOC,YAAU;AAIjB,eAAsB,UACpB,YACA,OAC0B;AAC1B,SAAO,eAAeC,OAAK,QAAQ,UAAU,GAAG,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;AACxE;;;ACTA,IAAM,gBACJ,QAAQ,OAAO,SACf,CAAC,QAAQ,KAAK,SAAS,YAAY,KACnC,QAAQ,IAAI,aAAa;AAE3B,SAAS,MAAM,MAAc,OAAuB;AAClD,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,QAAU,IAAI,IAAI,KAAK;AAChC;AAEO,IAAM,QAAQ;AAAA,EACnB,OAAO,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EACzC,KAAK,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EACvC,OAAO,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EACzC,QAAQ,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EAC1C,MAAM,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EACxC,SAAS,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EAC3C,MAAM,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EACxC,MAAM,CAAC,UAAkB,MAAM,GAAG,KAAK;AAAA,EAEvC,SAAS,CAAC,UAAkB,MAAM,IAAI,MAAM,GAAG,KAAK,CAAC;AAAA,EACrD,SAAS,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EAC3C,MAAM,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EACxC,OAAO,CAAC,UAAkB,MAAM,IAAI,KAAK;AAAA,EACzC,YAAY,CAAC,UAAkB,MAAM,IAAI,MAAM,GAAG,KAAK,CAAC;AAAA,EACxD,cAAc,CAAC,UAAkB,MAAM,IAAI,MAAM,GAAG,KAAK,CAAC;AAC5D;;;AC3BO,SAAS,SAAS,OAAyB;AAChD,SAAO;AAAA,EACP,MAAM,QAAQ,UAAU,CAAC;AAAA,EACzB,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,QAAQ,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAE5D;AASO,SAAS,aAAqB;AACnC,SAAO;AAAA,EACP,MAAM,QAAQ,aAAa,CAAC;AAAA,IAC1B,MAAM,QAAQ,0BAA0B,CAAC;AAAA,IACzC,MAAM,QAAQ,mCAAmC,CAAC;AAAA;AAAA,EAEpD,MAAM,QAAQ,UAAU,CAAC;AAAA,IACvB,MAAM,QAAQ,kCAAkC,CAAC;AAAA,IACjD,MAAM,QAAQ,4CAA4C,CAAC;AAAA,IAC3D,MAAM,QAAQ,sDAAsD,CAAC;AAAA,IACrE,MAAM,QAAQ,kCAAkC,CAAC;AAAA,IACjD,MAAM,QAAQ,kDAAkD,CAAC;AAAA,IACjE,MAAM,QAAQ,qFAAqF,CAAC;AAAA,IACpG,MAAM,QAAQ,wEAAwE,CAAC;AAAA,IACvF,MAAM,QAAQ,wDAAwD,CAAC;AAAA;AAAA,EAEzE,MAAM,QAAQ,MAAM,CAAC;AAAA,IACnB,MAAM,MAAM,gDAAgD,CAAC;AAAA,IAC7D,MAAM,MAAM,0CAA0C,CAAC;AAAA,IACvD,MAAM,MAAM,qDAAqD,CAAC;AAAA;AAEtE;;;ACrCA,SAAS,4BAA4B;;;ACA9B,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,cAAc,CAAC,QAAQ,cAAc,QAAQ,KAAK;AAExD,IAAM,wBAAwB,CAAC,SAAS,QAAQ,KAAK;AAErD,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,qBAAqB,CAAC,UAAU,QAAQ;AAE9C,IAAM,mBAAmB,CAAC,QAAQ,SAAS,MAAM;AAEjD,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAkB,CAAC,WAAW,WAAW,SAAS,MAAM;;;AD5B9D,SAAS,aAAa,OAAuB;AAClD,QAAM,SAAS,OAAO,KAAK;AAE3B,MAAI,CAAC,OAAO,UAAU,MAAM,GAAG;AAC7B,UAAM,IAAI,qBAAqB,kCAAkC,KAAK,IAAI;AAAA,EAC5E;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAuB;AAC1D,QAAM,SAAS,aAAa,KAAK;AAEjC,MAAI,SAAS,GAAG;AACd,UAAM,IAAI;AAAA,MACR,0CAA0C,KAAK;AAAA,IACjD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,OAAuB;AACjD,QAAM,SAAS,OAAO,KAAK;AAE3B,MAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR,uCAAuC,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,OAA4C;AACrE,QAAM,aAAa,MAAM,YAAY;AAErC,MACE,CAAC,iBAAiB,SAAS,UAA+C,GAC1E;AACA,UAAM,IAAI;AAAA,MACR,kBAAkB,KAAK,kBAAkB,iBAAiB,KAAK,IAAI,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,OAAgC;AAC7D,QAAM,aAAa,MAAM,YAAY;AAErC,MAAI,CAAC,YAAY,SAAS,UAA6B,GAAG;AACxD,UAAM,IAAI;AAAA,MACR,kBAAkB,KAAK,kBAAkB,YAAY,KAAK,IAAI,CAAC;AAAA,IACjE;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAmC;AACnE,QAAM,aAAa,MAAM,YAAY;AAErC,MAAI,CAAC,sBAAsB,SAAS,UAAgC,GAAG;AACrE,UAAM,IAAI;AAAA,MACR,0BAA0B,KAAK,kBAAkB,sBAAsB,KAAK,IAAI,CAAC;AAAA,IACnF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAgC;AACnE,QAAM,aAAa,MAAM,YAAY;AAErC,MAAI,CAAC,mBAAmB,SAAS,UAAmC,GAAG;AACrE,UAAM,IAAI;AAAA,MACR,8BAA8B,KAAK,kBAAkB,mBAAmB,KAAK,IAAI,CAAC;AAAA,IACpF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAgC;AACnE,QAAM,aAAa,MAAM,YAAY;AAErC,MAAI,CAAC,mBAAmB,SAAS,UAAmC,GAAG;AACrE,UAAM,IAAI;AAAA,MACR,uBAAuB,KAAK,kBAAkB,mBAAmB,KAAK,IAAI,CAAC;AAAA,IAC7E;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAA8B;AAC/D,QAAM,aAAa,MAAM,YAAY;AAErC,MAAI,CAAC,iBAAiB,SAAS,UAAiC,GAAG;AACjE,UAAM,IAAI;AAAA,MACR,qBAAqB,KAAK,kBAAkB,iBAAiB,KAAK,IAAI,CAAC;AAAA,IACzE;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAA4B;AAC3D,QAAM,aAAa,MAAM,YAAY;AAErC,MAAI,CAAC,cAAc,SAAS,UAA+B,GAAG;AAC5D,UAAM,IAAI;AAAA,MACR,oBAAoB,KAAK,kBAAkB,cAAc,KAAK,IAAI,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAA6B;AAC7D,QAAM,aAAa,MAAM,YAAY;AAErC,MAAI,CAAC,gBAAgB,SAAS,UAAgC,GAAG;AAC/D,UAAM,IAAI;AAAA,MACR,sBAAsB,KAAK,kBAAkB,gBAAgB,KAAK,IAAI,CAAC;AAAA,IACzE;AAAA,EACF;AAEA,SAAO;AACT;;;AE3JO,SAAS,mBAAmB,SAAwB;AACzD,UAAQ,gBAAgB;AAAA,IACtB,UAAU,CAAC,QAAQ,QAAQ,OAAO,MAAM,GAAG;AAAA,IAC3C,aAAa,CAAC,KAAK,UAAU;AAC3B,YAAM,MAAM,IAAI,GAAG,CAAC;AAAA,IACtB;AAAA,EACF,CAAC;AAED,UAAQ,cAAc;AAAA,IACpB,gBAAgB,CAAC,QAAQ,MAAM,QAAQ,IAAI,KAAK,CAAC;AAAA,IACjD,YAAY,CAAC,WAAmB,MAAM,KAAK,OAAO,KAAK;AAAA,EACzD,CAAC;AACH;AAEO,SAAS,WAAW,OAAsB;AAC/C,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,YAAQ,IAAI,KAAK;AACjB;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QACE,MAAM;AAAA,MACJ,CAAC,SAAS,OAAO,SAAS,YAAY,OAAO,SAAS;AAAA,IACxD,GACA;AACA,cAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAC5B;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC5C;AAEO,SAAS,kBACd,QACA,QACM;AACN,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAEA,MAAI,WAAW,OAAO;AACpB,YAAQ,IAAI,OAAO,KAAK,GAAG,CAAC;AAC5B;AAAA,EACF;AAEA,UAAQ,IAAI,OAAO,KAAK,IAAI,CAAC;AAC/B;AAEO,SAAS,eAAe,OAAuB;AACpD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAQ,MAAM,GAAG,MAAM,WAAW,OAAO,CAAC,IAAI,OAAO,EAAE;AACvD,UAAQ,KAAK,CAAC;AAChB;;;ACnDO,SAAS,wBAAwB,SAAwB;AAC9D,QAAM,MAAM,QACT,QAAQ,KAAK,EACb,YAAY,uCAAuC,EACnD;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,MAAM,KAAK,EACX,SAAS,YAAY,4BAA4B,EACjD,SAAS,SAAS,iCAAiC,EACnD,YAAY,0CAA0C,EACtD,OAAO,oBAAoB,4BAA4B,EACvD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,eAAe,wCAAwC,EAC9D;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,iBAAiB,qCAAqC,EAC7D,OAAO,eAAe,4BAA4B,EAClD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,WAAW,kCAAkC,EACpD;AAAA,IACC,OACE,QACA,KACA,YAYG;AACH,YAAM,OAAO,MAAM,UAAU,QAAQ,KAAK,OAAO;AAEjD,UAAI,CAAC,QAAQ,OAAO;AAClB,mBAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,SAAS,YAAY,gCAAgC,EACrD,YAAY,2CAA2C,EACvD,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,eAAe,4BAA4B,EAClD;AAAA,IACC,OAAO,QAAgB,YAAiD;AACtE,YAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,KAAK;AAElD,UAAI,CAAC,QAAQ,OAAO;AAClB,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,SAAS,YAAY,iCAAiC,EACtD,YAAY,oDAAoD,EAChE,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,eAAe,4BAA4B,EAClD;AAAA,IACC,OAAO,QAAgB,YAAiD;AACtE,YAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,KAAK;AAElD,UAAI,CAAC,QAAQ,OAAO;AAClB,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEF,QAAM,QAAQ,QACX,QAAQ,OAAO,EACf,YAAY,wCAAwC,EACpD;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,QACG,QAAQ,SAAS,EACjB,MAAM,KAAK,EACX,SAAS,YAAY,gCAAgC,EACrD,SAAS,SAAS,iCAAiC,EACnD,YAAY,wBAAwB,EACpC,OAAO,oBAAoB,4BAA4B,EACvD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,aAAa,kDAAkD,EACtE,OAAO,iBAAiB,+BAA+B,EACvD,OAAO,eAAe,4BAA4B,EAClD,OAAO,UAAU,kDAAkD,EACnE,OAAO,qBAAqB,6CAA6C,EACzE;AAAA,IACC,OACE,QACA,KACA,YASG;AACH,YAAM,OAAO,MAAM,eAAe,QAAQ,KAAK,OAAO;AAEtD,UAAI,CAAC,QAAQ,OAAO;AAClB,mBAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEF,QACG,QAAQ,MAAM,EACd,SAAS,YAAY,gCAAgC,EACrD,YAAY,2CAA2C,EACvD,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,eAAe,4BAA4B,EAClD;AAAA,IACC,OAAO,QAAgB,YAAiD;AACtE,YAAM,SAAS,MAAM,UAAU,QAAQ,QAAQ,KAAK;AAEpD,UAAI,CAAC,QAAQ,OAAO;AAClB,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEF,QACG,QAAQ,MAAM,EACd,SAAS,YAAY,iCAAiC,EACtD,YAAY,oDAAoD,EAChE,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,eAAe,4BAA4B,EAClD;AAAA,IACC,OAAO,QAAgB,YAAiD;AACtE,YAAM,SAAS,MAAM,UAAU,QAAQ,QAAQ,KAAK;AAEpD,UAAI,CAAC,QAAQ,OAAO;AAClB,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACJ;;;ACzMO,SAAS,WAAW,OAAuB;AAChD,SAAO,MAAM,QAAQ,OAAO,EAAE;AAChC;AAEO,SAAS,eAAe,OAAwB;AACrD,SAAO,YAAY,KAAK,KAAK;AAC/B;;;ACHA,IAAM,8BAA8D;AAAA,EAClE,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,CAAC;AAAA,EACN,IAAI,CAAC,GAAG,CAAC;AAAA,EACT,IAAI,CAAC,CAAC;AACR;AACO,SAAS,aAAa,OAAuB;AAClD,SAAO,WAAW,KAAK;AACzB;AACO,SAAS,SAAS,OAAuB;AAC9C,SAAO,aAAa,KAAK;AAC3B;AACO,SAAS,gBAAgB,OAAuB;AACrD,QAAM,SAAS,aAAa,KAAK;AACjC,MAAI,OAAO,WAAW;AACpB,UAAM,IAAI,aAAa,oCAAoC;AAC7D,SAAO;AACT;AACO,SAAS,wBACd,OACsB;AACtB,SAAO,QAAQ,4BAA4B,KAAK,IAAI;AACtD;;;AChDO,SAAS,UAAU,OAAuB;AAC/C,SAAO,MAAM,QAAQ,gCAAgC,aAAa;AACpE;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,MAAM,QAAQ,uCAAuC,gBAAgB;AAC9E;AAEO,SAAS,UAAU,OAAuB;AAC/C,SAAO,MAAM,QAAQ,kBAAkB,OAAO;AAChD;;;ACRO,SAAS,eAAe,OAAuB;AACpD,SAAO,UAAU,gBAAgB,KAAK,CAAC;AACzC;;;ACFO,SAAS,eAAe,OAAe,SAAyB;AACrE,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,aAAW,SAAS,SAAS;AAC3B,QAAI,UAAU,KAAK;AACjB,UAAI,MAAM,KAAK,MAAM;AACnB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,gBAAU;AACV,eAAS;AACT;AAAA,IACF;AACA,QAAI,UAAU,OAAO,KAAK,KAAK,KAAK,GAAG;AACrC,YAAM,QAAQ,MAAM,KAAK;AACzB,UAAI,UAAU;AACZ,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,gBAAU;AACV,eAAS;AACT;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AACA,MAAI,SAAS,MAAM;AACjB,UAAM,IAAI;AAAA,MACR,yBAAyB,KAAK,8BAA8B,MAAM,MAAM;AAAA,IAC1E;AACF,SAAO;AACT;;;AC7BA,IAAM,2BAA2B;AAC1B,SAAS,QAAQ,OAAe,UAA0B,CAAC,GAAW;AAC3E,SAAO;AAAA,IACL,gBAAgB,KAAK;AAAA,IACrB,QAAQ,WAAW;AAAA,EACrB;AACF;;;ACTO,SAAS,cAAsB;AACpC,SAAO,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE;AACtC;AAEO,SAAS,aAAa,QAA0B;AACrD,SAAO,MAAM,KAAK,EAAE,OAAO,GAAG,MAAM,YAAY,CAAC;AACnD;;;ACEO,SAAS,YAAY,UAA8B,CAAC,GAAW;AACpE,QAAM,qBAAqB,wBAAwB,QAAQ,KAAK;AAChE,QAAM,aAAa,qBACf,mBAAmB,KAAK,MAAM,KAAK,OAAO,IAAI,mBAAmB,MAAM,CAAC,IACxE,YAAY;AAChB,QAAM,SAAS,CAAC,YAAY,GAAG,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE;AACvD,SAAO,QAAQ,YAAY,UAAU,MAAM,IAAI;AACjD;AACO,SAAS,iBAAiB,SAA4C;AAC3E,QAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS;AACvC,UAAM,IAAI,aAAa,mCAAmC;AAC5D,SAAO,MAAM;AAAA,IAAK,EAAE,QAAQ,MAAM;AAAA,IAAG,MACnC,YAAY,EAAE,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,CAAC;AAAA,EACpE;AACF;;;ACnBO,SAAS,YACd,OACA,UAA8B,CAAC,GACV;AACrB,QAAM,SAAS,aAAa,KAAK;AACjC,QAAM,iBAAiB,OAAO,WAAW;AACzC,QAAM,oBAAoB,CAAC,QAAQ,UAAU,CAAC,eAAe,MAAM;AACnE,SAAO;AAAA,IACL,SAAS,kBAAkB;AAAA,IAC3B,OAAO;AAAA,IACP,WAAW,iBAAiB,UAAU,MAAM,IAAI;AAAA,EAClD;AACF;;;ACdO,SAAS,cAAc,OAAuB;AACnD,SAAO,WAAW,KAAK;AACzB;AACO,SAAS,UAAU,OAAuB;AAC/C,SAAO,cAAc,KAAK;AAC5B;AACO,SAAS,iBAAiB,OAAuB;AACtD,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,OAAO,WAAW;AACpB,UAAM,IAAI,aAAa,sCAAsC;AAC/D,SAAO;AACT;AACO,SAAS,oBAAoB,OAAwB;AAC1D,QAAM,SAAS,cAAc,SAAS,MAAM;AAC5C,MAAI,CAAC,YAAY,KAAK,MAAM;AAC1B,UAAM,IAAI,aAAa,6CAA6C;AACtE,SAAO,OAAO,SAAS,GAAG,GAAG;AAC/B;AACO,SAAS,wBAAwB,QAA0B;AAChE,QAAM,UACJ,OAAO,WAAW,KACd,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,IACnC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC5C,QAAM,MAAM,OAAO;AAAA,IACjB,CAAC,KAAK,OAAO,UAAU,MAAM,QAAQ,QAAQ,KAAK;AAAA,IAClD;AAAA,EACF;AACA,QAAM,YAAY,MAAM;AACxB,SAAO,YAAY,IAAI,IAAI,KAAK;AAClC;AACO,SAAS,kBAAkB,OAAmC;AACnE,QAAM,SAAS,cAAc,KAAK;AAClC,SAAO,OAAO,SAAS,KAAK,SAAY,OAAO,MAAM,GAAG,EAAE;AAC5D;;;ACjCO,SAAS,gBAAgB,OAAuB;AACrD,SAAO,WAAW,iBAAiB,KAAK,CAAC;AAC3C;;;ACDA,IAAM,4BAA4B;AAC3B,SAAS,SAAS,OAAe,UAA2B,CAAC,GAAW;AAC7E,SAAO;AAAA,IACL,iBAAiB,KAAK;AAAA,IACtB,QAAQ,WAAW;AAAA,EACrB;AACF;;;ACDO,SAAS,aAAa,UAA+B,CAAC,GAAW;AACtE,QAAM,aAAa,aAAa,CAAC;AACjC,QAAM,eAAe,oBAAoB,QAAQ,MAAM,EACpD,MAAM,EAAE,EACR,IAAI,MAAM;AACb,QAAM,aAAa,CAAC,GAAG,YAAY,GAAG,YAAY;AAClD,QAAM,kBAAkB,wBAAwB,UAAU;AAC1D,QAAM,mBAAmB,wBAAwB;AAAA,IAC/C,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACD,QAAM,OAAO,CAAC,GAAG,YAAY,iBAAiB,gBAAgB,EAAE,KAAK,EAAE;AACvE,SAAO,QAAQ,YAAY,WAAW,IAAI,IAAI;AAChD;AACO,SAAS,kBAAkB,SAA6C;AAC7E,QAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS;AACvC,UAAM,IAAI,aAAa,mCAAmC;AAC5D,MAAI,CAAC,QAAQ;AACX,WAAO,MAAM;AAAA,MAAK,EAAE,QAAQ,MAAM;AAAA,MAAG,MACnC,aAAa,EAAE,WAAW,QAAQ,WAAW,QAAQ,QAAQ,OAAO,CAAC;AAAA,IACvE;AACF,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAmB,CAAC;AAC1B,SAAO,OAAO,SAAS,OAAO;AAC5B,UAAM,QAAQ,aAAa;AAAA,MACzB,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,QAAI,CAAC,KAAK,IAAI,KAAK,GAAG;AACpB,WAAK,IAAI,KAAK;AACd,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;;;AChCO,SAAS,aACd,OACA,UAA+B,CAAC,GACV;AACtB,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,OAAO,WAAW,GAAI,QAAO,EAAE,SAAS,OAAO,OAAO,OAAO;AACjE,MAAI,QAAQ,UAAU,eAAe,MAAM;AACzC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW,WAAW,MAAM;AAAA,MAC5B,QAAQ,kBAAkB,MAAM;AAAA,IAClC;AACF,QAAM,aAAa,OAAO,MAAM,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,MAAM;AAC3D,QAAM,kBAAkB,wBAAwB,UAAU;AAC1D,QAAM,mBAAmB,wBAAwB;AAAA,IAC/C,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACD,QAAM,eAAe,CAAC,GAAG,YAAY,iBAAiB,gBAAgB,EAAE;AAAA,IACtE;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB,OAAO;AAAA,IACP,WAAW,WAAW,MAAM;AAAA,IAC5B,QAAQ,kBAAkB,MAAM;AAAA,EAClC;AACF;;;ACpCA,IAAM,uBAAqD;AAAA,EACzD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AACA,IAAM,kBAAgD;AAAA,EACpD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AACO,SAAS,aAAa,OAAuB;AAClD,SAAO,WAAW,KAAK;AACzB;AACO,SAAS,SAAS,OAAuB;AAC9C,SAAO,aAAa,KAAK;AAC3B;AACO,SAAS,gBAAgB,OAAuB;AACrD,QAAM,SAAS,aAAa,KAAK;AACjC,MAAI,OAAO,WAAW;AACpB,UAAM,IAAI,aAAa,qCAAqC;AAC9D,SAAO;AACT;AACO,SAAS,uBAAuB,QAA0B;AAC/D,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,MAAM,OAAO;AAAA,IACjB,CAAC,KAAK,OAAO,UAAU,MAAM,SAAS,cAAc;AAAA,IACpD;AAAA,EACF;AACA,QAAM,YAAa,MAAM,KAAM;AAC/B,SAAO,cAAc,KAAK,IAAI;AAChC;AACO,SAAS,sBACd,OACoB;AACpB,SAAO,QAAQ,qBAAqB,KAAK,IAAI;AAC/C;AACO,SAAS,0BACd,OAC0B;AAC1B,QAAM,SAAS,aAAa,KAAK;AACjC,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,SAAO,gBAAgB,OAAO,OAAO,CAAC,CAAC,CAAC;AAC1C;;;AC1EO,SAAS,eAAe,OAAuB;AACpD,SAAO,UAAU,gBAAgB,KAAK,CAAC;AACzC;;;ACDA,IAAM,2BAA2B;AAC1B,SAAS,QAAQ,OAAe,UAA0B,CAAC,GAAW;AAC3E,SAAO;AAAA,IACL,gBAAgB,KAAK;AAAA,IACrB,QAAQ,WAAW;AAAA,EACrB;AACF;;;ACDO,SAAS,YAAY,UAA8B,CAAC,GAAW;AACpE,QAAM,mBAAmB,aAAa,CAAC;AACvC,QAAM,cAAc,sBAAsB,QAAQ,KAAK,KAAK,YAAY;AACxE,QAAM,aAAa,CAAC,GAAG,kBAAkB,WAAW;AACpD,QAAM,kBAAkB,uBAAuB,UAAU;AACzD,QAAM,mBAAmB,uBAAuB;AAAA,IAC9C,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACD,QAAM,MAAM,CAAC,GAAG,YAAY,iBAAiB,gBAAgB,EAAE,KAAK,EAAE;AACtE,SAAO,QAAQ,YAAY,UAAU,GAAG,IAAI;AAC9C;AACO,SAAS,iBAAiB,SAA4C;AAC3E,QAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS;AACvC,UAAM,IAAI,aAAa,mCAAmC;AAC5D,MAAI,CAAC,QAAQ;AACX,WAAO,MAAM;AAAA,MAAK,EAAE,QAAQ,MAAM;AAAA,MAAG,MACnC,YAAY,EAAE,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,CAAC;AAAA,IACpE;AACF,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAmB,CAAC;AAC1B,SAAO,OAAO,SAAS,OAAO;AAC5B,UAAM,QAAQ,YAAY;AAAA,MACxB,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,IACjB,CAAC;AACD,QAAI,CAAC,KAAK,IAAI,KAAK,GAAG;AACpB,WAAK,IAAI,KAAK;AACd,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;;;ACjCO,SAAS,YACd,OACA,UAA8B,CAAC,GACV;AACrB,QAAM,SAAS,aAAa,KAAK;AACjC,MAAI,OAAO,WAAW,GAAI,QAAO,EAAE,SAAS,OAAO,OAAO,OAAO;AACjE,MAAI,QAAQ,UAAU,eAAe,MAAM;AACzC,WAAO,EAAE,SAAS,OAAO,OAAO,QAAQ,WAAW,UAAU,MAAM,EAAE;AACvE,QAAM,aAAa,OAAO,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,MAAM;AAC1D,QAAM,kBAAkB,uBAAuB,UAAU;AACzD,QAAM,mBAAmB,uBAAuB;AAAA,IAC9C,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACD,QAAM,cAAc,CAAC,GAAG,YAAY,iBAAiB,gBAAgB,EAAE;AAAA,IACrE;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB,OAAO;AAAA,IACP,WAAW,UAAU,MAAM;AAAA,IAC3B,OAAO,0BAA0B,MAAM;AAAA,EACzC;AACF;;;AC7BO,IAAM,6BAAgE;AAAA,EAC3E,MAAM,CAAC,GAAG;AAAA,EACV,YAAY,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EACzC,MAAM,CAAC,MAAM,IAAI;AAAA,EACjB,KAAK;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,4BAA+D;AAAA,EAC1E,MAAM,CAAC,EAAE;AAAA,EACT,YAAY,CAAC,EAAE;AAAA,EACf,MAAM,CAAC,EAAE;AAAA,EACT,KAAK,CAAC,EAAE;AACV;AAEO,IAAM,+BAAgE;AAAA,EAC3E,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,KAAK;AACP;;;AC3BO,SAAS,sBACd,QAC6B;AAC7B,QAAM,SAAS,WAAW,MAAM;AAEhC,QAAM,SAAS,OAAO,KAAK,0BAA0B;AAErD,aAAW,SAAS,QAAQ;AAC1B,UAAM,WAAW,2BAA2B,KAAK;AACjD,UAAM,UAAU,0BAA0B,KAAK;AAE/C,UAAM,gBAAgB,SAAS,KAAK,CAAC,WAAW,OAAO,WAAW,MAAM,CAAC;AACzE,UAAM,gBAAgB,QAAQ,SAAS,OAAO,MAAM;AAEpD,QAAI,iBAAiB,eAAe;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ACvBO,SAAS,eACd,OACA,eAA6B,KAAK,QAC/B;AACH,QAAM,OAAO,MAAM,KAAK,MAAM,aAAa,IAAI,MAAM,MAAM,CAAC;AAE5D,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI,aAAa,gDAAgD;AAAA,EACzE;AAEA,SAAO;AACT;AAEO,SAAS,eAAkB,OAAY,OAAkB;AAC9D,QAAM,OAAO,MAAM,KAAK;AAExB,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI,aAAa,8BAA8B,KAAK,EAAE;AAAA,EAC9D;AAEA,SAAO;AACT;AAEO,SAAS,aACd,OACA,eAA6B,KAAK,QAC7B;AACL,QAAM,SAAS,CAAC,GAAG,KAAK;AAExB,WAAS,QAAQ,OAAO,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzD,UAAM,YAAY,KAAK,MAAM,aAAa,KAAK,QAAQ,EAAE;AAEzD,UAAM,eAAe,eAAe,QAAQ,KAAK;AACjD,UAAM,YAAY,eAAe,QAAQ,SAAS;AAElD,WAAO,KAAK,IAAI;AAChB,WAAO,SAAS,IAAI;AAAA,EACtB;AAEA,SAAO;AACT;;;AC9BA,SAAS,4BAA4B,QAAwB;AAC3D,SAAO,MAAM,KAAK,EAAE,OAAO,GAAG,MAAM,OAAO,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE;AACpE;AAEA,SAAS,uBAAuB,OAAuB;AACrD,SAAO,WAAW,KAAK,EACpB,QAAQ,kBAAkB,KAAK,EAC/B,KAAK;AACV;AAEA,SAAS,wBAAwB,eAA+B;AAC9D,QAAM,SAAS,cAAc,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,QAAQ;AAE3D,QAAM,MAAM,OAAO,OAAO,CAAC,aAAa,OAAO,UAAU;AACvD,QAAI,QAAQ,MAAM,GAAG;AACnB,YAAM,UAAU,QAAQ;AACxB,aAAO,eAAe,UAAU,IAAI,UAAU,IAAI;AAAA,IACpD;AAEA,WAAO,cAAc;AAAA,EACvB,GAAG,CAAC;AAEJ,UAAQ,KAAM,MAAM,MAAO;AAC7B;AAEA,SAAS,mBAAmB,OAAgC;AAC1D,QAAM,WAAW,2BAA2B,KAAK;AACjD,QAAM,UAAU,0BAA0B,KAAK;AAE/C,QAAM,SAAS,eAAe,QAAQ;AACtC,QAAM,cAAc,eAAe,OAAO;AAE1C,QAAM,aAAa,cAAc,OAAO,SAAS;AAEjD,QAAM,gBAAgB,SAAS,4BAA4B,UAAU;AACrE,QAAM,aAAa,wBAAwB,aAAa;AAExD,SAAO,gBAAgB,OAAO,UAAU;AAC1C;AAEA,SAAS,eAAe,mBAAmB,GAIzC;AACA,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,QAAQ,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACxE,QAAM,aACJ,IAAI,YAAY,IAChB,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,kBAAkB,CAAC,CAAC,IACxD;AAEF,QAAM,gBAAgB,OAAO,UAAU,EAAE,MAAM,EAAE;AAEjD,SAAO;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,QAAQ,GAAG,KAAK,IAAI,aAAa;AAAA,EACnC;AACF;AAEA,SAAS,YAAY,OAAgC;AACnD,QAAM,SAAS,6BAA6B,KAAK;AACjD,SAAO,4BAA4B,MAAM;AAC3C;AAEO,SAAS,mBACd,UAAqC,CAAC,GACtB;AAChB,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,YAAY,mBAAmB,KAAK;AAC1C,QAAM,SAAS,QAAQ,YACnB,uBAAuB,SAAS,IAChC;AACJ,QAAM,EAAE,aAAa,YAAY,OAAO,IAAI;AAAA,IAC1C,QAAQ;AAAA,EACV;AACA,QAAM,MAAM,YAAY,KAAK;AAE7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1FA,SAAS,YAAY,QAAyB;AAC5C,QAAM,SAAS,WAAW,MAAM;AAEhC,MAAI,MAAM;AACV,MAAI,eAAe;AAEnB,WAAS,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC1D,QAAI,QAAQ,OAAO,OAAO,KAAK,CAAC;AAEhC,QAAI,cAAc;AAChB,eAAS;AACT,UAAI,QAAQ,GAAG;AACb,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AACP,mBAAe,CAAC;AAAA,EAClB;AAEA,SAAO,MAAM,OAAO;AACtB;AAEA,SAAS,cACP,aACA,YACA,QACS;AACT,MAAI,QAAQ;AACZ,MAAI,OAAO;AAEX,OAAK,CAAC,SAAS,CAAC,SAAS,QAAQ;AAC/B,UAAM,QAAQ,OAAO,MAAM,oBAAoB;AAC/C,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,YAAQ,MAAM,CAAC;AACf,WAAO,MAAM,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,SAAS,CAAC,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,OAAO,KAAK;AAChC,QAAM,aAAa,OAAO,IAAI;AAE9B,MAAI,cAAc,KAAK,cAAc,IAAI;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,cAAc,OAAO,OAAO,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;AAC9D,QAAM,eAAe,IAAI,SAAS,IAAI;AAEtC,MAAI,aAAa,aAAa;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,eAAe,eAAe,cAAc;AAC7D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,KAAuB;AACxD,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,WAAW,GAAG;AAE7B,MAAI,UAAU,WAAW;AACvB,WAAO,OAAO,UAAU,KAAK,OAAO,UAAU;AAAA,EAChD;AAEA,QAAM,iBACJ,6BACE,KACF;AAEF,SAAO,OAAO,WAAW;AAC3B;AAEO,SAAS,mBACd,OAC4B;AAC5B,QAAM,SAAS,WAAW,MAAM,MAAM;AACtC,QAAM,QAAQ,sBAAsB,MAAM;AAC1C,QAAM,cACJ,UAAU,aACV,0BAA0B,KAAK,EAAE,SAAS,OAAO,MAAM,KACvD,YAAY,MAAM;AAEpB,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,WAAW,WAAW,OAAO,MAAM,GAAG;AAE5C,SAAO;AAAA,IACL,SAAS,eAAe,eAAe;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACjFO,SAAS,0BAA0B,SAAwB;AAChE,QAAM,MAAM,QACT,QAAQ,KAAK,EACb,YAAY,wDAAwD,EACpE;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,UAAU,EAClB,YAAY,sCAAsC,EAClD,OAAO,eAAe,+CAA+C,EACrE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,YAAY,2CAA2C,EAC9D;AAAA,IACC,CAAC,YAKK;AACJ,YAAM,SACJ,QAAQ,QAAQ,IACZ,iBAAiB;AAAA,QACf,WAAW,QAAQ;AAAA,QACnB,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,MAClB,CAAC,IACD;AAAA,QACE,YAAY;AAAA,UACV,WAAW,QAAQ;AAAA,UACnB,OAAO,QAAQ;AAAA,QACjB,CAAC;AAAA,MACH;AAEN,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEF,MACG,QAAQ,UAAU,EAClB,SAAS,WAAW,wBAAwB,EAC5C;AAAA,IACC;AAAA,EACF,EACC,OAAO,YAAY,+CAA+C,EAClE,OAAO,CAAC,OAAe,YAAkC;AACxD,eAAW,YAAY,OAAO,EAAE,QAAQ,QAAQ,OAAO,CAAC,CAAC;AAAA,EAC3D,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,SAAS,WAAW,sBAAsB,EAC1C,YAAY,iCAAiC,EAC7C,OAAO,CAAC,UAAkB;AACzB,eAAW,eAAe,KAAK,CAAC;AAAA,EAClC,CAAC;AAEH,MACG,QAAQ,OAAO,EACf,SAAS,WAAW,wCAAwC,EAC5D,YAAY,0CAA0C,EACtD,OAAO,CAAC,UAAkB;AACzB,eAAW,SAAS,KAAK,CAAC;AAAA,EAC5B,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,SAAS,WAAW,oBAAoB,EACxC,YAAY,8BAA8B,EAC1C;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,OAAe,YAA+B;AACrD,eAAW,QAAQ,OAAO,EAAE,SAAS,QAAQ,KAAK,CAAC,CAAC;AAAA,EACtD,CAAC;AAEH,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,yDAAyD,EACrE;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,OACG,QAAQ,UAAU,EAClB,YAAY,uCAAuC,EACnD,OAAO,eAAe,gDAAgD,EACtE;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,YAAY,2CAA2C,EAC9D;AAAA,IACC,CAAC,YAKK;AACJ,YAAM,SACJ,QAAQ,QAAQ,IACZ,kBAAkB;AAAA,QAChB,WAAW,QAAQ;AAAA,QACnB,QAAQ,QAAQ;AAAA,QAChB,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,MAClB,CAAC,IACD;AAAA,QACE,aAAa;AAAA,UACX,WAAW,QAAQ;AAAA,UACnB,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,MACH;AAEN,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEF,OACG,QAAQ,UAAU,EAClB,SAAS,WAAW,yBAAyB,EAC7C;AAAA,IACC;AAAA,EACF,EACC,OAAO,YAAY,kDAAkD,EACrE,OAAO,CAAC,OAAe,YAAkC;AACxD,eAAW,aAAa,OAAO,EAAE,QAAQ,QAAQ,OAAO,CAAC,CAAC;AAAA,EAC5D,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,SAAS,WAAW,uBAAuB,EAC3C,YAAY,sCAAsC,EAClD,OAAO,CAAC,UAAkB;AACzB,eAAW,gBAAgB,KAAK,CAAC;AAAA,EACnC,CAAC;AAEH,OACG,QAAQ,OAAO,EACf,SAAS,WAAW,yCAAyC,EAC7D,YAAY,0CAA0C,EACtD,OAAO,CAAC,UAAkB;AACzB,eAAW,UAAU,KAAK,CAAC;AAAA,EAC7B,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,SAAS,WAAW,qBAAqB,EACzC,YAAY,+BAA+B,EAC3C;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,OAAe,YAA+B;AACrD,eAAW,SAAS,OAAO,EAAE,SAAS,QAAQ,KAAK,CAAC,CAAC;AAAA,EACvD,CAAC;AAEH,QAAM,MAAM,QACT,QAAQ,KAAK,EACb,YAAY,wDAAwD,EACpE;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,UAAU,EAClB,YAAY,4CAA4C,EACxD,OAAO,eAAe,+CAA+C,EACrE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAIK;AACJ,YAAM,SACJ,QAAQ,QAAQ,IACZ,iBAAiB;AAAA,QACf,WAAW,QAAQ;AAAA,QACnB,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,MACjB,CAAC,IACD;AAAA,QACE,YAAY;AAAA,UACV,WAAW,QAAQ;AAAA,UACnB,OAAO,QAAQ;AAAA,QACjB,CAAC;AAAA,MACH;AAEN,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEF,MACG,QAAQ,UAAU,EAClB,SAAS,WAAW,wBAAwB,EAC5C;AAAA,IACC;AAAA,EACF,EACC,OAAO,YAAY,4CAA4C,EAC/D,OAAO,CAAC,OAAe,YAAkC;AACxD,eAAW,YAAY,OAAO,EAAE,QAAQ,QAAQ,OAAO,CAAC,CAAC;AAAA,EAC3D,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,SAAS,WAAW,sBAAsB,EAC1C,YAAY,4BAA4B,EACxC,OAAO,CAAC,UAAkB;AACzB,eAAW,eAAe,KAAK,CAAC;AAAA,EAClC,CAAC;AAEH,MACG,QAAQ,OAAO,EACf,SAAS,WAAW,wCAAwC,EAC5D,YAAY,0CAA0C,EACtD,OAAO,CAAC,UAAkB;AACzB,eAAW,SAAS,KAAK,CAAC;AAAA,EAC5B,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,SAAS,WAAW,oBAAoB,EACxC,YAAY,8BAA8B,EAC1C;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,OAAe,YAA+B;AACrD,eAAW,QAAQ,OAAO,EAAE,SAAS,QAAQ,KAAK,CAAC,CAAC;AAAA,EACtD,CAAC;AAEH,QAAM,aAAa,QAChB,QAAQ,aAAa,EACrB,MAAM,MAAM,EACZ,YAAY,sDAAsD,EAClE;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,aACG,QAAQ,UAAU,EAClB,YAAY,oCAAoC,EAChD,OAAO,mBAAmB,2BAA2B,cAAc,EACnE,OAAO,eAAe,oDAAoD,EAC1E;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAIK;AACJ,iBAAW,mBAAmB,OAAO,CAAC;AAAA,IACxC;AAAA,EACF;AAEF,aACG,QAAQ,UAAU,EAClB,YAAY,uCAAuC,EACnD,eAAe,oBAAoB,0BAA0B,EAC7D,OAAO,oBAAoB,yBAAyB,EACpD,OAAO,0BAA0B,eAAe,EAChD,OAAO,yBAAyB,cAAc,EAC9C,eAAe,iBAAiB,kBAAkB,EAClD;AAAA,IACC,CAAC,YAMK;AACJ,iBAAW,mBAAmB,OAAO,CAAC;AAAA,IACxC;AAAA,EACF;AAEF,aACG,QAAQ,QAAQ,EAChB,SAAS,YAAY,yBAAyB,EAC9C,YAAY,2CAA2C,EACvD,OAAO,CAAC,WAAmB;AAC1B,eAAW,sBAAsB,MAAM,CAAC;AAAA,EAC1C,CAAC;AACL;;;ACzXA,IAAM,oBAAkD;AAAA,EACtD,SAAS;AAAA,EACT,SAAS,KAAK;AAAA,EACd,OAAO,KAAK,KAAK;AAAA,EACjB,MAAM,KAAK,KAAK,KAAK;AACvB;AAEA,SAAS,gBAAgB,MAAY,OAAqB;AACxD,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AAChC,UAAM,IAAI,aAAa,uBAAuB,KAAK,EAAE;AAAA,EACvD;AACF;AAEA,SAAS,UAAU,OAAqB;AACtC,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,kBAAgB,MAAM,KAAK;AAC3B,SAAO;AACT;AAEA,SAAS,mBAAmB,OAA2B,OAAuB;AAC5E,QAAM,WAAW,SAAS;AAE1B,MAAI,CAAC,OAAO,UAAU,QAAQ,GAAG;AAC/B,UAAM,IAAI,aAAa,GAAG,KAAK,sBAAsB;AAAA,EACvD;AAEA,SAAO;AACT;AAEA,SAAS,KAAK,OAAuB;AACnC,SAAO,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG;AACtC;AAEA,SAAS,SAAS,MAA0B;AAC1C,QAAM,SAAS,KAAK,QAAQ;AAE5B,SAAO;AAAA,IACL,KAAK,KAAK,YAAY;AAAA,IACtB,MAAM,KAAK,MAAM,SAAS,GAAI;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAY,SAAyB;AAC1D,QAAM,eAAuC;AAAA,IAC3C,MAAM,OAAO,KAAK,eAAe,CAAC;AAAA,IAClC,IAAI,KAAK,KAAK,YAAY,IAAI,CAAC;AAAA,IAC/B,IAAI,KAAK,KAAK,WAAW,CAAC;AAAA,IAC1B,IAAI,KAAK,KAAK,YAAY,CAAC;AAAA,IAC3B,IAAI,KAAK,KAAK,cAAc,CAAC;AAAA,IAC7B,IAAI,KAAK,KAAK,cAAc,CAAC;AAAA,EAC/B;AAEA,SAAO,QAAQ;AAAA,IACb;AAAA,IACA,CAAC,UAAU,aAAa,KAAK;AAAA,EAC/B;AACF;AAEA,SAAS,WACP,MACA,SACA,YACM;AACN,QAAM,OAAO,mBAAmB,QAAQ,MAAM,MAAM;AACpD,QAAM,QAAQ,mBAAmB,QAAQ,OAAO,OAAO;AACvD,QAAM,UAAU,mBAAmB,QAAQ,SAAS,SAAS;AAC7D,QAAM,UAAU,mBAAmB,QAAQ,SAAS,SAAS;AAE7D,QAAM,UACJ,OAAO,kBAAkB,OACzB,QAAQ,kBAAkB,QAC1B,UAAU,kBAAkB,UAC5B,UAAU,kBAAkB;AAE9B,SAAO,IAAI,KAAK,KAAK,QAAQ,IAAI,aAAa,OAAO;AACvD;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI;AACF,QAAI,KAAK,eAAe,SAAS,EAAE,UAAU,MAAM,CAAC,EAAE,OAAO,oBAAI,KAAK,CAAC;AACvE,WAAO;AAAA,EACT,QAAQ;AACN,UAAM,IAAI,aAAa,sBAAsB,KAAK,EAAE;AAAA,EACtD;AACF;AAEA,SAAS,cAAc,MAAY,UAA0C;AAC3E,QAAM,YAAY,IAAI,KAAK,eAAe,SAAS;AAAA,IACjD;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAED,SAAO,UACJ,cAAc,IAAI,EAClB,OAA+B,CAAC,KAAK,SAAS;AAC7C,QAAI,KAAK,SAAS,WAAW;AAC3B,UAAI,KAAK,IAAI,IAAI,KAAK;AAAA,IACxB;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACT;AAEO,SAAS,kBAAgC;AAC9C,SAAO,SAAS,oBAAI,KAAK,CAAC;AAC5B;AAEO,SAAS,gBAAgB,OAAe,SAAyB;AACtE,SAAO,cAAc,UAAU,KAAK,GAAG,OAAO;AAChD;AAEO,SAAS,eAAe,OAAiC;AAC9D,SAAO;AAAA,IACL,OAAO;AAAA,IACP,GAAG,SAAS,UAAU,KAAK,CAAC;AAAA,EAC9B;AACF;AAEO,SAAS,UAAU,OAAe,SAAoC;AAC3E,SAAO,WAAW,UAAU,KAAK,GAAG,SAAS,CAAC,EAAE,YAAY;AAC9D;AAEO,SAAS,iBACd,OACA,SACQ;AACR,SAAO,WAAW,UAAU,KAAK,GAAG,SAAS,EAAE,EAAE,YAAY;AAC/D;AAEO,SAAS,UACd,MACA,IACA,OAAqB,WACL;AAChB,QAAM,OAAO,UAAU,IAAI;AAC3B,QAAM,QAAQ,UAAU,EAAE;AAC1B,QAAM,SAAS,kBAAkB,IAAI;AACrC,QAAM,OAAO,MAAM,QAAQ,IAAI,KAAK,QAAQ,KAAK;AAEjD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,OAAO,IAAI,QAAQ,CAAC,CAAC;AAAA,EAC9B;AACF;AAEO,SAAS,kBAAkB,OAAqC;AACrE,SAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,GAAG,SAAS,UAAU,KAAK,CAAC;AAAA,EAC9B;AACF;AAEO,SAAS,iBAAiB,OAA8C;AAC7E,QAAM,aAAa,OAAO,KAAK,EAAE,KAAK;AAEtC,MAAI,CAAC,UAAU,KAAK,UAAU,GAAG;AAC/B,UAAM,IAAI,aAAa,iCAAiC,KAAK,EAAE;AAAA,EACjE;AAEA,QAAM,UAAU,OAAO,UAAU;AACjC,QAAM,aACJ,KAAK,IAAI,OAAO,KAAK,OAAoB,iBAAiB;AAC5D,QAAM,SAAS,eAAe,YAAY,UAAU,MAAO;AAC3D,QAAM,OAAO,IAAI,KAAK,MAAM;AAE5B,kBAAgB,MAAM,UAAU;AAEhC,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,GAAG,SAAS,IAAI;AAAA,EAClB;AACF;AAEO,SAAS,sBACd,OACA,UAC0B;AAC1B,QAAM,OAAO,UAAU,KAAK;AAC5B,QAAM,qBAAqB,eAAe,QAAQ;AAClD,QAAM,QAAQ,cAAc,MAAM,kBAAkB;AAEpD,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW,GAAG,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM;AAAA,IAClG,KAAK,KAAK,YAAY;AAAA,EACxB;AACF;;;ACjNA,OAAO,YAAY;AACnB,OAAOC,SAAQ;AAiBf,SAAS,kBAAkB,SAAgD;AACzE,MAAI,QAAQ,SAAS,UAAa,QAAQ,SAAS,QAAW;AAC5D,UAAM,IAAI,aAAa,wCAAwC;AAAA,EACjE;AAEA,MAAI,QAAQ,SAAS,QAAW;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,OAAO,KAAK,QAAQ,MAAM,OAAO;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,QAAW;AAC9B,QAAI,CAACC,IAAG,WAAW,QAAQ,IAAI,KAAK,CAACA,IAAG,SAAS,QAAQ,IAAI,EAAE,OAAO,GAAG;AACvE,YAAM,IAAI,aAAa,wBAAwB,QAAQ,IAAI,EAAE;AAAA,IAC/D;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAASA,IAAG,aAAa,QAAQ,IAAI;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,IAAI,aAAa,sCAAsC;AAC/D;AAEA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,YAAY,MAAM,YAAY;AAEpC,MAAI,CAAC,OAAO,UAAU,EAAE,SAAS,SAAS,GAAG;AAC3C,UAAM,IAAI,aAAa,+BAA+B,KAAK,EAAE;AAAA,EAC/D;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,QAAgB,WAA2B;AAC/D,SAAO,OACJ,WAAW,mBAAmB,SAAS,CAAC,EACxC,OAAO,MAAM,EACb,OAAO,KAAK;AACjB;AAEA,SAAS,sBAAsB,OAAuB;AACpD,SAAO,MAAM,KAAK,EAAE,YAAY;AAClC;AAEO,SAAS,YACd,SACA,WACQ;AACR,QAAM,SAAS,kBAAkB,OAAO;AACxC,SAAO,aAAa,OAAO,SAAS,SAAS;AAC/C;AAEO,SAAS,WAAW,SAAoC;AAC7D,SAAO,YAAY,SAAS,KAAK;AACnC;AAEO,SAAS,YAAY,SAAoC;AAC9D,SAAO,YAAY,SAAS,MAAM;AACpC;AAEO,SAAS,cAAc,SAAoC;AAChE,SAAO,YAAY,SAAS,QAAQ;AACtC;AAEO,SAAS,cAAc,SAAoC;AAChE,SAAO,YAAY,SAAS,QAAQ;AACtC;AAEO,SAAS,YAAY,SAA8B;AACxD,QAAM,SAAS,kBAAkB,OAAO;AAExC,SAAO,OACJ,WAAW,mBAAmB,QAAQ,IAAI,GAAG,QAAQ,GAAG,EACxD,OAAO,OAAO,OAAO,EACrB,OAAO,KAAK;AACjB;AAEO,SAAS,gBAAgB,SAAkC;AAChE,SAAO,YAAY,EAAE,MAAM,QAAQ,KAAK,GAAG,QAAQ,QAAQ,QAAQ;AACrE;AAEO,SAAS,YAAY,SAAgD;AAC1E,QAAM,SAAS,kBAAkB,OAAO;AACxC,QAAM,YAAY,mBAAmB,QAAQ,QAAQ,QAAQ;AAC7D,QAAM,SAAS,aAAa,OAAO,SAAS,SAAS;AACrD,QAAM,WAAW,sBAAsB,QAAQ,QAAQ;AAEvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,WAAW;AAAA,IACpB,QAAQ,OAAO;AAAA,EACjB;AACF;;;ACnHA,OAAOC,aAAY;AAUnB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,SAAS;AACf,IAAM,UAAU;AAEhB,IAAM,cAA2C;AAAA,EAC/C,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM;AAAA,EACxC,OAAO,GAAG,SAAS,GAAG,SAAS;AAAA,EAC/B,SAAS;AAAA,EACT,KAAK;AAAA,EACL,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM;AAAA,EAC5C,OAAO;AAAA,EACP,OAAO;AACT;AAEA,SAAS,sBAAsB,OAAe,OAAqB;AACjE,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAM,IAAI,aAAa,GAAG,KAAK,8BAA8B;AAAA,EAC/D;AACF;AAEA,SAAS,aAAa,OAAwB;AAC5C,QAAM,WAAW,SAAS;AAC1B,wBAAsB,UAAU,OAAO;AACvC,SAAO;AACT;AAEA,SAAS,cAAc,QAA4B,UAA0B;AAC3E,QAAM,WAAW,UAAU;AAC3B,wBAAsB,UAAU,QAAQ;AACxC,SAAO;AACT;AAEA,SAAS,cAAc,MAA2B;AAChD,SAAO,YAAY,IAAI;AACzB;AAEA,SAAS,gBAAgB,SAAyB;AAChD,SAAO,QAAQC,QAAO,UAAU,GAAG,QAAQ,MAAM,CAAC;AACpD;AAEA,SAAS,aAAa,QAAgB,SAAyB;AAC7D,SAAO,MAAM,KAAK,EAAE,OAAO,GAAG,MAAM,gBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE;AACvE;AAEA,SAAS,sBAAsB,SAAuB;AACpD,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAAuB;AACtD,MAAI,QAAQ,KAAK,KAAK,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQA,QAAO,UAAU,GAAG,MAAM,MAAM;AAC9C,QAAM,cAAc,gBAAgB,SAAS;AAE7C,SAAO,GAAG,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,WAAW,GAAG,MAAM,MAAM,QAAQ,CAAC,CAAC;AACxE;AAEA,SAAS,oBAAoB,SAA+B;AAC1D,SAAO,cAAc,WAAW,OAAO;AACzC;AAEA,SAAS,uBAAuB,SAA0C;AACxE,MAAI,UAAU,QAAQ,UAClB,cAAc,QAAQ,OAAO,IAC7B,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO;AAE/C,MAAI,QAAQ,WAAW;AACrB,cAAU,QAAQ,QAAQ,UAAU,EAAE;AAAA,EACxC;AAEA,MAAI,QAAQ,WAAW;AACrB,cAAU,QAAQ,QAAQ,kCAAkC,EAAE;AAAA,EAChE;AAEA,MAAI,QAAQ,aAAa,CAAC,QAAQ,KAAK,OAAO,GAAG;AAC/C,eAAW;AAAA,EACb;AAEA,wBAAsB,OAAO;AAC7B,SAAO;AACT;AAEO,SAAS,mBACd,UAA+B,CAAC,GACtB;AACV,QAAM,QAAQ,aAAa,QAAQ,KAAK;AACxC,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,MAAMA,QAAO,WAAW,CAAC;AAChE;AAEO,SAAS,oBACd,UAAgC,CAAC,GACvB;AACV,QAAM,QAAQ,aAAa,QAAQ,KAAK;AACxC,QAAM,SAAS,cAAc,QAAQ,QAAQ,EAAE;AAC/C,QAAM,UAAU,oBAAoB,QAAQ,OAAO;AAEnD,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,MAAM,aAAa,QAAQ,OAAO,CAAC;AAC1E;AAEO,SAAS,uBACd,UAAmC,CAAC,GAC1B;AACV,QAAM,QAAQ,aAAa,QAAQ,KAAK;AACxC,QAAM,SAAS,cAAc,QAAQ,QAAQ,EAAE;AAC/C,QAAM,UAAU,uBAAuB,OAAO;AAE9C,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,MAAM;AACzC,QAAI,WAAW,aAAa,QAAQ,OAAO;AAE3C,QAAI,QAAQ,WAAW;AACrB,iBAAW,wBAAwB,QAAQ;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT,CAAC;AACH;;;AC/FA,SAAS,iBAAiB,QAAwB;AAChD,MAAI,OAAO,WAAW,GAAG;AACvB,eAAW,OAAO,CAAC,CAAE;AACrB;AAAA,EACF;AAEA,aAAW,MAAM;AACnB;AAEO,SAAS,uBAAuB,SAAwB;AAC7D,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,qDAAqD,EACjE;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,OACG,QAAQ,KAAK,EACb,YAAY,2CAA2C,EACvD,OAAO,kBAAkB,uBAAuB,EAChD,OAAO,iBAAiB,eAAe,EACvC,OAAO,CAAC,YAA8C;AACrD,eAAW,WAAW,OAAO,CAAC;AAAA,EAChC,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,YAAY,4CAA4C,EACxD,OAAO,kBAAkB,uBAAuB,EAChD,OAAO,iBAAiB,eAAe,EACvC,OAAO,CAAC,YAA8C;AACrD,eAAW,YAAY,OAAO,CAAC;AAAA,EACjC,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,8CAA8C,EAC1D,OAAO,kBAAkB,uBAAuB,EAChD,OAAO,iBAAiB,eAAe,EACvC,OAAO,CAAC,YAA8C;AACrD,eAAW,cAAc,OAAO,CAAC;AAAA,EACnC,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,8CAA8C,EAC1D,OAAO,kBAAkB,uBAAuB,EAChD,OAAO,iBAAiB,eAAe,EACvC,OAAO,CAAC,YAA8C;AACrD,eAAW,cAAc,OAAO,CAAC;AAAA,EACnC,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,YAAY,0CAA0C,EACtD,eAAe,iBAAiB,0BAA0B,EAC1D,OAAO,iBAAiB,0BAA0B,QAAQ,EAC1D,OAAO,kBAAkB,uBAAuB,EAChD,OAAO,iBAAiB,eAAe,EACvC;AAAA,IACC,CAAC,YAKK;AACJ,iBAAW,YAAY,OAAO,CAAC;AAAA,IACjC;AAAA,EACF;AAEF,OACG,QAAQ,UAAU,EAClB,YAAY,8BAA8B,EAC1C,eAAe,iBAAiB,eAAe,EAC/C,OAAO,iBAAiB,0BAA0B,QAAQ,EAC1D,OAAO,CAAC,YAA6C;AACpD,eAAW,gBAAgB,OAAO,CAAC;AAAA,EACrC,CAAC;AAEH,OACG,QAAQ,SAAS,EACjB,YAAY,oDAAoD,EAChE,eAAe,qBAAqB,sBAAsB,EAC1D,OAAO,iBAAiB,0BAA0B,QAAQ,EAC1D,OAAO,kBAAkB,uBAAuB,EAChD,OAAO,iBAAiB,eAAe,EACvC;AAAA,IACC,CAAC,YAKK;AACJ,iBAAW,YAAY,OAAO,CAAC;AAAA,IACjC;AAAA,EACF;AAEF,QAAM,KAAK,QACR,QAAQ,IAAI,EACZ,YAAY,8CAA8C,EAC1D;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,KAAG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,YAA+B;AACtC,qBAAiB,mBAAmB,OAAO,CAAC;AAAA,EAC9C,CAAC;AAEH,KAAG,QAAQ,OAAO,EACf,YAAY,yBAAyB,EACrC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,qBAAqB,yBAAyB,oBAAoB,EACzE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAAuE;AACtE,uBAAiB,oBAAoB,OAAO,CAAC;AAAA,IAC/C;AAAA,EACF;AAEF,KAAG,QAAQ,UAAU,EAClB,YAAY,4BAA4B,EACxC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,gBAAgB,2CAA2C,EAClE,OAAO,gBAAgB,0CAA0C,EACjE,OAAO,eAAe,uCAAuC,EAC7D;AAAA,IACC,CAAC,YAOK;AACJ,uBAAiB,uBAAuB,OAAO,CAAC;AAAA,IAClD;AAAA,EACF;AAEF,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,mDAAmD,EAC/D;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,OACG,QAAQ,KAAK,EACb,YAAY,kCAAkC,EAC9C,OAAO,MAAM;AACZ,eAAW,gBAAgB,CAAC;AAAA,EAC9B,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,sCAAsC,EAClD,eAAe,kBAAkB,wBAAwB,EACzD,eAAe,qBAAqB,qBAAqB,EACzD,OAAO,CAAC,YAA+C;AACtD,eAAW,gBAAgB,QAAQ,MAAM,QAAQ,OAAO,CAAC;AAAA,EAC3D,CAAC;AAEH,OACG,QAAQ,OAAO,EACf,YAAY,qDAAqD,EACjE,eAAe,kBAAkB,wBAAwB,EACzD,OAAO,CAAC,YAA8B;AACrC,eAAW,eAAe,QAAQ,IAAI,CAAC;AAAA,EACzC,CAAC;AAEH,OACG,QAAQ,KAAK,EACb,YAAY,qBAAqB,EACjC,eAAe,kBAAkB,wBAAwB,EACzD,OAAO,mBAAmB,cAAc,oBAAoB,EAC5D,OAAO,oBAAoB,eAAe,oBAAoB,EAC9D,OAAO,sBAAsB,iBAAiB,oBAAoB,EAClE,OAAO,sBAAsB,iBAAiB,oBAAoB,EAClE;AAAA,IACC,CAAC,YAMK;AACJ,iBAAW,UAAU,QAAQ,MAAM,OAAO,CAAC;AAAA,IAC7C;AAAA,EACF;AAEF,OACG,QAAQ,KAAK,EACb,YAAY,4BAA4B,EACxC,eAAe,kBAAkB,wBAAwB,EACzD,OAAO,mBAAmB,cAAc,oBAAoB,EAC5D,OAAO,oBAAoB,eAAe,oBAAoB,EAC9D,OAAO,sBAAsB,iBAAiB,oBAAoB,EAClE,OAAO,sBAAsB,iBAAiB,oBAAoB,EAClE;AAAA,IACC,CAAC,YAMK;AACJ,iBAAW,iBAAiB,QAAQ,MAAM,OAAO,CAAC;AAAA,IACpD;AAAA,EACF;AAEF,OACG,QAAQ,MAAM,EACd,YAAY,6CAA6C,EACzD,eAAe,kBAAkB,yBAAyB,EAC1D,eAAe,gBAAgB,yBAAyB,EACxD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,YAA8D;AACrE,eAAW,UAAU,QAAQ,MAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC;AAAA,EAC9D,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,SAAS,WAAW,iDAAiD,EACrE,YAAY,qCAAqC,EACjD,OAAO,kBAAkB,qCAAqC,EAC9D,OAAO,CAAC,OAA2B,YAA+B;AACjE,QAAI,QAAQ,SAAS,QAAW;AAC9B,iBAAW,kBAAkB,QAAQ,IAAI,CAAC;AAC1C;AAAA,IACF;AAEA,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,eAAW,iBAAiB,KAAK,CAAC;AAAA,EACpC,CAAC;AAEH,OACG,QAAQ,IAAI,EACZ,YAAY,2DAA2D,EACvE,eAAe,kBAAkB,yBAAyB,EAC1D;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,YAA0C;AACjD,eAAW,sBAAsB,QAAQ,MAAM,QAAQ,EAAE,CAAC;AAAA,EAC5D,CAAC;AACL;;;ACvVO,SAAS,mBAAmB,MAA6B;AAC9D,MAAI,SAAS,QAAW;AACtB,WAAO,KAAK;AAAA,EACd;AAEA,MAAI,QAAQ,KAAK,MAAM,IAAI,MAAM;AAEjC,SAAO,MAAM;AACX,YAAS,QAAQ,eAAgB;AACjC,QAAI,QAAQ;AACZ,YAAQ,KAAK,KAAK,QAAS,UAAU,IAAK,QAAQ,CAAC;AACnD,aAAS,QAAQ,KAAK,KAAK,QAAS,UAAU,GAAI,QAAQ,EAAE;AAE5D,aAAS,QAAS,UAAU,QAAS,KAAK;AAAA,EAC5C;AACF;;;ACbA,SAAS,WAAW,KAAsB;AACxC,SAAO,OAAO,OAAO;AACvB;AAEA,SAAS,WAAW,KAAsB;AACxC,SAAO,OAAO,OAAO;AACvB;AAEO,SAAS,iBAAiB,UAA+B,CAAC,GAAW;AAC1E,QAAM,MAAM,WAAW,QAAQ,GAAG;AAClC,QAAM,MAAM,WAAW,QAAQ,GAAG;AAClC,QAAM,eAAe,mBAAmB,QAAQ,IAAI;AAEpD,MAAI,CAAC,OAAO,UAAU,GAAG,KAAK,CAAC,OAAO,UAAU,GAAG,GAAG;AACpD,UAAM,IAAI,aAAa,8CAA8C;AAAA,EACvE;AAEA,MAAI,MAAM,KAAK;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,MAAM,aAAa,KAAK,MAAM,MAAM,EAAE,IAAI;AACxD;;;ACfA,SAAS,kBAAkB,KAAsB;AAC/C,SAAO,OAAO,OAAO;AACvB;AAEA,SAAS,kBAAkB,KAAsB;AAC/C,SAAO,OAAO,OAAO;AACvB;AAEA,SAAS,gBAAgB,KAAsB;AAC7C,SAAO,OAAO;AAChB;AAEA,SAAS,gBAAgB,KAAsB;AAC7C,SAAO,OAAO;AAChB;AAEA,SAAS,qBACP,KACA,KACA,cACQ;AACR,SAAO,KAAK,MAAM,aAAa,KAAK,MAAM,MAAM,EAAE,IAAI;AACxD;AAEA,SAAS,mBACP,KACA,KACA,cACQ;AACR,SAAO,aAAa,KAAK,MAAM,OAAO;AACxC;AAEA,SAAS,cAAc,KAAa,KAAa,cAAc,MAAY;AACzE,MAAI,gBAAgB,CAAC,OAAO,UAAU,GAAG,KAAK,CAAC,OAAO,UAAU,GAAG,IAAI;AACrE,UAAM,IAAI,aAAa,8CAA8C;AAAA,EACvE;AAEA,MAAI,MAAM,KAAK;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,OAAqB;AAC1C,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAM,IAAI,aAAa,mCAAmC;AAAA,EAC5D;AACF;AAEA,SAAS,mBAAmB,WAAwC;AAClE,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,GAAG;AACjD,UAAM,IAAI,aAAa,2CAA2C;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAA2B;AACjD,QAAM,aAAa,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAElE,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,aAAa,qCAAqC;AAAA,EAC9D;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAe,WAA4B;AACtE,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,MAAM,QAAQ,SAAS,CAAC;AACxC;AAEO,SAAS,uBACd,UAAwC,CAAC,GAC/B;AACV,QAAM,MAAM,kBAAkB,QAAQ,GAAG;AACzC,QAAM,MAAM,kBAAkB,QAAQ,GAAG;AACzC,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,eAAe,mBAAmB,QAAQ,IAAI;AAEpD,gBAAc,KAAK,KAAK,IAAI;AAC5B,gBAAc,KAAK;AAEnB,QAAM,mBAAmB,MAAM,MAAM;AAErC,MAAI,UAAU,QAAQ,kBAAkB;AACtC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AAEJ,MAAI,QAAQ;AACV,UAAM,OAAO,MAAM;AAAA,MACjB,EAAE,QAAQ,iBAAiB;AAAA,MAC3B,CAAC,GAAG,UAAU,MAAM;AAAA,IACtB;AACA,aAAS,aAAa,MAAM,YAAY,EAAE,MAAM,GAAG,KAAK;AAAA,EAC1D,OAAO;AACL,aAAS,MAAM;AAAA,MAAK,EAAE,QAAQ,MAAM;AAAA,MAAG,MACrC,qBAAqB,KAAK,KAAK,YAAY;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,WAAO,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAC7B;AAEA,SAAO;AACT;AAQO,SAAS,qBACd,UAAsC,CAAC,GAC7B;AACV,QAAM,MAAM,gBAAgB,QAAQ,GAAG;AACvC,QAAM,MAAM,gBAAgB,QAAQ,GAAG;AACvC,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,YAAY,mBAAmB,QAAQ,SAAS;AACtD,QAAM,eAAe,mBAAmB,QAAQ,IAAI;AAEpD,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,GAAG;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,KAAK,KAAK,KAAK;AAC7B,gBAAc,KAAK;AAEnB,QAAM,SAAS,MAAM;AAAA,IAAK,EAAE,QAAQ,MAAM;AAAA,IAAG,MAC3C,oBAAoB,mBAAmB,KAAK,KAAK,YAAY,GAAG,SAAS;AAAA,EAC3E;AAEA,MAAI,QAAQ;AACV,WAAO,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAC7B;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,SAAsC;AACpE,QAAM,QAAQ,eAAe,QAAQ,KAAK;AAC1C,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,eAAe,mBAAmB,QAAQ,IAAI;AAEpD,gBAAc,KAAK;AAEnB,MAAI,UAAU,QAAQ,MAAM,QAAQ;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,WAAO,aAAa,OAAO,YAAY,EAAE,MAAM,GAAG,KAAK;AAAA,EACzD;AAEA,SAAO,MAAM;AAAA,IAAK,EAAE,QAAQ,MAAM;AAAA,IAAG,MACnC,eAAe,OAAO,YAAY;AAAA,EACpC;AACF;AAEO,SAAS,mBAAmB,SAAyC;AAC1E,SAAO;AAAA,IACL,eAAe,QAAQ,KAAK;AAAA,IAC5B,mBAAmB,QAAQ,IAAI;AAAA,EACjC;AACF;AAEO,SAAS,SAAS,UAA2B,CAAC,GAAa;AAChE,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,eAAe,mBAAmB,QAAQ,IAAI;AAEpD,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,KAAK;AAEnB,SAAO,MAAM;AAAA,IAAK,EAAE,QAAQ,MAAM;AAAA,IAAG,MACnC,qBAAqB,GAAG,OAAO,YAAY;AAAA,EAC7C;AACF;AAEO,SAAS,SAAS,UAA2B,CAAC,GAAsB;AACzE,QAAM,eAAe,mBAAmB,QAAQ,IAAI;AAEpD,SAAO,aAAa,IAAI,MAAM,UAAU;AAC1C;;;AC/NA,OAAOC,SAAQ;;;ACOf,SAAS,cAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,eAAkB,OAAa;AACtC,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAEA,SAAS,aAAa,OAAyB;AAC7C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,aAAa,IAAI,CAAC;AAAA,EAC/C;AAEA,MAAI,cAAc,KAAK,GAAG;AACxB,WAAO,OAAO,KAAK,KAAK,EACrB,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,OAAgC,CAAC,aAAa,QAAQ;AACrD,kBAAY,GAAG,IAAI,aAAa,MAAM,GAAG,CAAC;AAC1C,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAwB;AAChD,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAC3D,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,mBAAmB,KAAK,KAAK,GAAG;AAClC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAEA,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAS,YAAY,OAAgB,QAAQ,GAAa;AACxD,QAAM,SAAS,KAAK,OAAO,KAAK;AAEhC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,CAAC,GAAG,MAAM,IAAI;AAAA,IACvB;AAEA,WAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,UAAI,MAAM,QAAQ,IAAI,KAAK,cAAc,IAAI,GAAG;AAC9C,cAAM,SAAS,YAAY,MAAM,QAAQ,CAAC;AAC1C,eAAO,CAAC,GAAG,MAAM,KAAK,GAAG,MAAM;AAAA,MACjC;AAEA,aAAO,CAAC,GAAG,MAAM,KAAK,iBAAiB,IAAI,CAAC,EAAE;AAAA,IAChD,CAAC;AAAA,EACH;AAEA,MAAI,cAAc,KAAK,GAAG;AACxB,UAAM,OAAO,OAAO,KAAK,KAAK;AAE9B,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO,CAAC,GAAG,MAAM,IAAI;AAAA,IACvB;AAEA,WAAO,KAAK,QAAQ,CAAC,QAAQ;AAC3B,YAAM,QAAQ,MAAM,GAAG;AAEvB,UAAI,MAAM,QAAQ,KAAK,KAAK,cAAc,KAAK,GAAG;AAChD,eAAO,CAAC,GAAG,MAAM,GAAG,GAAG,KAAK,GAAG,YAAY,OAAO,QAAQ,CAAC,CAAC;AAAA,MAC9D;AAEA,aAAO,CAAC,GAAG,MAAM,GAAG,GAAG,KAAK,iBAAiB,KAAK,CAAC,EAAE;AAAA,IACvD,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,GAAG,MAAM,GAAG,iBAAiB,KAAK,CAAC,EAAE;AAC/C;AAEA,SAAS,UAAUC,QAAwB;AACzC,QAAM,WAAWA,OAAK,MAAM,WAAW,KAAK,CAAC;AAE7C,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,aAAa,4BAA4B;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAe,UAA6B;AACvE,MAAI,UAAmB;AAEvB,aAAW,WAAW,UAAU;AAC9B,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,YAAM,QAAQ,OAAO,OAAO;AAE5B,UAAI,CAAC,OAAO,UAAU,KAAK,GAAG;AAC5B,eAAO;AAAA,MACT;AAEA,gBAAU,QAAQ,KAAK;AACvB;AAAA,IACF;AAEA,QAAI,cAAc,OAAO,GAAG;AAC1B,gBAAU,QAAQ,OAAO;AACzB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,UAAkB,SAAkC;AAC1E,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,GAAG,QAAQ,IAAI,OAAO;AAAA,EAC/B;AAEA,SAAO,aAAa,MAAM,KAAK,OAAO,KAAK,GAAG,QAAQ,IAAI,OAAO;AACnE;AAEA,SAAS,UAAU,MAAe,OAAyB;AACzD,SAAO,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,KAAK;AACtD;AAEA,SAAS,WACP,MACA,OACA,WAAW,KACM;AACjB,MAAI,UAAU,MAAM,KAAK,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,MAAM,QAAQ,IAAI,KAAK,MAAM,QAAQ,KAAK,GAAG;AAC/C,UAAM,SAA0B,CAAC;AACjC,UAAM,YAAY,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM;AAEpD,aAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS,GAAG;AACjD,UAAI,SAAS,KAAK,QAAQ;AACxB,eAAO,KAAK;AAAA,UACV,MAAM,eAAe,UAAU,KAAK;AAAA,UACpC,MAAM;AAAA,UACN,OAAO,MAAM,KAAK;AAAA,QACpB,CAAC;AACD;AAAA,MACF;AAEA,UAAI,SAAS,MAAM,QAAQ;AACzB,eAAO,KAAK;AAAA,UACV,MAAM,eAAe,UAAU,KAAK;AAAA,UACpC,MAAM;AAAA,UACN,MAAM,KAAK,KAAK;AAAA,QAClB,CAAC;AACD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,UACD,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,eAAe,UAAU,KAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,IAAI,KAAK,cAAc,KAAK,GAAG;AAC/C,UAAM,SAA0B,CAAC;AACjC,UAAM,OAAO,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC;AAElE,eAAW,OAAO,MAAM,KAAK,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG;AACrE,UAAI,EAAE,OAAO,OAAO;AAClB,eAAO,KAAK;AAAA,UACV,MAAM,eAAe,UAAU,GAAG;AAAA,UAClC,MAAM;AAAA,UACN,OAAO,MAAM,GAAG;AAAA,QAClB,CAAC;AACD;AAAA,MACF;AAEA,UAAI,EAAE,OAAO,QAAQ;AACnB,eAAO,KAAK;AAAA,UACV,MAAM,eAAe,UAAU,GAAG;AAAA,UAClC,MAAM;AAAA,UACN,MAAM,KAAK,GAAG;AAAA,QAChB,CAAC;AACD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG,WAAW,KAAK,GAAG,GAAG,MAAM,GAAG,GAAG,eAAe,UAAU,GAAG,CAAC;AAAA,MACpE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,MAAe,OAAyB;AACzD,MAAI,MAAM,QAAQ,IAAI,KAAK,MAAM,QAAQ,KAAK,GAAG;AAC/C,WAAO,eAAe,KAAK;AAAA,EAC7B;AAEA,MAAI,cAAc,IAAI,KAAK,cAAc,KAAK,GAAG;AAC/C,UAAM,SAAkC,eAAe,IAAI;AAE3D,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAI,OAAO,QAAQ;AACjB,eAAO,GAAG,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK;AAAA,MAC5C,OAAO;AACL,eAAO,GAAG,IAAI,eAAe,KAAK;AAAA,MACpC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,KAAK;AAC7B;AAEO,SAAS,eAAe,OAAwB;AACrD,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,SAAS,OAAO;AACd,UAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,UAAM,IAAI,aAAa,OAAO;AAAA,EAChC;AACF;AAEO,SAAS,kBAAkB,OAAqC;AACrE,MAAI;AACF,SAAK,MAAM,KAAK;AAChB,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB,SAAS,OAAO;AACd,UAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,WAAO,EAAE,SAAS,OAAO,OAAO,QAAQ;AAAA,EAC1C;AACF;AAEO,SAAS,gBACd,OACA,SAAS,GACT,WAAW,OACH;AACR,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,SAAS,GAAG;AAC3C,UAAM,IAAI,aAAa,wCAAwC;AAAA,EACjE;AAEA,QAAM,aAAa,WAAW,aAAa,KAAK,IAAI;AACpD,SAAO,KAAK,UAAU,YAAY,MAAM,MAAM;AAChD;AAEO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEO,SAAS,iBAAiB,OAAgBA,QAAuB;AACtE,SAAO,oBAAoB,OAAO,UAAUA,MAAI,CAAC;AACnD;AAEO,SAAS,iBACd,OACAA,QACA,UACS;AACT,QAAM,OAAO,eAAe,KAAK;AACjC,QAAM,WAAW,UAAUA,MAAI;AAC/B,MAAI,UAAmB;AAEvB,WAAS,QAAQ,CAAC,SAAS,UAAU;AACnC,UAAM,SAAS,UAAU,SAAS,SAAS;AAC3C,UAAM,cAAc,SAAS,QAAQ,CAAC;AACtC,UAAM,oBACJ,gBAAgB,UAAa,QAAQ,KAAK,WAAW;AAEvD,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,YAAM,eAAe,OAAO,OAAO;AAEnC,UAAI,CAAC,OAAO,UAAU,YAAY,GAAG;AACnC,cAAM,IAAI,aAAa,gCAAgC,OAAO,EAAE;AAAA,MAClE;AAEA,UAAI,QAAQ;AACV,gBAAQ,YAAY,IAAI;AACxB;AAAA,MACF;AAEA,UAAI,QAAQ,YAAY,MAAM,QAAW;AACvC,gBAAQ,YAAY,IAAI,oBAAoB,CAAC,IAAI,CAAC;AAAA,MACpD;AAEA,gBAAU,QAAQ,YAAY;AAC9B;AAAA,IACF;AAEA,QAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,YAAM,IAAI,aAAa,sCAAsC,OAAO,EAAE;AAAA,IACxE;AAEA,QAAI,QAAQ;AACV,cAAQ,OAAO,IAAI;AACnB;AAAA,IACF;AAEA,QAAI,QAAQ,OAAO,MAAM,QAAW;AAClC,cAAQ,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC;AAAA,IAC/C;AAEA,cAAU,QAAQ,OAAO;AAAA,EAC3B,CAAC;AAED,SAAO;AACT;AAEO,SAAS,oBAAoB,OAAgBA,QAAuB;AACzE,QAAM,OAAO,eAAe,KAAK;AACjC,QAAM,WAAW,UAAUA,MAAI;AAC/B,QAAM,SAAS,oBAAoB,MAAM,SAAS,MAAM,GAAG,EAAE,CAAC;AAC9D,QAAM,cAAc,SAAS,SAAS,SAAS,CAAC;AAEhD,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,UAAM,QAAQ,OAAO,WAAW;AAEhC,QAAI,CAAC,OAAO,UAAU,KAAK,GAAG;AAC5B,YAAM,IAAI,aAAa,gCAAgC,WAAW,EAAE;AAAA,IACtE;AAEA,WAAO,OAAO,OAAO,CAAC;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,MAAM,GAAG;AACzB,WAAO,OAAO,WAAW;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,KAAK,cAAc,IAAI,GAAG;AAChD,WAAO,KAAK,WAAW;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,aAAa,mBAAmBA,MAAI,EAAE;AAClD;AAEO,SAAS,eAAe,MAAe,OAAgC;AAC5E,QAAM,UAAU,WAAW,MAAM,KAAK;AACtC,SAAO;AAAA,IACL,SAAS,QAAQ,WAAW;AAAA,IAC5B;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,QAA4B;AAC1D,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI,aAAa,2CAA2C;AAAA,EACpE;AAEA,SAAO,OAAO,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,YAAY;AACtD,WAAO,UAAU,aAAa,OAAO;AAAA,EACvC,GAAG,eAAe,OAAO,CAAC,CAAC,CAAC;AAC9B;AAEO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,YAAY,KAAK,EAAE,KAAK,IAAI;AACrC;;;ADpYO,SAAS,eAAe,SAGpB;AACT,MAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,MAAI,QAAQ,SAAS,QAAW;AAC9B,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,QAAQ,MAAM;AAChB,WAAOC,IAAG,aAAa,QAAQ,MAAM,OAAO;AAAA,EAC9C;AAEA,QAAM,IAAI,MAAM,sCAAsC;AACxD;AAEO,SAAS,oBAAoB,OAAqC;AACvE,MAAI,UAAU,QAAW;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9C;AAEO,SAAS,qBAAqB,SAOnC;AACA,MAAI,QAAQ,QAAQ,QAAQ,OAAO;AACjC,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,MAAI,QAAQ,MAAM;AAChB,UAAM,MAAMA,IAAG,aAAa,QAAQ,MAAM,OAAO;AAEjD,WAAO;AAAA,MACL,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA,QAAQ,eAAe,GAAG;AAAA,IAC5B;AAAA,EACF;AAEA,MAAI,QAAQ,UAAU,QAAW;AAC/B,WAAO;AAAA,MACL,KAAK,QAAQ;AAAA,MACb,QAAQ,eAAe,QAAQ,KAAK;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,uCAAuC;AACzD;AAEO,SAAS,wBAAwB,SAG1B;AACZ,QAAM,aAAa,oBAAoB,QAAQ,IAAI;AACnD,QAAM,eAAe,oBAAoB,QAAQ,KAAK;AAEtD,MAAI,WAAW,SAAS,aAAa,SAAS,GAAG;AAC/C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG,WAAW,IAAI,CAAC,aAAa;AAC9B,YAAM,MAAMA,IAAG,aAAa,UAAU,OAAO;AAC7C,aAAO,eAAe,GAAG;AAAA,IAC3B,CAAC;AAAA,IACD,GAAG,aAAa,IAAI,CAAC,UAAU,eAAe,KAAK,CAAC;AAAA,EACtD;AACF;AAEO,SAAS,mBAAmB,OAAwB;AACzD,MAAIA,IAAG,WAAW,KAAK,KAAKA,IAAG,SAAS,KAAK,EAAE,OAAO,GAAG;AACvD,WAAO,eAAeA,IAAG,aAAa,OAAO,OAAO,CAAC;AAAA,EACvD;AAEA,SAAO,eAAe,KAAK;AAC7B;AAEO,SAAS,cAAc,WAAmB,SAAuB;AACtE,EAAAA,IAAG,cAAc,WAAW,SAAS,OAAO;AAC9C;AAEO,SAAS,UAAU,OAAgB,MAAyB;AACjE,MAAI,SAAS,MAAM;AACjB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,MAAI,CAAC,SAAS,CAAC,MAAM;AACnB,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,MAAI,OAAO;AACT,UAAMC,UAAS,MACZ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAEjB,QAAIA,QAAO,WAAW,GAAG;AACvB,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,WAAOA;AAAA,EACT;AAEA,QAAM,UAAUD,IAAG,aAAa,MAAO,OAAO;AAC9C,QAAM,SAAS,QACZ,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAEjB,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AE9GO,SAAS,uBAAuB,SAAwB;AAC7D,QAAM,eAAe,QAClB,QAAQ,eAAe,EACvB,MAAM,MAAM,EACZ;AAAA,IACC;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,eACG,QAAQ,KAAK,EACb,MAAM,UAAU,EAChB,YAAY,0CAA0C,EACtD,OAAO,kBAAkB,0BAA0B,YAAY,EAC/D,OAAO,kBAAkB,0BAA0B,YAAY,EAC/D;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,YAAY,mDAAmD,EACtE,OAAO,YAAY,+CAA+C,EAClE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAQK;AACJ,wBAAkB,uBAAuB,OAAO,GAAG,QAAQ,MAAM;AAAA,IACnE;AAAA,EACF;AAEF,eACG,QAAQ,OAAO,EACf,YAAY,wDAAwD,EACpE,OAAO,kBAAkB,0BAA0B,WAAW,EAC9D,OAAO,kBAAkB,0BAA0B,WAAW,EAC9D;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,YAAY,+CAA+C,EAClE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAQK;AACJ,wBAAkB,qBAAqB,OAAO,GAAG,QAAQ,MAAM;AAAA,IACjE;AAAA,EACF;AAEF,eACG,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,OAAO,iBAAiB,qCAAqC,EAC7D;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,YAAY,sCAAsC,EACzD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAOK;AACJ,YAAM,SAAS,gBAAgB;AAAA,QAC7B,OAAO,UAAU,QAAQ,OAAO,QAAQ,IAAI;AAAA,QAC5C,OAAO,QAAQ;AAAA,QACf,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,QACjE,GAAI,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,MAC7D,CAAC;AAED,wBAAkB,QAAQ,QAAQ,MAAM;AAAA,IAC1C;AAAA,EACF;AAEF,eACG,QAAQ,SAAS,EACjB,YAAY,0BAA0B,EACtC,OAAO,iBAAiB,mCAAmC,EAC3D;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAKK;AACJ,YAAM,SAAS,mBAAmB;AAAA,QAChC,OAAO,UAAU,QAAQ,OAAO,QAAQ,IAAI;AAAA,QAC5C,GAAI,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,MAC7D,CAAC;AAED,wBAAkB,QAAQ,QAAQ,MAAM;AAAA,IAC1C;AAAA,EACF;AAEF,eACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAKK;AACJ,wBAAkB,SAAS,OAAO,GAAG,QAAQ,MAAM;AAAA,IACrD;AAAA,EACF;AAEF,eACG,QAAQ,MAAM,EACd,YAAY,mBAAmB,EAC/B;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,YAA+B;AACtC,eAAW,SAAS,OAAO,CAAC;AAAA,EAC9B,CAAC;AAEH,QAAM,eAAe,QAClB,QAAQ,eAAe,EACvB,MAAM,aAAa,EACnB,YAAY,8CAA8C,EAC1D;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,eACG,QAAQ,KAAK,EACb,YAAY,0BAA0B,EACtC,OAAO,kBAAkB,0BAA0B,YAAY,EAC/D,OAAO,kBAAkB,0BAA0B,YAAY,EAC/D;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,YAA2D;AAClE,eAAW,iBAAiB,OAAO,CAAC;AAAA,EACtC,CAAC;AACL;;;AC1QA,SAAS,yBAAyB,OAAe,OAAqB;AACpE,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAM,IAAI,aAAa,GAAG,KAAK,kCAAkC;AAAA,EACnE;AACF;AAEA,SAAS,WAAW,OAAyB;AAC3C,SAAO,MACJ,QAAQ,qBAAqB,OAAO,EACpC,QAAQ,YAAY,GAAG,EACvB,KAAK,EACL,MAAM,KAAK,EACX,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC;AACrC;AAEA,SAAS,WAAW,MAAsB;AACxC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,CAAC,EAAG,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY;AAC5D;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,MACJ,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,UAAU,GAAG;AAC1B;AAEA,SAAS,iBAAiB,SAAyB;AACjD,MAAI;AACF,WAAO,IAAI,OAAO,SAAS,GAAG;AAAA,EAChC,QAAQ;AACN,UAAM,IAAI,aAAa,0BAA0B,OAAO,EAAE;AAAA,EAC5D;AACF;AAEA,SAAS,uBAAuB,OAAe,OAAyB;AACtE,QAAM,iBAAiB,MAAM,QAAQ,GAAG;AAExC,MAAI,mBAAmB,IAAI;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM,MAAM,GAAG,cAAc;AACpD,QAAM,eAAe,MAAM,MAAM,iBAAiB,CAAC;AAEnD,MAAI,eAAe,WAAW,KAAK,aAAa,WAAW,GAAG;AAC5D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAoB,CAAC;AAC3B,MAAI,SAAS;AAEb,SAAO,SAAS,MAAM,QAAQ;AAC5B,UAAM,aAAa,MAAM,QAAQ,gBAAgB,MAAM;AAEvD,QAAI,eAAe,IAAI;AACrB;AAAA,IACF;AAEA,UAAM,eAAe,aAAa,eAAe;AACjD,UAAM,WAAW,MAAM,QAAQ,cAAc,YAAY;AAEzD,QAAI,aAAa,IAAI;AACnB;AAAA,IACF;AAEA,YAAQ,KAAK,MAAM,MAAM,cAAc,QAAQ,CAAC;AAChD,aAAS,WAAW,aAAa;AAAA,EACnC;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,OAAuB;AACjD,SAAO,cAAc,KAAK,EACvB,YAAY,EACZ,KAAK,EACL,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,QAAQ,UAAU,GAAG;AAC1B;AAEO,SAAS,kBACd,OACA,OACQ;AACR,QAAM,QAAQ,WAAW,KAAK;AAE9B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,MAAM,CAAC,IAAK,MAAM,MAAM,CAAC,EAAE,IAAI,UAAU,EAAE,KAAK,EAAE;AAAA,IAC3D,KAAK;AACH,aAAO,MAAM,KAAK,GAAG;AAAA,IACvB,KAAK;AACH,aAAO,MAAM,KAAK,GAAG;AAAA,IACvB,KAAK;AACH,aAAO,MAAM,IAAI,UAAU,EAAE,KAAK,EAAE;AAAA,IACtC,KAAK;AACH,aAAO,MAAM,KAAK,GAAG,EAAE,YAAY;AAAA,IACrC,KAAK;AACH,aAAO,MAAM,IAAI,UAAU,EAAE,KAAK,GAAG;AAAA,EACzC;AACF;AAEO,SAAS,SAAS,OAAuB;AAC9C,SAAO,MAAM,KAAK;AACpB;AAEO,SAAS,aACd,OACA,SACQ;AACR,2BAAyB,QAAQ,KAAK,gBAAgB;AAEtD,MAAI,MAAM,UAAU,QAAQ,KAAK;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,UAAU;AAEjC,MAAI,OAAO,UAAU,QAAQ,KAAK;AAChC,WAAO,OAAO,MAAM,GAAG,QAAQ,GAAG;AAAA,EACpC;AAEA,SAAO,MAAM,MAAM,GAAG,QAAQ,MAAM,OAAO,MAAM,IAAI;AACvD;AAEO,SAAS,YACd,OACA,SACQ;AACR,MAAI,QAAQ,OAAO;AACjB,WAAO,MAAM,QAAQ,iBAAiB,QAAQ,IAAI,GAAG,QAAQ,IAAI;AAAA,EACnE;AAEA,SAAO,MAAM,WAAW,QAAQ,MAAM,QAAQ,IAAI;AACpD;AAEO,SAAS,cAAc,OAAuB;AACnD,SAAO,MAAM,UAAU,KAAK;AAC9B;AAEO,SAAS,cAAc,OAAuB;AACnD,SAAO,MAAM,UAAU,KAAK,EAAE,QAAQ,UAAU,EAAE;AACpD;AAEO,SAAS,QAAQ,OAAe,SAAiC;AACtE,2BAAyB,QAAQ,QAAQ,eAAe;AAExD,QAAM,OAAsB,QAAQ,QAAQ;AAE5C,MAAI,MAAM,UAAU,QAAQ,QAAQ;AAClC,WAAO;AAAA,EACT;AAEA,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,MAAM,SAAS,QAAQ,MAAM;AAAA,IACtC,KAAK;AACH,aAAO,MAAM,OAAO,QAAQ,MAAM;AAAA,IACpC,KAAK,QAAQ;AACX,YAAM,eAAe,QAAQ,SAAS,MAAM;AAC5C,YAAM,cAAc,KAAK,MAAM,eAAe,CAAC;AAC/C,YAAM,eAAe,eAAe;AACpC,aAAO,GAAG,IAAI,OAAO,WAAW,CAAC,GAAG,KAAK,GAAG,IAAI,OAAO,YAAY,CAAC;AAAA,IACtE;AAAA,EACF;AACF;AAEO,SAAS,YACd,OACA,OACA,UAA8B,CAAC,GACrB;AACV,MAAI,QAAQ,OAAO;AACjB,UAAM,UAAU,MAAM,KAAK,MAAM,SAAS,iBAAiB,KAAK,CAAC,CAAC;AAElE,WAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,YAAM,SAAS,MACZ,MAAM,CAAC,EACP,OAAO,CAAC,UAA2B,UAAU,MAAS;AACzD,aAAO,OAAO,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,SAAO,uBAAuB,OAAO,KAAK;AAC5C;AAEO,SAAS,gBACd,OACA,OAAwB,UAChB;AACR,MAAI,SAAS,UAAU;AACrB,WAAO,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,OAAO;AAAA,EACtD;AAEA,SAAO,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,QAAQ;AACtD;AAEO,SAAS,qBACd,OACA,OAAwB,UAChB;AACR,MAAI,SAAS,UAAU;AACrB,WAAO,mBAAmB,KAAK;AAAA,EACjC;AAEA,SAAO,mBAAmB,KAAK;AACjC;AAEO,SAAS,sBACd,OACA,OAAwB,UAChB;AACR,MAAI,SAAS,UAAU;AACrB,WAAO,mBAAmB,KAAK;AAAA,EACjC;AAEA,SAAO,mBAAmB,KAAK;AAEjC;AAEO,SAAS,uBAAuB,GAAW,GAAmB;AACnE,MAAI,EAAE,KAAK;AACX,MAAI,EAAE,KAAK;AAEX,QAAM,IAAI,EAAE;AACZ,QAAM,IAAI,EAAE;AAEZ,QAAM,KAAiB,MAAM;AAAA,IAAK,EAAE,QAAQ,IAAI,EAAE;AAAA,IAAG,MACnD,IAAI,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC;AAAA,EACzB;AAEA,WAAS,IAAI,GAAG,KAAK,GAAG,IAAK,IAAG,CAAC,EAAG,CAAC,IAAI;AACzC,WAAS,IAAI,GAAG,KAAK,GAAG,IAAK,IAAG,CAAC,EAAG,CAAC,IAAI;AAEzC,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI;AAEzC,SAAG,CAAC,EAAG,CAAC,IAAI,KAAK;AAAA,QACf,GAAG,IAAI,CAAC,EAAG,CAAC,IAAK;AAAA,QACjB,GAAG,CAAC,EAAG,IAAI,CAAC,IAAK;AAAA,QACjB,GAAG,IAAI,CAAC,EAAG,IAAI,CAAC,IAAK;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,CAAC,EAAG,CAAC;AACjB;;;AC1OO,SAAS,yBAAyB,SAAwB;AAC/D,QAAM,MAAM,QACT,QAAQ,KAAK,EACb,YAAY,8CAA8C,EAC1D;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,sCAAsC,EAClD,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,CAAC,YAA8C;AACrD,eAAW,YAAY,eAAe,OAAO,CAAC,CAAC;AAAA,EACjD,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAAmE;AAClE,iBAAW,kBAAkB,eAAe,OAAO,GAAG,QAAQ,EAAE,CAAC;AAAA,IACnE;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,yCAAyC,EACrD,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,CAAC,YAA8C;AACrD,eAAW,SAAS,eAAe,OAAO,CAAC,CAAC;AAAA,EAC9C,CAAC;AAEH,MACG,QAAQ,UAAU,EAClB,YAAY,+BAA+B,EAC3C,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD,eAAe,kBAAkB,mBAAmB,oBAAoB,EACxE,OAAO,oBAAoB,oCAAoC,EAC/D;AAAA,IACC,CAAC,YAKK;AACJ;AAAA,QACE,aAAa,eAAe,OAAO,GAAG;AAAA,UACpC,KAAK,QAAQ;AAAA,UACb,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,QACnE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,SAAS,EACjB,YAAY,0CAA0C,EACtD,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD,eAAe,kBAAkB,mCAAmC,EACpE,eAAe,kBAAkB,oBAAoB,EACrD,OAAO,WAAW,sCAAsC,EACxD;AAAA,IACC,CAAC,YAMK;AACJ;AAAA,QACE,YAAY,eAAe,OAAO,GAAG;AAAA,UACnC,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ;AAAA,UACd,GAAI,QAAQ,UAAU,SAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,QAChE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,WAAW,EACnB,YAAY,mCAAmC,EAC/C,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,CAAC,YAA8C;AACrD,eAAW,cAAc,eAAe,OAAO,CAAC,CAAC;AAAA,EACnD,CAAC;AAEH,MACG,QAAQ,gBAAgB,EACxB,YAAY,0CAA0C,EACtD,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,CAAC,YAA8C;AACrD,eAAW,cAAc,eAAe,OAAO,CAAC,CAAC;AAAA,EACnD,CAAC;AAEH,MACG,QAAQ,KAAK,EACb,YAAY,4DAA4D,EACxE,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAKK;AACJ;AAAA,QACE,QAAQ,eAAe,OAAO,GAAG;AAAA,UAC/B,QAAQ,QAAQ;AAAA,UAChB,MAAM,QAAQ;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,SAAS,EACjB,SAAS,WAAW,sDAAsD,EAC1E,YAAY,iDAAiD,EAC7D,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,WAAW,yCAAyC,EAC3D;AAAA,IACC,CACE,OACA,YACG;AACH;AAAA,QACE,YAAY,eAAe,OAAO,GAAG,OAAO;AAAA,UAC1C,GAAI,QAAQ,UAAU,SAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,QAChE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,iCAAiC,EAC7C,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAAqE;AACpE,iBAAW,gBAAgB,eAAe,OAAO,GAAG,QAAQ,IAAI,CAAC;AAAA,IACnE;AAAA,EACF;AAEF,MACG,QAAQ,WAAW,EACnB,YAAY,oCAAoC,EAChD,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAAqE;AACpE,iBAAW,qBAAqB,eAAe,OAAO,GAAG,QAAQ,IAAI,CAAC;AAAA,IACxE;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,uCAAuC,EACnD,OAAO,kBAAkB,oBAAoB,EAC7C,OAAO,iBAAiB,8BAA8B,EACtD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,YAAqE;AACpE;AAAA,QACE,sBAAsB,eAAe,OAAO,GAAG,QAAQ,IAAI;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEF,MACC,YAAY,yDAAyD,EACrE,QAAQ,OAAO,EACf,SAAS,KAAK,EACd,SAAS,KAAK,EACd,OAAO,CAAC,GAAW,MAAc;AAChC,eAAW,uBAAuB,GAAG,CAAC,CAAC;AAAA,EACzC,CAAC;AAED,QAAM,cAAc,QACjB,QAAQ,MAAM,EACd,YAAY,kDAAkD,EAC9D;AAAA,IACC;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEF,cACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,kBAAkB,mBAAmB,EAC5C;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,eAAe,+CAA+C,EACrE,OAAO,cAAc,qDAAqD,EAC1E;AAAA,IACC,CAAC,YAMK;AACJ,YAAM,SAAS,qBAAqB,OAAO;AAC3C,YAAM,SAAS;AAAA,QACb,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ,YAAY;AAAA,MACtB;AAEA,UAAI,QAAQ,SAAS;AACnB,YAAI,CAAC,OAAO,YAAY;AACtB,gBAAM,IAAI,MAAM,6BAA6B;AAAA,QAC/C;AAEA,sBAAc,OAAO,YAAY,GAAG,MAAM;AAAA,CAAI;AAAA,MAChD;AAEA,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEF,cACG,QAAQ,QAAQ,EAChB,YAAY,cAAc,EAC1B,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,kBAAkB,mBAAmB,EAC5C,OAAO,cAAc,oDAAoD,EACzE,OAAO,CAAC,YAAkE;AACzE,UAAM,SAAS,qBAAqB,OAAO;AAC3C,UAAM,SAAS,gBAAgB,OAAO,MAAM;AAE5C,QAAI,QAAQ,SAAS;AACnB,UAAI,CAAC,OAAO,YAAY;AACtB,cAAM,IAAI,MAAM,6BAA6B;AAAA,MAC/C;AAEA,oBAAc,OAAO,YAAY,MAAM;AAAA,IACzC;AAEA,eAAW,MAAM;AAAA,EACnB,CAAC;AAEH,cACG,QAAQ,UAAU,EAClB,YAAY,uBAAuB,EACnC,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,kBAAkB,mBAAmB,EAC5C,OAAO,CAAC,YAA+C;AACtD,UAAM,SAAS,qBAAqB,OAAO;AAC3C,eAAW,kBAAkB,OAAO,GAAG,CAAC;AAAA,EAC1C,CAAC;AAEH,cACG,QAAQ,KAAK,EACb,YAAY,wBAAwB,EACpC,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,kBAAkB,mBAAmB,EAC5C,eAAe,kBAAkB,oBAAoB,EACrD,OAAO,CAAC,YAA6D;AACpE,UAAM,SAAS,qBAAqB,OAAO;AAC3C,eAAW,iBAAiB,OAAO,QAAQ,QAAQ,IAAI,CAAC;AAAA,EAC1D,CAAC;AAEH,cACG,QAAQ,KAAK,EACb,YAAY,uBAAuB,EACnC,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,kBAAkB,mBAAmB,EAC5C,eAAe,kBAAkB,sBAAsB,EACvD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,cAAc,mDAAmD,EACxE;AAAA,IACC,CAAC,YAMK;AACJ,YAAM,SAAS,qBAAqB,OAAO;AAC3C,YAAM,UAAU;AAAA,QACd,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,eAAe,QAAQ,QAAQ;AAAA,MACjC;AACA,YAAM,YAAY,gBAAgB,SAAS,GAAG,KAAK;AAEnD,UAAI,QAAQ,SAAS;AACnB,YAAI,CAAC,OAAO,YAAY;AACtB,gBAAM,IAAI,MAAM,6BAA6B;AAAA,QAC/C;AAEA,sBAAc,OAAO,YAAY,GAAG,SAAS;AAAA,CAAI;AAAA,MACnD;AAEA,iBAAW,OAAO;AAAA,IACpB;AAAA,EACF;AAEF,cACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,kBAAkB,mBAAmB,EAC5C,eAAe,kBAAkB,sBAAsB,EACvD,OAAO,cAAc,mDAAmD,EACxE;AAAA,IACC,CAAC,YAKK;AACJ,YAAM,SAAS,qBAAqB,OAAO;AAC3C,YAAM,UAAU,oBAAoB,OAAO,QAAQ,QAAQ,IAAI;AAC/D,YAAM,YAAY,gBAAgB,SAAS,GAAG,KAAK;AAEnD,UAAI,QAAQ,SAAS;AACnB,YAAI,CAAC,OAAO,YAAY;AACtB,gBAAM,IAAI,MAAM,6BAA6B;AAAA,QAC/C;AAEA,sBAAc,OAAO,YAAY,GAAG,SAAS;AAAA,CAAI;AAAA,MACnD;AAEA,iBAAW,OAAO;AAAA,IACpB;AAAA,EACF;AAEF,cACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,YAA6C;AACpD;AAAA,MACE;AAAA,QACE,mBAAmB,QAAQ,IAAI;AAAA,QAC/B,mBAAmB,QAAQ,KAAK;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAC;AAEH,cACG,QAAQ,OAAO,EACf,YAAY,8BAA8B,EAC1C,OAAO,qBAAqB,mCAAmC,EAC/D,OAAO,qBAAqB,sCAAsC,EAClE;AAAA,IACC,CAAC,YAAqE;AACpE,iBAAW,gBAAgB,wBAAwB,OAAO,CAAC,CAAC;AAAA,IAC9D;AAAA,EACF;AAEF,cACG,QAAQ,SAAS,EACjB,YAAY,uBAAuB,EACnC,OAAO,iBAAiB,wBAAwB,EAChD,OAAO,kBAAkB,mBAAmB,EAC5C,OAAO,CAAC,YAA+C;AACtD,UAAM,SAAS,qBAAqB,OAAO;AAC3C,eAAW,kBAAkB,OAAO,MAAM,CAAC;AAAA,EAC7C,CAAC;AACL;;;AvD9dA,IAAM,cAAc;AAEb,SAAS,eAAwB;AACtC,QAAM,UAAU,IAAI,QAAQ;AAE5B,qBAAmB,OAAO;AAE1B,UACG,KAAK,SAAS,EACd,YAAY,yCAAyC,EACrD,QAAQ,WAAW,EACnB,mBAAmB,iCAAiC,EACpD,yBAAyB,IAAI,EAC7B,YAAY,SAAS,WAAW,CAAC;AAEpC,4BAA0B,OAAO;AACjC,2BAAyB,OAAO;AAChC,yBAAuB,OAAO;AAC9B,yBAAuB,OAAO;AAC9B,0BAAwB,OAAO;AAE/B,SAAO;AACT;;;AwD7BA,aAAa,EACV,WAAW,QAAQ,IAAI,EACvB,MAAM,CAAC,UAAmB;AACzB,iBAAe,KAAK;AACtB,CAAC;","names":["path","path","fs","path","fs","path","path","fs","path","fs","path","path","path","path","path","fs","path","pipeline","yauzl","fs","normalizeEntryPath","shouldIncludeEntry","path","openZipFile","yauzl","isDirectory","pipeline","path","path","path","path","fs","fs","crypto","crypto","fs","path","fs","parsed"]}
|