@mochabug/adapt-builder 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/defaults.ts", "../src/plugins.ts", "../src/codegen.ts", "../src/entrypoints.ts", "../src/genproto/mochabugapis/adapt/graph/jtd_schema_pb.ts", "../src/genproto/buf/validate/validate_pb.ts", "../src/genproto/mochabugapis/adapt/plugins/v1/file_pb.ts", "../src/genproto/mochabugapis/adapt/plugins/v1/manifest_pb.ts", "../src/genproto/mochabugapis/adapt/plugins/v1/service_definition_pb.ts", "../src/genproto/mochabugapis/adapt/plugins/v1/compound_services_pb.ts", "../src/genproto/mochabugapis/adapt/plugins/v1/http_proxy_service_pb.ts", "../src/genproto/mochabugapis/adapt/plugins/v1/oauth2_service_pb.ts", "../src/genproto/mochabugapis/adapt/plugins/v1/variable_service_pb.ts", "../src/genproto/mochabugapis/adapt/plugins/v1/vertex_pb.ts"],
4
- "sourcesContent": ["import { create, fromJson, fromJsonString, toJson } from \"@bufbuild/protobuf\";\nimport { ValueSchema } from \"@bufbuild/protobuf/wkt\";\nimport { createValidator } from \"@bufbuild/protovalidate\";\nimport {\n HtmlFileConfiguration,\n htmlPlugin,\n} from \"@craftamap/esbuild-plugin-html\";\nimport Ajv from \"ajv/dist/jtd.js\";\nimport chalk from \"chalk\";\nimport { BuildOptions, build as esbuild } from \"esbuild\";\nimport { sync as glob } from \"glob\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport ora from \"ora\";\nimport {\n CDN_URL_DEFAULT,\n CONFIGURATOR_HTML,\n DEFAULT_ASSETS,\n DEFAULT_BROWSER_OPTIONS,\n DEFAULT_CDN,\n DEFAULT_SERVER_CONFIGURATOR_CJS_OPTIONS,\n DEFAULT_SERVER_CONFIGURATOR_ESM_OPTIONS,\n DEFAULT_SERVER_EXECUTOR_CJS_OPTIONS,\n DEFAULT_SERVER_EXECUTOR_ESM_OPTIONS,\n DEFAULT_SRC,\n DEFAULT_SSG_OPTIONS,\n EXECUTOR_HTML,\n FILE_EXTENSIONS,\n MANIFEST_PATH,\n} from \"./defaults\";\nimport { findBrowserEntrypoints, findConfigEntrypoints } from \"./entrypoints\";\nimport { JTDSchemaSchema } from \"./genproto/mochabugapis/adapt/graph/jtd_schema_pb\";\nimport { FileSchema } from \"./genproto/mochabugapis/adapt/plugins/v1/file_pb\";\nimport {\n Manifest,\n ManifestSchema,\n} from \"./genproto/mochabugapis/adapt/plugins/v1/manifest_pb\";\nimport { ServiceDefinition } from \"./genproto/mochabugapis/adapt/plugins/v1/service_definition_pb\";\nimport {\n Capability,\n Vertex,\n VertexSchema,\n} from \"./genproto/mochabugapis/adapt/plugins/v1/vertex_pb\";\nimport { virtualModulesPlugin, wasmExternalPlugin } from \"./plugins\";\n\ntype DeepPartialExcept<T, Excluded> = T extends Excluded\n ? T\n : T extends Function\n ? T\n : T extends Array<infer U>\n ? Array<DeepPartialExcept<U, Excluded>>\n : T extends object\n ? { [K in keyof T]?: DeepPartialExcept<T[K], Excluded> }\n : T;\n\nexport interface ServerBuildOptions {\n configurator: BuildOptions; // The esbuild options for the configurator build\n executor: BuildOptions; // The esbuild options for the executor build\n}\n\nexport interface BrowserBuildOptions {\n build: BuildOptions; // The esbuild options for the browser build\n assets: string; // The path where to place the assets\n cdn: string; // The path to the CDN folder\n cdnPrefix: string; // The prefix on the plugins CDN folder (both locally and on the CDN)\n moveHtmlToAssets: boolean; // Set this to true if you would like to place generated index.html files into the assets folder\n}\n\nexport interface PluginBuildOptions {\n src: string; // The path to the source folder\n browser: BrowserBuildOptions; // The browser build options\n ssg: BuildOptions; // The esbuild options for the static site generation build\n server: ServerBuildOptions; // The server build options\n dev: boolean; // Set this to true if you would like to build the debug version of the plugin\n cdnBase: string; // The URL to the CDN where the plugin will be hosted\n}\n\ntype OptionalPluginBuildOptions = DeepPartialExcept<\n PluginBuildOptions,\n BuildOptions\n>;\n\nconst ajv = new Ajv();\nconst validator = createValidator();\n\nexport async function build(opts?: OptionalPluginBuildOptions) {\n console.log(chalk.bold.cyan(\"\\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\"));\n console.log(chalk.bold.cyan(\"\u2502 \uD83D\uDE80 Adapt Plugin Build Process \u2502\"));\n console.log(chalk.bold.cyan(\"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\\n\"));\n\n // Read and parse manifest\n const manifestSpinner = ora({\n text: \"Reading manifest...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const manifest = fromJsonString(\n ManifestSchema,\n fs.readFileSync(MANIFEST_PATH, \"utf8\")\n );\n\n manifestSpinner.succeed(\n `Manifest: ${chalk.bold(\n `${manifest.organization}/${manifest.name}`\n )} ${chalk.dim(`v${manifest.version}`)}`\n );\n\n const cdnBase = `${opts?.cdnBase || CDN_URL_DEFAULT}/${\n manifest.organization\n }/${manifest.name}/${manifest.version}/`;\n console.log(chalk.dim(`\u2502 `) + chalk.gray(`CDN: ${cdnBase}\\n`));\n\n const initOpts = initBuildOptions(cdnBase, opts);\n\n // Discover vertices\n const vertexSpinner = ora({\n text: \"Discovering vertices...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const pathLookup: Record<string, string> = {};\n manifest.vertices = glob(path.join(initOpts.src, \"**/vertex.json\")).map(\n (file) => {\n const res = fromJsonString(VertexSchema, fs.readFileSync(file, \"utf8\"));\n pathLookup[res.name] = path.dirname(file);\n return res;\n }\n );\n\n if (manifest.vertices.length === 0) {\n vertexSpinner.fail(\"No vertices found\");\n throw new Error(\"No vertices are defined\");\n }\n\n for (const srv of manifest.serviceDefinitions) {\n await validateLoadServiceDefinition(\".\", srv);\n }\n\n vertexSpinner.succeed(\n `Found ${chalk.bold(manifest.vertices.length)} ${\n manifest.vertices.length === 1 ? \"vertex\" : \"vertices\"\n }: ${manifest.vertices.map((v) => chalk.cyan(v.name)).join(\", \")}`\n );\n console.log(\"\");\n\n const result = validator.validate(ManifestSchema, manifest);\n if (result.kind !== \"valid\") {\n console.error(chalk.bold.red(\"\u274C Manifest validation failed:\\n\"));\n console.error(result.error);\n console.error(result.violations);\n process.exit(1);\n }\n\n await buildBrowser(manifest, pathLookup, initOpts);\n await buildServer(manifest, pathLookup, initOpts);\n\n console.log(chalk.bold.green(\"\\n\u2728 Build completed successfully!\\n\"));\n}\n\n// Service definitions can have files, these needs to be loaded and validated\nexport async function validateLoadServiceDefinition(\n basePath: string,\n srv: ServiceDefinition\n) {\n switch (srv.type.case) {\n case \"variable\": {\n // Validate the JTD schema as well as the default value\n try {\n const schema = toJson(JTDSchemaSchema, srv.type.value.schema!);\n await ajv.validateSchema(schema, true);\n if (srv.type.value.default) {\n let defaultValue = toJson(ValueSchema, srv.type.value.default);\n\n // Check if the default value is a string that looks like a JSON file path\n // Parse and load it to the definition here!\n if (\n typeof defaultValue === \"string\" &&\n defaultValue.endsWith(\".json\")\n ) {\n const filePath = path.join(basePath, defaultValue);\n if (fs.existsSync(filePath)) {\n const fileContent = fs.readFileSync(filePath, \"utf-8\");\n defaultValue = JSON.parse(fileContent);\n srv.type.value.default = fromJson(ValueSchema, defaultValue);\n } else {\n throw new Error(`Default value file not found at ${filePath}`);\n }\n }\n\n if (!ajv.validate(schema, defaultValue)) {\n throw new Error(\n `Default value is incorrect: ${ajv.errorsText(ajv.errors)}`\n );\n }\n }\n } catch (error: any) {\n throw new Error(\n `Validation failed for service definition '${srv.name}': ${error.message}`\n );\n }\n break;\n }\n case \"httpProxy\": {\n try {\n if (srv.type.value.tls?.caBundle) {\n const caBundlePath = path.join(\n basePath,\n srv.type.value.tls.caBundle.name\n );\n if (fs.existsSync(caBundlePath)) {\n srv.type.value.tls.caBundle = create(FileSchema, {\n name: srv.type.value.tls.caBundle.name,\n data: fs.readFileSync(caBundlePath),\n });\n } else {\n throw new Error(`CA Bundle file not found at ${caBundlePath}`);\n }\n }\n } catch (error: any) {\n throw new Error(\n `Validation failed for service definition '${srv.name}': ${error.message}`\n );\n }\n break;\n }\n }\n}\n\nexport async function buildServer(\n manifest: Manifest,\n vpathLookup: Record<string, string>,\n opts: PluginBuildOptions\n) {\n console.log(chalk.bold.magenta(\"\uD83D\uDD27 Server Build\"));\n console.log(chalk.dim(\"\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\"));\n\n // Build Executor Files\n const execSpinner = ora({\n text: \"Preparing executor files...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const execRecords = Object.entries(vpathLookup).map(([key, importPath]) => {\n const res = createImportPath(importPath, \"executor\");\n if (!res)\n throw new Error(\"No executor file found. This is required for a vertex\");\n return [key, res];\n });\n\n if (execRecords.length === 0) {\n execSpinner.fail(\"No executor files found\");\n throw new Error(\"No executor files found. This is required for a vertex\");\n }\n\n opts.server.executor.plugins = [\n ...(opts.server.executor.plugins || []),\n virtualModulesPlugin(\n \"mb-adapt-plugin-virtual:executors\",\n Object.fromEntries(execRecords)\n ),\n wasmExternalPlugin({ outdir: opts.server.executor.outdir! }),\n ];\n opts.server.executor.entryPoints = [\n {\n in: \"mb-adapt-plugin-virtual:executors\",\n out: \"executors\",\n },\n ];\n\n execSpinner.text = `Building ${execRecords.length} executor${\n execRecords.length === 1 ? \"\" : \"s\"\n }...`;\n await esbuild(opts.server.executor);\n execSpinner.succeed(\n `Executors built ${chalk.dim(\n `(${execRecords.length} ${execRecords.length === 1 ? \"file\" : \"files\"})`\n )}`\n );\n\n // Build Configurator Files\n const configSpinner = ora({\n text: \"Preparing configurator files...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const configRecords = manifest.vertices\n .filter((v) =>\n Boolean(v.capabilities.find((c) => c === Capability.CONFIGURATOR))\n )\n .map((v) => {\n const currentPath = vpathLookup[v.name];\n if (!currentPath) {\n throw new Error(`No path found for vertex ${v.name}`);\n }\n const res = createImportPath(currentPath, \"configurator\");\n if (!res)\n throw new Error(\n \"No configurator file found. This is required for a vertex\"\n );\n return [v.name, res];\n });\n\n opts.server.configurator.plugins = [\n ...(opts.server.configurator.plugins || []),\n virtualModulesPlugin(\n \"mb-adapt-plugin-virtual:configurators\",\n Object.fromEntries(configRecords)\n ),\n wasmExternalPlugin({ outdir: opts.server.configurator.outdir! }),\n ];\n\n if (configRecords.length > 0) {\n opts.server.configurator.entryPoints = [\n {\n in: \"mb-adapt-plugin-virtual:configurators\",\n out: \"configurators\",\n },\n ];\n configSpinner.text = `Building ${configRecords.length} configurator${\n configRecords.length === 1 ? \"\" : \"s\"\n }...`;\n await esbuild(opts.server.configurator);\n configSpinner.succeed(\n `Configurators built ${chalk.dim(\n `(${configRecords.length} ${\n configRecords.length === 1 ? \"file\" : \"files\"\n })`\n )}`\n );\n } else {\n configSpinner.info(\"No configurator files to build\");\n }\n\n console.log(\"\");\n}\n\nasync function buildBrowser(\n manifest: Manifest,\n vpathLookup: Record<string, string>,\n opts: PluginBuildOptions\n) {\n console.log(chalk.bold.blue(\"\uD83C\uDF10 Browser Build\"));\n console.log(chalk.dim(\"\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\"));\n\n const discoverySpinner = ora({\n text: \"Discovering UI components...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const hasUI = (v: Vertex) =>\n fs.existsSync(path.join(vpathLookup[v.name]!, \"ui\"));\n const configVertices = manifest.vertices.filter(\n (v) =>\n Boolean(v.capabilities.find((c) => c === Capability.CONFIGURATOR)) &&\n hasUI(v)\n );\n const browserVertices = manifest.vertices.filter(\n (v) =>\n Boolean(v.capabilities.find((c) => c === Capability.BROWSER)) && hasUI(v)\n );\n\n const totalUI = configVertices.length + browserVertices.length;\n discoverySpinner.succeed(\n `Found ${chalk.bold(totalUI)} UI component${\n totalUI === 1 ? \"\" : \"s\"\n } ${chalk.dim(\n `(${browserVertices.length} browser, ${configVertices.length} configurator)`\n )}`\n );\n\n const configs = Object.fromEntries(\n configVertices.map((v) => [v.name, vpathLookup[v.name]!])\n );\n const browsers = Object.fromEntries(\n browserVertices.map((v) => [v.name, vpathLookup[v.name]!])\n );\n\n const configEntrypoints = findConfigEntrypoints(configs);\n const browserEntrypoints = findBrowserEntrypoints(browsers);\n\n const entrypointMap: Record<string, { vertex: string; config: boolean }> = {};\n opts.ssg.entryPoints = [...configEntrypoints, ...browserEntrypoints]\n .filter((ep) => ep.ssg !== undefined)\n .map((ep) => {\n entrypointMap[ep.ssg!] = {\n vertex: ep.name,\n config: configEntrypoints.includes(ep),\n };\n return ep.ssg!;\n });\n\n // SSG Build\n const execDefines: Record<string, string> = {};\n const configDefines: Record<string, string> = {};\n\n if (opts.ssg.entryPoints.length > 0) {\n const ssgSpinner = ora({\n text: `Running SSG for ${opts.ssg.entryPoints.length} component${\n opts.ssg.entryPoints.length === 1 ? \"\" : \"s\"\n }...`,\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const ssgResult = await esbuild(opts.ssg);\n for (const [outputPath, outputMeta] of Object.entries(\n ssgResult.metafile!.outputs\n )) {\n if (!outputMeta.entryPoint) continue;\n\n const entryKey = outputMeta.entryPoint;\n const mapInfo = entrypointMap[entryKey];\n if (!mapInfo) continue;\n\n const { default: render } = await import(\n `file://${path.resolve(outputPath)}`\n );\n if (mapInfo.config) {\n configDefines[mapInfo.vertex] = render.default();\n } else {\n execDefines[mapInfo.vertex] = render.default();\n }\n }\n ssgSpinner.succeed(\n `SSG completed ${chalk.dim(\n `(${opts.ssg.entryPoints.length} ${\n opts.ssg.entryPoints.length === 1 ? \"file\" : \"files\"\n })`\n )}`\n );\n } else {\n ora({\n text: \"No SSG entry points\",\n prefixText: chalk.dim(\"\u2502\"),\n }).info();\n }\n\n // Build Browser JavaScript & HTML\n const bundleSpinner = ora({\n text: \"Building browser bundle...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n opts.browser.build.entryPoints = [\n ...configEntrypoints.map((c) => c.browser),\n ...browserEntrypoints.map((b) => b.browser),\n ];\n\n const htmlFiles: HtmlFileConfiguration[] = [\n ...browserEntrypoints.map<HtmlFileConfiguration>((b) => ({\n entryPoints: [b.browser],\n filename: path.join(b.name, EXECUTOR_HTML),\n htmlTemplate: fs.readFileSync(b.html, \"utf8\"),\n scriptLoading: \"module\",\n define: {\n ...(execDefines[b.name] ? { content: execDefines[b.name]! } : {}),\n baseCdn: opts.browser.build.publicPath || \"\",\n },\n })),\n ...configEntrypoints.map<HtmlFileConfiguration>((c) => ({\n entryPoints: [c.browser],\n filename: path.join(c.name, CONFIGURATOR_HTML),\n htmlTemplate: fs.readFileSync(c.html, \"utf8\"),\n scriptLoading: \"module\",\n define: {\n ...(configDefines[c.name] ? { content: configDefines[c.name]! } : {}),\n baseCdn: opts.browser.build.publicPath || \"\",\n },\n })),\n ];\n\n opts.browser.build.plugins = [\n ...(opts.browser.build.plugins || []),\n htmlPlugin({ files: htmlFiles }),\n ];\n\n await esbuild(opts.browser.build);\n bundleSpinner.succeed(\n `Browser bundle built ${chalk.dim(\n `(${opts.browser.build.entryPoints.length} entrypoint${\n opts.browser.build.entryPoints.length === 1 ? \"\" : \"s\"\n })`\n )}`\n );\n\n if (opts.browser.moveHtmlToAssets) {\n const moveSpinner = ora({\n text: \"Moving HTML files to assets...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n for (const file of htmlFiles) {\n const srcFile = path.join(opts.browser.build.outdir!, file.filename);\n const destFile = path.join(opts.browser.assets, file.filename);\n fs.mkdirSync(path.dirname(destFile), { recursive: true });\n fs.copyFileSync(srcFile, destFile);\n fs.rmSync(srcFile);\n }\n moveSpinner.succeed(\n `HTML files moved ${chalk.dim(\n `(${htmlFiles.length} ${htmlFiles.length === 1 ? \"file\" : \"files\"})`\n )}`\n );\n }\n\n console.log(\"\");\n}\n\nfunction removeDirIfExists(dir: string) {\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true });\n }\n}\n\nfunction createImportPath(src: string, baseName: string): string | undefined {\n for (const ext of FILE_EXTENSIONS) {\n const filePath = \"./\" + path.join(src, `${baseName}.${ext}`);\n if (fs.existsSync(filePath)) return filePath;\n }\n return undefined;\n}\n\nfunction initBuildOptions(\n cdnBase: string,\n opts?: OptionalPluginBuildOptions\n): PluginBuildOptions {\n const isDevBuild = opts?.dev || false;\n function finalizeBuildOptions(\n options: BuildOptions,\n isServer = false\n ): BuildOptions {\n removeDirIfExists(options.outdir!);\n if (isDevBuild) {\n options.minify = false;\n if (!isServer) {\n options.sourcemap = true;\n }\n }\n return options;\n }\n\n function mergeServerBuildOptions(\n defaultOpts: BuildOptions,\n customOpts?: BuildOptions\n ): BuildOptions {\n const result: BuildOptions = { ...defaultOpts, ...customOpts };\n if (customOpts?.alias) {\n result.alias = { ...customOpts.alias, ...defaultOpts.alias };\n }\n if (customOpts?.inject) {\n result.inject = [...customOpts.inject, ...(defaultOpts.inject || [])];\n }\n if (customOpts?.external) {\n result.external = [\n ...customOpts.external,\n ...(defaultOpts.external || []),\n ];\n }\n if (customOpts?.plugins) {\n result.plugins = [...customOpts.plugins, ...(defaultOpts.plugins || [])];\n }\n result.outExtension = {\n ...(result.outExtension || {}),\n \".js\": result.format === \"cjs\" ? \".cjs\" : \".js\",\n };\n return finalizeBuildOptions(result, true);\n }\n\n function setupBrowserOptions(\n browserOptions: BrowserBuildOptions,\n cdnBase: string\n ): BrowserBuildOptions {\n browserOptions.build.outdir = path.join(\n browserOptions.cdn,\n browserOptions.cdnPrefix\n );\n browserOptions.build.publicPath = new URL(\n browserOptions.cdnPrefix,\n cdnBase\n ).href;\n finalizeBuildOptions(browserOptions.build, false);\n return browserOptions;\n }\n\n // --- Browser options ---\n const browserOptions = setupBrowserOptions(\n {\n build: {\n ...DEFAULT_BROWSER_OPTIONS,\n ...opts?.browser?.build,\n // Merge define properties if they exist\n define: {\n ...DEFAULT_BROWSER_OPTIONS.define,\n ...opts?.browser?.build?.define,\n },\n },\n assets: path.join(opts?.browser?.assets || DEFAULT_ASSETS, \"browser\"),\n cdn: opts?.browser?.cdn || DEFAULT_CDN,\n cdnPrefix: opts?.browser?.cdnPrefix || \"browser\",\n moveHtmlToAssets: opts?.browser?.moveHtmlToAssets || true,\n },\n cdnBase\n );\n\n // --- SSG options ---\n const ssgOptions = finalizeBuildOptions(\n {\n ...DEFAULT_SSG_OPTIONS,\n ...opts?.ssg,\n publicPath: browserOptions.build.publicPath,\n },\n false\n );\n\n // --- Server options ---\n const configOptions = mergeServerBuildOptions(\n opts?.server?.configurator?.format === \"esm\"\n ? DEFAULT_SERVER_CONFIGURATOR_ESM_OPTIONS\n : DEFAULT_SERVER_CONFIGURATOR_CJS_OPTIONS,\n opts?.server?.configurator\n );\n const execOptions = mergeServerBuildOptions(\n opts?.server?.executor?.format === \"esm\"\n ? DEFAULT_SERVER_EXECUTOR_ESM_OPTIONS\n : DEFAULT_SERVER_EXECUTOR_CJS_OPTIONS,\n opts?.server?.executor\n );\n\n return {\n src: opts?.src || DEFAULT_SRC,\n browser: browserOptions,\n ssg: ssgOptions,\n server: {\n configurator: configOptions,\n executor: execOptions,\n },\n dev: isDevBuild,\n cdnBase: cdnBase,\n };\n}\n\nexport { CDN_URL_DEFAULT };\n", "import { BuildOptions } from \"esbuild\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { defineEnv } from \"unenv\";\nimport { fileURLToPath } from \"url\";\nimport { unenvAliasPlugin } from \"./plugins\";\nimport { getCloudflarePreset } from \"@cloudflare/unenv-preset\";\n\nexport const PACKAGE_JSON = JSON.parse(\n fs.readFileSync(\"package.json\", \"utf-8\")\n);\nexport const EXECUTOR_MAIN = \"executor.main\";\nexport const CONFIGURATOR_MAIN = \"configurator.main\";\nexport const EXECUTOR_SSG = \"executor.ssg\";\nexport const CONFIGURATOR_SSG = \"configurator.ssg\";\nexport const CDN_URL_DEFAULT = \"https://cdn.mochabug.com/adapt/plugins\";\nexport const EXECUTOR_HTML = \"executor.html\";\nexport const CONFIGURATOR_HTML = \"configurator.html\";\nexport const DEFAULT_DIST = \"dist\";\nexport const DEFAULT_CDN = \"cdn\";\nexport const DEFAULT_ASSETS = \"assets\";\nexport const DEFAULT_SRC = \"src\";\nexport const MANIFEST_PATH = \"manifest.json\";\nexport const FILE_EXTENSIONS = [\"tsx\", \"ts\", \"js\", \"cjs\"];\n\n// A base configuration for all builds that share common settings\nconst commonOptions: BuildOptions = {\n bundle: true,\n treeShaking: true,\n sourcemap: false,\n loader: {\n \".css\": \"css\",\n \".woff\": \"file\",\n \".woff2\": \"file\",\n \".png\": \"file\",\n \".jpg\": \"file\",\n \".jpeg\": \"file\",\n \".gif\": \"file\",\n \".svg\": \"file\",\n \".ttf\": \"file\",\n \".otf\": \"file\",\n },\n};\n\n// Browser build options\nexport const DEFAULT_BROWSER_OPTIONS: BuildOptions = {\n ...commonOptions,\n outdir: path.join(DEFAULT_CDN, \"browser\"),\n minify: true,\n splitting: true,\n platform: \"browser\",\n format: \"esm\",\n loader: {\n ...commonOptions.loader,\n \".wasm\": \"file\",\n },\n};\n\n// SSG build options\nexport const DEFAULT_SSG_OPTIONS: BuildOptions = {\n ...commonOptions,\n outdir: path.join(DEFAULT_DIST, \"ssg\"),\n minify: false,\n splitting: false,\n metafile: true,\n platform: \"node\",\n format: \"cjs\",\n target: \"esnext\",\n outExtension: {\n \".js\": \".cjs\",\n },\n loader: {\n ...commonOptions.loader,\n \".wasm\": \"file\",\n },\n};\n\nconst { env: serverEnv } = defineEnv({\n nodeCompat: true,\n presets: [\n getCloudflarePreset({\n compatibilityDate: \"2025-08-29\",\n compatibilityFlags: [\"nodejs_compat\"],\n }),\n ],\n});\n\n// Common configuration for server builds (without outdir, set per-build type)\nconst commonServerOptions: BuildOptions = {\n ...commonOptions,\n minify: true,\n splitting: false,\n platform: \"node\",\n target: \"esnext\",\n external: [...serverEnv.external],\n plugins: [unenvAliasPlugin(serverEnv.alias)],\n alias: serverEnv.alias,\n};\n\n// Server ESM build options for executors\nexport const DEFAULT_SERVER_EXECUTOR_ESM_OPTIONS: BuildOptions = {\n ...commonServerOptions,\n outdir: path.join(DEFAULT_DIST, \"executors\"),\n format: \"esm\",\n inject: [\n path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n \"assets\",\n \"inject.mjs\"\n ),\n ],\n mainFields: [\"module\", \"main\"],\n};\n\n// Server CJS build options for executors\nexport const DEFAULT_SERVER_EXECUTOR_CJS_OPTIONS: BuildOptions = {\n ...commonServerOptions,\n outdir: path.join(DEFAULT_DIST, \"executors\"),\n format: \"cjs\",\n inject: [\n path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n \"assets\",\n \"inject.cjs\"\n ),\n ],\n mainFields: [\"main\", \"module\"],\n outExtension: {\n \".js\": \".cjs\",\n },\n};\n\n// Server ESM build options for configurators\nexport const DEFAULT_SERVER_CONFIGURATOR_ESM_OPTIONS: BuildOptions = {\n ...commonServerOptions,\n outdir: path.join(DEFAULT_DIST, \"configurators\"),\n format: \"esm\",\n inject: [\n path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n \"assets\",\n \"inject.mjs\"\n ),\n ],\n mainFields: [\"module\", \"main\"],\n};\n\n// Server CJS build options for configurators\nexport const DEFAULT_SERVER_CONFIGURATOR_CJS_OPTIONS: BuildOptions = {\n ...commonServerOptions,\n outdir: path.join(DEFAULT_DIST, \"configurators\"),\n format: \"cjs\",\n inject: [\n path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n \"assets\",\n \"inject.cjs\"\n ),\n ],\n mainFields: [\"main\", \"module\"],\n outExtension: {\n \".js\": \".cjs\",\n },\n};\n", "import { Plugin } from \"esbuild\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { generateEntrypoint } from \"./codegen\";\n\n/**\n * A plugin that generates a virtual module containing the vertex map.\n */\nexport function virtualModulesPlugin(\n moduleName: string,\n vertexMap: Record<string, string>\n): Plugin {\n const regexp = new RegExp(`^${moduleName}`);\n return {\n name: \"mb-adapt-plugin-virtual-modules\",\n setup(build) {\n build.onResolve({ filter: regexp }, (args) => {\n return { path: args.path, namespace: \"virtual\" };\n });\n\n // Load the module code dynamically.\n build.onLoad({ filter: regexp, namespace: \"virtual\" }, () => {\n const contents = generateEntrypoint(vertexMap);\n return { contents, loader: \"ts\", resolveDir: process.cwd() };\n });\n },\n };\n}\n\nconst require = createRequire(import.meta.url);\nconst pkgRoot = path.dirname(require.resolve(\"./../package.json\"));\nexport function unenvAliasPlugin(alias: Record<string, string>): Plugin {\n const aliasEntries = Object.entries(alias).filter(\n ([, value]) =>\n value.startsWith(\"unenv\") || value.startsWith(\"@cloudflare/unenv-preset\")\n );\n\n return {\n name: \"unenv-alias\",\n setup(build) {\n for (const [aliasKey, aliasValue] of aliasEntries) {\n build.onResolve({ filter: new RegExp(`^${aliasKey}$`) }, () => {\n const resolved = require.resolve(aliasValue, { paths: [pkgRoot] });\n return { path: resolved };\n });\n }\n },\n };\n}\n\ninterface WasmPluginOptions {\n outdir: string;\n}\n\nexport function wasmExternalPlugin(options: WasmPluginOptions): Plugin {\n return {\n name: \"wasm-external\",\n setup(build) {\n const wasmFiles = new Map<string, string>();\n const require = createRequire(import.meta.url);\n\n build.onResolve({ filter: /\\.wasm$|\\/wasm$/ }, (args) => {\n try {\n let resolvedPath: string;\n\n if (args.path.startsWith(\".\")) {\n resolvedPath = path.resolve(args.resolveDir, args.path);\n } else {\n resolvedPath = require.resolve(args.path, {\n paths: [args.resolveDir],\n });\n }\n\n // Check if resolved path actually ends with .wasm\n if (!resolvedPath.endsWith(\".wasm\")) {\n return null;\n }\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`WASM file not found: ${resolvedPath}`);\n }\n\n const wasmFileName = path.basename(resolvedPath);\n wasmFiles.set(wasmFileName, resolvedPath);\n\n console.log(`Found WASM: ${args.path} -> ${wasmFileName}`);\n\n return {\n path: `./${wasmFileName}`,\n external: true,\n };\n } catch (error) {\n console.error(`Failed to resolve WASM: ${args.path}`, error);\n throw error;\n }\n });\n\n build.onEnd(() => {\n wasmFiles.forEach((sourcePath, fileName) => {\n const destPath = path.join(options.outdir, fileName);\n const fileData = fs.readFileSync(sourcePath);\n\n // Validate WASM magic bytes\n if (fileData.length < 4) {\n throw new Error(\n `${fileName} is too small to be a valid WASM file (${fileData.length} bytes)`\n );\n }\n\n const wasmMagic = Buffer.from([0x00, 0x61, 0x73, 0x6d]);\n if (!fileData.subarray(0, 4).equals(wasmMagic)) {\n const actualMagic = fileData.subarray(0, 4).toString(\"hex\");\n throw new Error(\n `${fileName} is not a valid WASM file (magic: 0x${actualMagic})`\n );\n }\n\n fs.writeFileSync(destPath, fileData);\n console.log(\n `Copied WASM: ${fileName} (${(fileData.length / 1024).toFixed(\n 2\n )} KB)`\n );\n });\n });\n },\n };\n}\n", "/**\n * Generates a virtual entrypoint module as a string.\n *\n * @param vertices A mapping where each key is the desired property name for the vertex in the selectVertex call,\n * and the value is the module path to import the executor.\n * Example: { \"sign\": \"./sign/executor\", \"auth\": \"./auth/executor\" }\n * @returns The generated module code.\n */\nexport function generateEntrypoint(vertices: Record<string, string>): string {\n const entries = Object.entries(vertices).map(([key, importPath], index) => ({\n originalKey: key,\n safeVarName: `_v${index}`, // A guaranteed valid identifier\n importPath,\n }));\n\n // Generate the import statements using the safe variable names.\n const importStatements = entries\n .map(\n ({ safeVarName, importPath }) =>\n `import ${safeVarName} from '${importPath}';`\n )\n .join(\"\\n\");\n\n // Build the object literal mapping the original vertex keys to the safe variable names.\n // We quote the keys to ensure validity even if they contain special characters.\n const verticesObject = entries\n .map(({ originalKey, safeVarName }) => `\"${originalKey}\": ${safeVarName}`)\n .join(\", \");\n\n // Embed the selectVertex function definition.\n // This function is included in the generated code so that it is always available.\n const selectVertexFunctionCode = `\n function selectVertex(req, env, ctx, vertices) {\n // The target should be of the format \"<vertex>:<internal|external>\"\n const vtarget = req.headers.get('X-Mochabug-Adapt-Plugin-Vertex-Target');\n if (!vtarget) {\n console.error('No vertex target when selecting vertex');\n console.error(req.headers);\n throw new Error('No vertex target');\n }\n const split = vtarget.split(':');\n if (split.length !== 2) {\n console.error('Invalid vertex target when selecting vertex');\n console.error(req.headers);\n throw new Error('Invalid vertex target');\n }\n const vertex = split[0];\n const visibility = split[1]; // Expected to be 'internal' or 'external'\n if (!vertices[vertex] || !vertices[vertex][visibility]) {\n console.error('Invalid vertex target when selecting vertex');\n console.error(req.headers);\n throw new Error('Invalid vertex target');\n }\n return vertices[vertex][visibility].entrypoint(req, env, ctx);\n }\n `;\n\n // Construct the final module code.\n return ` \n ${importStatements}\n\n ${selectVertexFunctionCode.trim()}\n \n export default {\n async fetch(req, env, ctx): Promise<Response> {\n return await selectVertex(req, env, ctx, { ${verticesObject} });\n },\n };\n `;\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n CONFIGURATOR_HTML,\n CONFIGURATOR_MAIN,\n CONFIGURATOR_SSG,\n EXECUTOR_HTML,\n EXECUTOR_MAIN,\n EXECUTOR_SSG,\n FILE_EXTENSIONS,\n} from \"./defaults\";\n\nexport function findConfigEntrypoints(paths: Record<string, string>): {\n name: string;\n browser: string;\n html: string;\n ssg?: string;\n}[] {\n const result: {\n name: string;\n browser: string;\n html: string;\n ssg?: string;\n }[] = [];\n for (const [name, p] of Object.entries(paths)) {\n let browser;\n for (const ext of FILE_EXTENSIONS) {\n const filePath = path.join(p, \"ui\", `${CONFIGURATOR_MAIN}.${ext}`);\n if (fs.existsSync(filePath)) {\n browser = filePath;\n break;\n }\n }\n if (browser === undefined) {\n continue;\n }\n const html = path.join(p, \"ui\", CONFIGURATOR_HTML);\n if (!fs.existsSync(html)) {\n throw new Error(\n `The ${browser} cannot exist without the corresponding ${CONFIGURATOR_HTML}`\n );\n }\n // Check whether or not we have a corresponding ssg file as well\n let ssg = undefined;\n for (const ext of FILE_EXTENSIONS) {\n const filePath = path.join(p, \"ui\", `${CONFIGURATOR_SSG}.${ext}`);\n if (fs.existsSync(filePath)) {\n ssg = filePath;\n break;\n }\n }\n if (ssg === undefined) {\n result.push({\n name,\n browser,\n html,\n });\n continue;\n }\n result.push({\n name,\n browser,\n html,\n ssg,\n });\n }\n\n return result;\n}\n\nexport function findBrowserEntrypoints(paths: Record<string, string>): {\n name: string;\n browser: string;\n html: string;\n ssg?: string;\n}[] {\n const result: {\n name: string;\n browser: string;\n html: string;\n ssg?: string;\n }[] = [];\n for (const [name, p] of Object.entries(paths)) {\n let browser;\n for (const ext of FILE_EXTENSIONS) {\n const filePath = path.join(p, \"ui\", `${EXECUTOR_MAIN}.${ext}`);\n if (fs.existsSync(filePath)) {\n browser = filePath;\n break;\n }\n }\n if (browser === undefined) {\n continue;\n }\n const html = path.join(p, \"ui\", EXECUTOR_HTML);\n if (!fs.existsSync(html)) {\n throw new Error(\n `The ${browser} cannot exist without the corresponding ${EXECUTOR_HTML}`\n );\n }\n // Check whether or not we have a corresponding ssg file as well\n let ssg = undefined;\n for (const ext of FILE_EXTENSIONS) {\n const filePath = path.join(p, \"ui\", `${EXECUTOR_SSG}.${ext}`);\n if (fs.existsSync(filePath)) {\n ssg = filePath;\n break;\n }\n }\n if (ssg === undefined) {\n result.push({\n name,\n browser,\n html,\n });\n continue;\n }\n result.push({\n name,\n browser,\n html,\n ssg,\n });\n }\n\n return result;\n}\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/graph/jtd_schema.proto (package mochabugapis.adapt.graph, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../buf/validate/validate_pb\";\nimport type { StructJson } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_struct } from \"@bufbuild/protobuf/wkt\";\nimport type { JsonObject, Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/graph/jtd_schema.proto.\n */\nexport const file_mochabugapis_adapt_graph_jtd_schema: GenFile = /*@__PURE__*/\n fileDesc(\"Ciltb2NoYWJ1Z2FwaXMvYWRhcHQvZ3JhcGgvanRkX3NjaGVtYS5wcm90bxIYbW9jaGFidWdhcGlzLmFkYXB0LmdyYXBoIsEcCglKVERTY2hlbWESegoLZGVmaW5pdGlvbnMYASADKAsyNC5tb2NoYWJ1Z2FwaXMuYWRhcHQuZ3JhcGguSlREU2NoZW1hLkRlZmluaXRpb25zRW50cnlCL7pILJoBKQgAEOgHIiJyIBABGGQyGl5bXyRhLXpBLVpdW18kYS16QS1aMC05XSokEi4KCG1ldGFkYXRhGAIgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgAiAEBEhUKCG51bGxhYmxlGAMgASgISAGIAQESNwoDcmVmGAQgASgJQiW6SCJyIBABGGQyGl5bXyRhLXpBLVpdW18kYS16QS1aMC05XSokSAKIAQEScQoEdHlwZRgFIAEoCUJeukhbcllSB2Jvb2xlYW5SB2Zsb2F0MzJSB2Zsb2F0NjRSBGludDhSBXVpbnQ4UgVpbnQxNlIGdWludDE2UgVpbnQzMlIGdWludDMyUgZzdHJpbmdSCXRpbWVzdGFtcEgDiAEBEiQKBGVudW0YBiADKAlCFrpIE5IBEAgAEOgHGAEiB3IFEAEY6AcSOgoIZWxlbWVudHMYByABKAsyIy5tb2NoYWJ1Z2FwaXMuYWRhcHQuZ3JhcGguSlREU2NoZW1hSASIAQESXAoKcHJvcGVydGllcxgIIAMoCzIzLm1vY2hhYnVnYXBpcy5hZGFwdC5ncmFwaC5KVERTY2hlbWEuUHJvcGVydGllc0VudHJ5QhO6SBCaAQ0IABDoByIGcgQQARhkEm0KE29wdGlvbmFsX3Byb3BlcnRpZXMYCSADKAsyOy5tb2NoYWJ1Z2FwaXMuYWRhcHQuZ3JhcGguSlREU2NoZW1hLk9wdGlvbmFsUHJvcGVydGllc0VudHJ5QhO6SBCaAQ0IABDoByIGcgQQARhkEiIKFWFkZGl0aW9uYWxfcHJvcGVydGllcxgKIAEoCEgFiAEBEjgKBnZhbHVlcxgLIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5ncmFwaC5KVERTY2hlbWFIBogBARIlCg1kaXNjcmltaW5hdG9yGAwgASgJQgm6SAZyBBABGGRIB4gBARJWCgdtYXBwaW5nGA0gAygLMjAubW9jaGFidWdhcGlzLmFkYXB0LmdyYXBoLkpURFNjaGVtYS5NYXBwaW5nRW50cnlCE7pIEJoBDQgAEOgHIgZyBBABGGQaVwoQRGVmaW5pdGlvbnNFbnRyeRILCgNrZXkYASABKAkSMgoFdmFsdWUYAiABKAsyIy5tb2NoYWJ1Z2FwaXMuYWRhcHQuZ3JhcGguSlREU2NoZW1hOgI4ARpWCg9Qcm9wZXJ0aWVzRW50cnkSCwoDa2V5GAEgASgJEjIKBXZhbHVlGAIgASgLMiMubW9jaGFidWdhcGlzLmFkYXB0LmdyYXBoLkpURFNjaGVtYToCOAEaXgoXT3B0aW9uYWxQcm9wZXJ0aWVzRW50cnkSCwoDa2V5GAEgASgJEjIKBXZhbHVlGAIgASgLMiMubW9jaGFidWdhcGlzLmFkYXB0LmdyYXBoLkpURFNjaGVtYToCOAEaUwoMTWFwcGluZ0VudHJ5EgsKA2tleRgBIAEoCRIyCgV2YWx1ZRgCIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5ncmFwaC5KVERTY2hlbWE6AjgBOuMRukjfERqTAwocanRkLm11dHVhbGx5X2V4Y2x1c2l2ZV9mb3JtcxKIAVNjaGVtYSBtdXN0IHVzZSBleGFjdGx5IG9uZSBmb3JtIChlbXB0eSwgcmVmLCB0eXBlLCBlbnVtLCBlbGVtZW50cywgcHJvcGVydGllcywgdmFsdWVzLCBvciBkaXNjcmltaW5hdG9yKS4gTXVsdGlwbGUgZm9ybSBrZXl3b3JkcyBmb3VuZC4a5wFbaGFzKHRoaXMucmVmKSwgaGFzKHRoaXMudHlwZSksIHNpemUodGhpcy5lbnVtKSA+IDAsIGhhcyh0aGlzLmVsZW1lbnRzKSwgc2l6ZSh0aGlzLnByb3BlcnRpZXMpID4gMCB8fCBzaXplKHRoaXMub3B0aW9uYWxfcHJvcGVydGllcykgPiAwLCBoYXModGhpcy52YWx1ZXMpLCBoYXModGhpcy5kaXNjcmltaW5hdG9yKSAmJiBzaXplKHRoaXMubWFwcGluZykgPiAwXS5maWx0ZXIoeCwgeCkuc2l6ZSgpIDw9IDEa+AEKGWp0ZC5wcm9wZXJ0aWVzX25vX292ZXJsYXASWFByb3BlcnRpZXMgYW5kIG9wdGlvbmFsX3Byb3BlcnRpZXMgY2Fubm90IGhhdmUgb3ZlcmxhcHBpbmcga2V5cyAoUkZDIDg5MjcgU2VjdGlvbiAyLjIuNikagAEhKHNpemUodGhpcy5wcm9wZXJ0aWVzKSA+IDAgJiYgc2l6ZSh0aGlzLm9wdGlvbmFsX3Byb3BlcnRpZXMpID4gMCkgfHwgdGhpcy5wcm9wZXJ0aWVzLmFsbChwaywgIShwayBpbiB0aGlzLm9wdGlvbmFsX3Byb3BlcnRpZXMpKRqQAgoxanRkLmFkZGl0aW9uYWxfcHJvcGVydGllc19vbmx5X29uX3Byb3BlcnRpZXNfZm9ybRJ2YWRkaXRpb25hbF9wcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHNldCB3aGVuIHVzaW5nIHRoZSBwcm9wZXJ0aWVzIGZvcm0gKGhhcyBub24tZW1wdHkgcHJvcGVydGllcyBvciBvcHRpb25hbF9wcm9wZXJ0aWVzKRpjIWhhcyh0aGlzLmFkZGl0aW9uYWxfcHJvcGVydGllcykgfHwgc2l6ZSh0aGlzLnByb3BlcnRpZXMpID4gMCB8fCBzaXplKHRoaXMub3B0aW9uYWxfcHJvcGVydGllcykgPiAwGsIBCiJqdGQuZGlzY3JpbWluYXRvcl9yZXF1aXJlc19tYXBwaW5nEmdkaXNjcmltaW5hdG9yIGFuZCBtYXBwaW5nIG11c3QgYXBwZWFyIHRvZ2V0aGVyIHdpdGggYXQgbGVhc3Qgb25lIG1hcHBpbmcgZW50cnkgKFJGQyA4OTI3IFNlY3Rpb24gMi4yLjgpGjNoYXModGhpcy5kaXNjcmltaW5hdG9yKSA9PSAoc2l6ZSh0aGlzLm1hcHBpbmcpID4gMCka/QEKI2p0ZC5tYXBwaW5nX211c3RfYmVfcHJvcGVydGllc19mb3JtEk5BbGwgc2NoZW1hcyBpbiBtYXBwaW5nIG11c3QgYmUgb2YgdGhlIHByb3BlcnRpZXMgZm9ybSAoUkZDIDg5MjcgU2VjdGlvbiAyLjIuOCkahQFzaXplKHRoaXMubWFwcGluZykgPT0gMCB8fCB0aGlzLm1hcHBpbmcuYWxsKG0sIHNpemUodGhpcy5tYXBwaW5nW21dLnByb3BlcnRpZXMpID4gMCB8fCBzaXplKHRoaXMubWFwcGluZ1ttXS5vcHRpb25hbF9wcm9wZXJ0aWVzKSA+IDApGuIBCh5qdGQubWFwcGluZ19jYW5ub3RfYmVfbnVsbGFibGUSU1NjaGVtYXMgaW4gZGlzY3JpbWluYXRvciBtYXBwaW5nIGNhbm5vdCBoYXZlIG51bGxhYmxlPXRydWUgKFJGQyA4OTI3IFNlY3Rpb24gMi4yLjgpGmtzaXplKHRoaXMubWFwcGluZykgPT0gMCB8fCB0aGlzLm1hcHBpbmcuYWxsKG0sICFoYXModGhpcy5tYXBwaW5nW21dLm51bGxhYmxlKSB8fCAhdGhpcy5tYXBwaW5nW21dLm51bGxhYmxlKRrGAgoranRkLmRpc2NyaW1pbmF0b3Jfbm90X2luX21hcHBpbmdfcHJvcGVydGllcxJwRGlzY3JpbWluYXRvciB0YWcgY2Fubm90IGFwcGVhciBpbiBwcm9wZXJ0aWVzIG9yIG9wdGlvbmFsX3Byb3BlcnRpZXMgb2YgbWFwcGluZyBzY2hlbWFzIChSRkMgODkyNyBTZWN0aW9uIDIuMi44KRqkASFoYXModGhpcy5kaXNjcmltaW5hdG9yKSB8fCB0aGlzLm1hcHBpbmcuYWxsKG0sICEodGhpcy5kaXNjcmltaW5hdG9yIGluIHRoaXMubWFwcGluZ1ttXS5wcm9wZXJ0aWVzKSAmJiAhKHRoaXMuZGlzY3JpbWluYXRvciBpbiB0aGlzLm1hcHBpbmdbbV0ub3B0aW9uYWxfcHJvcGVydGllcykpGsUCChJqdGQuZW51bV9ub25fZW1wdHkSSmVudW0gYXJyYXkgbXVzdCBiZSBub24tZW1wdHkgd2hlbiB1c2luZyBlbnVtIGZvcm0gKFJGQyA4OTI3IFNlY3Rpb24gMi4yLjQpGuIBc2l6ZSh0aGlzLmVudW0pID4gMCAmJiAhaGFzKHRoaXMudHlwZSkgJiYgIWhhcyh0aGlzLnJlZikgJiYgIWhhcyh0aGlzLmVsZW1lbnRzKSAmJiAhaGFzKHRoaXMudmFsdWVzKSAmJiAhaGFzKHRoaXMuZGlzY3JpbWluYXRvcikgJiYgc2l6ZSh0aGlzLnByb3BlcnRpZXMpID09IDAgJiYgc2l6ZSh0aGlzLm9wdGlvbmFsX3Byb3BlcnRpZXMpID09IDAgPyBzaXplKHRoaXMuZW51bSkgPiAwIDogdHJ1ZUILCglfbWV0YWRhdGFCCwoJX251bGxhYmxlQgYKBF9yZWZCBwoFX3R5cGVCCwoJX2VsZW1lbnRzQhgKFl9hZGRpdGlvbmFsX3Byb3BlcnRpZXNCCQoHX3ZhbHVlc0IQCg5fZGlzY3JpbWluYXRvcmIGcHJvdG8z\", [file_buf_validate_validate, file_google_protobuf_struct]);\n\n/**\n * Schema represents a JSON Typedef Schema (RFC 8927).\n *\n * ## Eight Mutually Exclusive Forms\n *\n * A JTD schema must take exactly ONE of these forms:\n * 1. **Empty**: No form-specific keywords (accepts anything)\n * 2. **Ref**: Has `ref` keyword\n * 3. **Type**: Has `type` keyword\n * 4. **Enum**: Has `enum` keyword (non-empty array)\n * 5. **Elements**: Has `elements` keyword\n * 6. **Properties**: Has `properties` and/or `optional_properties`\n * 7. **Values**: Has `values` keyword\n * 8. **Discriminator**: Has `discriminator` and `mapping` keywords\n *\n * ## Shared Keywords\n *\n * These can appear on ANY form:\n * - `nullable`: Allows null values in addition to the schema's type\n * - `metadata`: Arbitrary information (ignored during validation)\n *\n * ## Root-Level Keyword\n *\n * - `definitions`: Per RFC 8927 Section 2.1, this should only appear on root schemas.\n * While this cannot be enforced at the protobuf schema level, application code should\n * only populate this field on root schemas, not on nested schemas within definitions,\n * elements, properties, etc.\n *\n * @generated from message mochabugapis.adapt.graph.JTDSchema\n */\nexport type JTDSchema = Message<\"mochabugapis.adapt.graph.JTDSchema\"> & {\n /**\n * The definitions keyword MUST be an object where each value is a schema.\n * This object defines a collection of schema definitions that can be referenced via the ref keyword.\n *\n * RFC 8927 Section 2.1: definitions should only appear on root schemas, not on nested schemas.\n * Application code is responsible for enforcing this constraint.\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> definitions = 1;\n */\n definitions: { [key: string]: JTDSchema };\n\n /**\n * The metadata keyword MUST be an object.\n * This object is ignored during validation and can store custom information about the schema.\n * Examples: descriptions, UI hints, code generation directives.\n *\n * @generated from field: optional google.protobuf.Struct metadata = 2;\n */\n metadata?: JsonObject;\n\n /**\n * The nullable keyword MUST be a boolean.\n * If true, the schema matches the value null as well as any value matched by the rest of the schema.\n *\n * RFC 8927: nullable can appear on any schema form.\n * Exception: Cannot be true on schemas within discriminator mappings (validated via CEL).\n *\n * @generated from field: optional bool nullable = 3;\n */\n nullable?: boolean;\n\n /**\n * The ref keyword MUST be a string.\n * It is a reference to a schema defined in the definitions object of the root schema.\n *\n * RFC 8927 Section 2.2.2: The value must refer to a definition in the root schema's definitions.\n * The referenced definition must exist (validated at runtime, not enforceable in protobuf schema).\n *\n * @generated from field: optional string ref = 4;\n */\n ref?: string;\n\n /**\n * The type keyword MUST be one of the predefined strings specifying the type of the value.\n * Valid values per RFC 8927 Section 2.2.3:\n * - \"boolean\": JSON true or false\n * - \"float32\", \"float64\": JSON numbers (IEEE 754 single/double precision intent)\n * - \"int8\": -128 to 127\n * - \"uint8\": 0 to 255\n * - \"int16\": -32,768 to 32,767\n * - \"uint16\": 0 to 65,535\n * - \"int32\": -2,147,483,648 to 2,147,483,647\n * - \"uint32\": 0 to 4,294,967,295\n * - \"string\": JSON string\n * - \"timestamp\": RFC 3339 timestamp string\n *\n * Note: RFC 8927 intentionally omits int64/uint64 due to JSON interoperability concerns.\n *\n * @generated from field: optional string type = 5;\n */\n type?: string;\n\n /**\n * The enum keyword MUST be a non-empty array of strings.\n * The schema matches any value that is equal to one of the elements in the array.\n *\n * RFC 8927 Section 2.2.4:\n * - When using enum form, this array MUST be non-empty\n * - The array MUST NOT contain duplicate values (enforced via unique constraint)\n * - Only string enums are supported (no numeric enums)\n *\n * @generated from field: repeated string enum = 6;\n */\n enum: string[];\n\n /**\n * The elements keyword MUST be a schema.\n * It is used to validate elements in an array.\n *\n * RFC 8927 Section 2.2.5: Describes homogeneous arrays where all elements match the same schema.\n * Empty arrays are valid. Each element is validated against this schema.\n *\n * @generated from field: optional mochabugapis.adapt.graph.JTDSchema elements = 7;\n */\n elements?: JTDSchema;\n\n /**\n * The properties keyword MUST be an object where each value is a schema.\n * Each key is a required property that must match the corresponding schema.\n *\n * RFC 8927 Section 2.2.6: Properties form describes JSON objects used as structs.\n * - All properties listed here are REQUIRED\n * - For optional properties, use optional_properties\n * - Keys cannot overlap between properties and optional_properties (validated via CEL)\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> properties = 8;\n */\n properties: { [key: string]: JTDSchema };\n\n /**\n * The optional_properties keyword MUST be an object where each value is a schema.\n * Each key is an optional property that, if present, must match the corresponding schema.\n *\n * RFC 8927 Section 2.2.6: Properties form describes JSON objects used as structs.\n * - All properties listed here are OPTIONAL\n * - For required properties, use properties\n * - Keys cannot overlap between properties and optional_properties (validated via CEL)\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> optional_properties = 9;\n */\n optionalProperties: { [key: string]: JTDSchema };\n\n /**\n * The additional_properties keyword MUST be a boolean.\n * If true, the object may have properties other than those specified in properties and optional_properties.\n *\n * RFC 8927 Section 3.1:\n * - Only valid on schemas of the \"properties\" form\n * - Controls \"allow additional properties\" mode during validation\n * - Does not get inherited by subschemas\n * - If false or absent, unknown properties cause validation errors\n *\n * @generated from field: optional bool additional_properties = 10;\n */\n additionalProperties?: boolean;\n\n /**\n * The values keyword MUST be a schema.\n * It is used to validate the values in an object (dictionary/map/associative array pattern).\n *\n * RFC 8927 Section 2.2.7: Values form describes JSON objects used as dictionaries.\n * - Keys can be any string\n * - All values must match this schema\n * - Empty objects are valid\n *\n * @generated from field: optional mochabugapis.adapt.graph.JTDSchema values = 11;\n */\n values?: JTDSchema;\n\n /**\n * The discriminator keyword MUST be a string.\n * It is used with mapping to represent tagged unions (discriminated unions, sum types).\n *\n * RFC 8927 Section 2.2.8: Discriminator form describes tagged unions.\n * - The discriminator is a property name that acts as the \"tag\"\n * - The tag value determines which schema from mapping is used\n * - Must be used together with mapping (validated via CEL)\n *\n * @generated from field: optional string discriminator = 12;\n */\n discriminator?: string;\n\n /**\n * The mapping keyword MUST be an object where each value is a schema.\n * Used with discriminator for tagged unions, mapping discriminator tag values to schemas.\n *\n * RFC 8927 Section 2.2.8: Each schema in mapping:\n * - MUST be of the \"properties\" form (have properties and/or optional_properties)\n * - MUST NOT have nullable=true\n * - MUST NOT include the discriminator tag in properties or optional_properties\n * These constraints are validated via CEL rules below.\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> mapping = 13;\n */\n mapping: { [key: string]: JTDSchema };\n};\n\n/**\n * Schema represents a JSON Typedef Schema (RFC 8927).\n *\n * ## Eight Mutually Exclusive Forms\n *\n * A JTD schema must take exactly ONE of these forms:\n * 1. **Empty**: No form-specific keywords (accepts anything)\n * 2. **Ref**: Has `ref` keyword\n * 3. **Type**: Has `type` keyword\n * 4. **Enum**: Has `enum` keyword (non-empty array)\n * 5. **Elements**: Has `elements` keyword\n * 6. **Properties**: Has `properties` and/or `optional_properties`\n * 7. **Values**: Has `values` keyword\n * 8. **Discriminator**: Has `discriminator` and `mapping` keywords\n *\n * ## Shared Keywords\n *\n * These can appear on ANY form:\n * - `nullable`: Allows null values in addition to the schema's type\n * - `metadata`: Arbitrary information (ignored during validation)\n *\n * ## Root-Level Keyword\n *\n * - `definitions`: Per RFC 8927 Section 2.1, this should only appear on root schemas.\n * While this cannot be enforced at the protobuf schema level, application code should\n * only populate this field on root schemas, not on nested schemas within definitions,\n * elements, properties, etc.\n *\n * @generated from message mochabugapis.adapt.graph.JTDSchema\n */\nexport type JTDSchemaJson = {\n /**\n * The definitions keyword MUST be an object where each value is a schema.\n * This object defines a collection of schema definitions that can be referenced via the ref keyword.\n *\n * RFC 8927 Section 2.1: definitions should only appear on root schemas, not on nested schemas.\n * Application code is responsible for enforcing this constraint.\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> definitions = 1;\n */\n definitions?: { [key: string]: JTDSchemaJson };\n\n /**\n * The metadata keyword MUST be an object.\n * This object is ignored during validation and can store custom information about the schema.\n * Examples: descriptions, UI hints, code generation directives.\n *\n * @generated from field: optional google.protobuf.Struct metadata = 2;\n */\n metadata?: StructJson;\n\n /**\n * The nullable keyword MUST be a boolean.\n * If true, the schema matches the value null as well as any value matched by the rest of the schema.\n *\n * RFC 8927: nullable can appear on any schema form.\n * Exception: Cannot be true on schemas within discriminator mappings (validated via CEL).\n *\n * @generated from field: optional bool nullable = 3;\n */\n nullable?: boolean;\n\n /**\n * The ref keyword MUST be a string.\n * It is a reference to a schema defined in the definitions object of the root schema.\n *\n * RFC 8927 Section 2.2.2: The value must refer to a definition in the root schema's definitions.\n * The referenced definition must exist (validated at runtime, not enforceable in protobuf schema).\n *\n * @generated from field: optional string ref = 4;\n */\n ref?: string;\n\n /**\n * The type keyword MUST be one of the predefined strings specifying the type of the value.\n * Valid values per RFC 8927 Section 2.2.3:\n * - \"boolean\": JSON true or false\n * - \"float32\", \"float64\": JSON numbers (IEEE 754 single/double precision intent)\n * - \"int8\": -128 to 127\n * - \"uint8\": 0 to 255\n * - \"int16\": -32,768 to 32,767\n * - \"uint16\": 0 to 65,535\n * - \"int32\": -2,147,483,648 to 2,147,483,647\n * - \"uint32\": 0 to 4,294,967,295\n * - \"string\": JSON string\n * - \"timestamp\": RFC 3339 timestamp string\n *\n * Note: RFC 8927 intentionally omits int64/uint64 due to JSON interoperability concerns.\n *\n * @generated from field: optional string type = 5;\n */\n type?: string;\n\n /**\n * The enum keyword MUST be a non-empty array of strings.\n * The schema matches any value that is equal to one of the elements in the array.\n *\n * RFC 8927 Section 2.2.4:\n * - When using enum form, this array MUST be non-empty\n * - The array MUST NOT contain duplicate values (enforced via unique constraint)\n * - Only string enums are supported (no numeric enums)\n *\n * @generated from field: repeated string enum = 6;\n */\n enum?: string[];\n\n /**\n * The elements keyword MUST be a schema.\n * It is used to validate elements in an array.\n *\n * RFC 8927 Section 2.2.5: Describes homogeneous arrays where all elements match the same schema.\n * Empty arrays are valid. Each element is validated against this schema.\n *\n * @generated from field: optional mochabugapis.adapt.graph.JTDSchema elements = 7;\n */\n elements?: JTDSchemaJson;\n\n /**\n * The properties keyword MUST be an object where each value is a schema.\n * Each key is a required property that must match the corresponding schema.\n *\n * RFC 8927 Section 2.2.6: Properties form describes JSON objects used as structs.\n * - All properties listed here are REQUIRED\n * - For optional properties, use optional_properties\n * - Keys cannot overlap between properties and optional_properties (validated via CEL)\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> properties = 8;\n */\n properties?: { [key: string]: JTDSchemaJson };\n\n /**\n * The optional_properties keyword MUST be an object where each value is a schema.\n * Each key is an optional property that, if present, must match the corresponding schema.\n *\n * RFC 8927 Section 2.2.6: Properties form describes JSON objects used as structs.\n * - All properties listed here are OPTIONAL\n * - For required properties, use properties\n * - Keys cannot overlap between properties and optional_properties (validated via CEL)\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> optional_properties = 9;\n */\n optionalProperties?: { [key: string]: JTDSchemaJson };\n\n /**\n * The additional_properties keyword MUST be a boolean.\n * If true, the object may have properties other than those specified in properties and optional_properties.\n *\n * RFC 8927 Section 3.1:\n * - Only valid on schemas of the \"properties\" form\n * - Controls \"allow additional properties\" mode during validation\n * - Does not get inherited by subschemas\n * - If false or absent, unknown properties cause validation errors\n *\n * @generated from field: optional bool additional_properties = 10;\n */\n additionalProperties?: boolean;\n\n /**\n * The values keyword MUST be a schema.\n * It is used to validate the values in an object (dictionary/map/associative array pattern).\n *\n * RFC 8927 Section 2.2.7: Values form describes JSON objects used as dictionaries.\n * - Keys can be any string\n * - All values must match this schema\n * - Empty objects are valid\n *\n * @generated from field: optional mochabugapis.adapt.graph.JTDSchema values = 11;\n */\n values?: JTDSchemaJson;\n\n /**\n * The discriminator keyword MUST be a string.\n * It is used with mapping to represent tagged unions (discriminated unions, sum types).\n *\n * RFC 8927 Section 2.2.8: Discriminator form describes tagged unions.\n * - The discriminator is a property name that acts as the \"tag\"\n * - The tag value determines which schema from mapping is used\n * - Must be used together with mapping (validated via CEL)\n *\n * @generated from field: optional string discriminator = 12;\n */\n discriminator?: string;\n\n /**\n * The mapping keyword MUST be an object where each value is a schema.\n * Used with discriminator for tagged unions, mapping discriminator tag values to schemas.\n *\n * RFC 8927 Section 2.2.8: Each schema in mapping:\n * - MUST be of the \"properties\" form (have properties and/or optional_properties)\n * - MUST NOT have nullable=true\n * - MUST NOT include the discriminator tag in properties or optional_properties\n * These constraints are validated via CEL rules below.\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> mapping = 13;\n */\n mapping?: { [key: string]: JTDSchemaJson };\n};\n\n/**\n * Describes the message mochabugapis.adapt.graph.JTDSchema.\n * Use `create(JTDSchemaSchema)` to create a new message.\n */\nexport const JTDSchemaSchema: GenMessage<JTDSchema, {jsonType: JTDSchemaJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_graph_jtd_schema, 0);\n\n", "// Copyright 2023-2025 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file buf/validate/validate.proto (package buf.validate, syntax proto2)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenEnum, GenExtension, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, extDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Duration, DurationJson, FieldDescriptorProto_Type, FieldDescriptorProto_TypeJson, FieldOptions, MessageOptions, OneofOptions, Timestamp, TimestampJson } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file buf/validate/validate.proto.\n */\nexport const file_buf_validate_validate: GenFile = /*@__PURE__*/\n fileDesc(\"ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSJuCgxNZXNzYWdlUnVsZXMSHwoDY2VsGAMgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSLQoFb25lb2YYBCADKAsyHi5idWYudmFsaWRhdGUuTWVzc2FnZU9uZW9mUnVsZUoECAEQAlIIZGlzYWJsZWQiNAoQTWVzc2FnZU9uZW9mUnVsZRIOCgZmaWVsZHMYASADKAkSEAoIcmVxdWlyZWQYAiABKAgiHgoKT25lb2ZSdWxlcxIQCghyZXF1aXJlZBgBIAEoCCK/CAoKRmllbGRSdWxlcxIfCgNjZWwYFyADKAsyEi5idWYudmFsaWRhdGUuUnVsZRIQCghyZXF1aXJlZBgZIAEoCBIkCgZpZ25vcmUYGyABKA4yFC5idWYudmFsaWRhdGUuSWdub3JlEikKBWZsb2F0GAEgASgLMhguYnVmLnZhbGlkYXRlLkZsb2F0UnVsZXNIABIrCgZkb3VibGUYAiABKAsyGS5idWYudmFsaWRhdGUuRG91YmxlUnVsZXNIABIpCgVpbnQzMhgDIAEoCzIYLmJ1Zi52YWxpZGF0ZS5JbnQzMlJ1bGVzSAASKQoFaW50NjQYBCABKAsyGC5idWYudmFsaWRhdGUuSW50NjRSdWxlc0gAEisKBnVpbnQzMhgFIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50MzJSdWxlc0gAEisKBnVpbnQ2NBgGIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50NjRSdWxlc0gAEisKBnNpbnQzMhgHIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50MzJSdWxlc0gAEisKBnNpbnQ2NBgIIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50NjRSdWxlc0gAEi0KB2ZpeGVkMzIYCSABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQzMlJ1bGVzSAASLQoHZml4ZWQ2NBgKIAEoCzIaLmJ1Zi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIABIvCghzZml4ZWQzMhgLIAEoCzIbLmJ1Zi52YWxpZGF0ZS5TRml4ZWQzMlJ1bGVzSAASLwoIc2ZpeGVkNjQYDCABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkNjRSdWxlc0gAEicKBGJvb2wYDSABKAsyFy5idWYudmFsaWRhdGUuQm9vbFJ1bGVzSAASKwoGc3RyaW5nGA4gASgLMhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzSAASKQoFYnl0ZXMYDyABKAsyGC5idWYudmFsaWRhdGUuQnl0ZXNSdWxlc0gAEicKBGVudW0YECABKAsyFy5idWYudmFsaWRhdGUuRW51bVJ1bGVzSAASLwoIcmVwZWF0ZWQYEiABKAsyGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlc0gAEiUKA21hcBgTIAEoCzIWLmJ1Zi52YWxpZGF0ZS5NYXBSdWxlc0gAEiUKA2FueRgUIAEoCzIWLmJ1Zi52YWxpZGF0ZS5BbnlSdWxlc0gAEi8KCGR1cmF0aW9uGBUgASgLMhsuYnVmLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIABIxCgl0aW1lc3RhbXAYFiABKAsyHC5idWYudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAEIGCgR0eXBlSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHkiVQoPUHJlZGVmaW5lZFJ1bGVzEh8KA2NlbBgBIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHki2hcKCkZsb2F0UnVsZXMSgwEKBWNvbnN0GAEgASgCQnTCSHEKbwoLZmxvYXQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKfAQoCbHQYAiABKAJCkAHCSIwBCokBCghmbG9hdC5sdBp9IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKvAQoDbHRlGAMgASgCQp8BwkibAQqYAQoJZmxvYXQubHRlGooBIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS7wcKAmd0GAQgASgCQuAHwkjcBwqNAQoIZmxvYXQuZ3QagAEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwrDAQoLZmxvYXQuZ3RfbHQaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrNAQoVZmxvYXQuZ3RfbHRfZXhjbHVzaXZlGrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycK0wEKDGZsb2F0Lmd0X2x0ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCt0BChZmbG9hdC5ndF9sdGVfZXhjbHVzaXZlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARK6CAoDZ3RlGAUgASgCQqoIwkimCAqbAQoJZmxvYXQuZ3RlGo0BIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCtIBCgxmbG9hdC5ndGVfbHQawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtwBChZmbG9hdC5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwriAQoNZmxvYXQuZ3RlX2x0ZRrQAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK7AEKF2Zsb2F0Lmd0ZV9sdGVfZXhjbHVzaXZlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygCQnPCSHAKbgoIZmxvYXQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoAkJmwkhjCmEKDGZsb2F0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnUKBmZpbml0ZRgIIAEoCEJlwkhiCmAKDGZsb2F0LmZpbml0ZRpQcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAndmFsdWUgbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSKwoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIu0XCgtEb3VibGVSdWxlcxKEAQoFY29uc3QYASABKAFCdcJIcgpwCgxkb3VibGUuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKgAQoCbHQYAiABKAFCkQHCSI0BCooBCglkb3VibGUubHQafSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASsAEKA2x0ZRgDIAEoAUKgAcJInAEKmQEKCmRvdWJsZS5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABL0BwoCZ3QYBCABKAFC5QfCSOEHCo4BCglkb3VibGUuZ3QagAEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwrEAQoMZG91YmxlLmd0X2x0GrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzgEKFmRvdWJsZS5ndF9sdF9leGNsdXNpdmUaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrUAQoNZG91YmxlLmd0X2x0ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCt4BChdkb3VibGUuZ3RfbHRlX2V4Y2x1c2l2ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESvwgKA2d0ZRgFIAEoAUKvCMJIqwgKnAEKCmRvdWJsZS5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0wEKDWRvdWJsZS5ndGVfbHQawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCt0BChdkb3VibGUuZ3RlX2x0X2V4Y2x1c2l2ZRrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK4wEKDmRvdWJsZS5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrtAQoYZG91YmxlLmd0ZV9sdGVfZXhjbHVzaXZlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoAUJ0wkhxCm8KCWRvdWJsZS5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygBQmfCSGQKYgoNZG91YmxlLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnYKBmZpbml0ZRgIIAEoCEJmwkhjCmEKDWRvdWJsZS5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnEiwKB2V4YW1wbGUYCSADKAFCG8JIGAoWCg5kb3VibGUuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ijBUKCkludDMyUnVsZXMSgwEKBWNvbnN0GAEgASgFQnTCSHEKbwoLaW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKKAQoCbHQYAiABKAVCfMJIeQp3CghpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKcAQoDbHRlGAMgASgFQowBwkiIAQqFAQoJaW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKXBwoCZ3QYBCABKAVCiAfCSIQHCnoKCGludDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50MzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES4wcKA2d0ZRgFIAEoBULTB8JIzwcKiAEKCWludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsIBCgxpbnQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKygEKFmludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtIBCg1pbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtoBChdpbnQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ/CgJpbhgGIAMoBUJzwkhwCm4KCGludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YByADKAVCZsJIYwphCgxpbnQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIrCgdleGFtcGxlGAggAygFQhrCSBcKFQoNaW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ijBUKCkludDY0UnVsZXMSgwEKBWNvbnN0GAEgASgDQnTCSHEKbwoLaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKKAQoCbHQYAiABKANCfMJIeQp3CghpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKcAQoDbHRlGAMgASgDQowBwkiIAQqFAQoJaW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKXBwoCZ3QYBCABKANCiAfCSIQHCnoKCGludDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50NjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES4wcKA2d0ZRgFIAEoA0LTB8JIzwcKiAEKCWludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsIBCgxpbnQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKygEKFmludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtIBCg1pbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtoBChdpbnQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ/CgJpbhgGIAMoA0JzwkhwCm4KCGludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YByADKANCZsJIYwphCgxpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIrCgdleGFtcGxlGAkgAygDQhrCSBcKFQoNaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1VJbnQzMlJ1bGVzEoQBCgVjb25zdBgBIAEoDUJ1wkhyCnAKDHVpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoDUJ9wkh6CngKCXVpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgNQo0BwkiJAQqGAQoKdWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgNQo0HwkiJBwp7Cgl1aW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgx1aW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZ1aW50MzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXVpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChd1aW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoDULYB8JI1AcKiQEKCnVpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoDUJ0wkhxCm8KCXVpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygNQmfCSGQKYgoNdWludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKA1CG8JIGAoWCg51aW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1VJbnQ2NFJ1bGVzEoQBCgVjb25zdBgBIAEoBEJ1wkhyCnAKDHVpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoBEJ9wkh6CngKCXVpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgEQo0BwkiJAQqGAQoKdWludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgEQo0HwkiJBwp7Cgl1aW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgx1aW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZ1aW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXVpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChd1aW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoBELYB8JI1AcKiQEKCnVpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoBEJ0wkhxCm8KCXVpbnQ2NC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygEQmfCSGQKYgoNdWludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKARCG8JIGAoWCg51aW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1NJbnQzMlJ1bGVzEoQBCgVjb25zdBgBIAEoEUJ1wkhyCnAKDHNpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoEUJ9wkh6CngKCXNpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgRQo0BwkiJAQqGAQoKc2ludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgRQo0HwkiJBwp7CglzaW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgxzaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZzaW50MzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXNpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChdzaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoEULYB8JI1AcKiQEKCnNpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoEUJ0wkhxCm8KCXNpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygRQmfCSGQKYgoNc2ludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBFCG8JIGAoWCg5zaW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1NJbnQ2NFJ1bGVzEoQBCgVjb25zdBgBIAEoEkJ1wkhyCnAKDHNpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoEkJ9wkh6CngKCXNpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgSQo0BwkiJAQqGAQoKc2ludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgSQo0HwkiJBwp7CglzaW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgxzaW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZzaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXNpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChdzaW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoEkLYB8JI1AcKiQEKCnNpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoEkJ0wkhxCm8KCXNpbnQ2NC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygSQmfCSGQKYgoNc2ludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBJCG8JIGAoWCg5zaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4irxUKDEZpeGVkMzJSdWxlcxKFAQoFY29uc3QYASABKAdCdsJIcwpxCg1maXhlZDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjAEKAmx0GAIgASgHQn7CSHsKeQoKZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKeAQoDbHRlGAMgASgHQo4BwkiKAQqHAQoLZml4ZWQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEqEHCgJndBgEIAEoB0KSB8JIjgcKfAoKZml4ZWQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtQEKDWZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr0BChdmaXhlZDMyLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsUBCg5maXhlZDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzQEKGGZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES7QcKA2d0ZRgFIAEoB0LdB8JI2QcKigEKC2ZpeGVkMzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxAEKDmZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCswBChhmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtQBCg9maXhlZDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3AEKGWZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgQEKAmluGAYgAygHQnXCSHIKcAoKZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSeAoGbm90X2luGAcgAygHQmjCSGUKYwoOZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxItCgdleGFtcGxlGAggAygHQhzCSBkKFwoPZml4ZWQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKvFQoMRml4ZWQ2NFJ1bGVzEoUBCgVjb25zdBgBIAEoBkJ2wkhzCnEKDWZpeGVkNjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKMAQoCbHQYAiABKAZCfsJIewp5CgpmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp4BCgNsdGUYAyABKAZCjgHCSIoBCocBCgtmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASoQcKAmd0GAQgASgGQpIHwkiOBwp8CgpmaXhlZDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkNjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLtBwoDZ3RlGAUgASgGQt0HwkjZBwqKAQoLZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKBAQoCaW4YBiADKAZCdcJIcgpwCgpmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ4CgZub3RfaW4YByADKAZCaMJIZQpjCg5maXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi0KB2V4YW1wbGUYCCADKAZCHMJIGQoXCg9maXhlZDY0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsAVCg1TRml4ZWQzMlJ1bGVzEoYBCgVjb25zdBgBIAEoD0J3wkh0CnIKDnNmaXhlZDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjQEKAmx0GAIgASgPQn/CSHwKegoLc2ZpeGVkMzIubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnwEKA2x0ZRgDIAEoD0KPAcJIiwEKiAEKDHNmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASpgcKAmd0GAQgASgPQpcHwkiTBwp9CgtzZml4ZWQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDnNmaXhlZDMyLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYc2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD3NmaXhlZDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGXNmaXhlZDMyLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEvIHCgNndGUYBSABKA9C4gfCSN4HCosBCgxzZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESggEKAmluGAYgAygPQnbCSHMKcQoLc2ZpeGVkMzIuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnkKBm5vdF9pbhgHIAMoD0JpwkhmCmQKD3NmaXhlZDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi4KB2V4YW1wbGUYCCADKA9CHcJIGgoYChBzZml4ZWQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLAFQoNU0ZpeGVkNjRSdWxlcxKGAQoFY29uc3QYASABKBBCd8JIdApyCg5zZml4ZWQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEo0BCgJsdBgCIAEoEEJ/wkh8CnoKC3NmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp8BCgNsdGUYAyABKBBCjwHCSIsBCogBCgxzZml4ZWQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEqYHCgJndBgEIAEoEEKXB8JIkwcKfQoLc2ZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrYBCg5zZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKGHNmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsYBCg9zZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs4BChlzZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLyBwoDZ3RlGAUgASgQQuIHwkjeBwqLAQoMc2ZpeGVkNjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxQEKD3NmaXhlZDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoZc2ZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1QEKEHNmaXhlZDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3QEKGnNmaXhlZDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoIBCgJpbhgGIAMoEEJ2wkhzCnEKC3NmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ5CgZub3RfaW4YByADKBBCacJIZgpkCg9zZml4ZWQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ixwEKCUJvb2xSdWxlcxKCAQoFY29uc3QYASABKAhCc8JIcApuCgpib29sLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSKgoHZXhhbXBsZRgCIAMoCEIZwkgWChQKDGJvb2wuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIpA3CgtTdHJpbmdSdWxlcxKGAQoFY29uc3QYASABKAlCd8JIdApyCgxzdHJpbmcuY29uc3QaYnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgYCVzYCcuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEn4KA2xlbhgTIAEoBEJxwkhuCmwKCnN0cmluZy5sZW4aXnVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSmQEKB21pbl9sZW4YAiABKARChwHCSIMBCoABCg5zdHJpbmcubWluX2xlbhpudWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fbGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSlwEKB21heF9sZW4YAyABKARChQHCSIEBCn8KDnN0cmluZy5tYXhfbGVuGm11aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbW9zdCAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEpsBCglsZW5fYnl0ZXMYFCABKARChwHCSIMBCoABChBzdHJpbmcubGVuX2J5dGVzGmx1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl9ieXRlc10pIDogJycSowEKCW1pbl9ieXRlcxgEIAEoBEKPAcJIiwEKiAEKEHN0cmluZy5taW5fYnl0ZXMadHVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fYnl0ZXNdKSA6ICcnEqIBCgltYXhfYnl0ZXMYBSABKARCjgHCSIoBCocBChBzdHJpbmcubWF4X2J5dGVzGnN1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgPiBydWxlcy5tYXhfYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbW9zdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5tYXhfYnl0ZXNdKSA6ICcnEo0BCgdwYXR0ZXJuGAYgASgJQnzCSHkKdwoOc3RyaW5nLnBhdHRlcm4aZSF0aGlzLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgZG9lcyBub3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnEoQBCgZwcmVmaXgYByABKAlCdMJIcQpvCg1zdHJpbmcucHJlZml4Gl4hdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEoIBCgZzdWZmaXgYCCABKAlCcsJIbwptCg1zdHJpbmcuc3VmZml4GlwhdGhpcy5lbmRzV2l0aChydWxlcy5zdWZmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgc3VmZml4IGAlc2AnLmZvcm1hdChbcnVsZXMuc3VmZml4XSkgOiAnJxKQAQoIY29udGFpbnMYCSABKAlCfsJIewp5Cg9zdHJpbmcuY29udGFpbnMaZiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJxKYAQoMbm90X2NvbnRhaW5zGBcgASgJQoEBwkh+CnwKE3N0cmluZy5ub3RfY29udGFpbnMaZXRoaXMuY29udGFpbnMocnVsZXMubm90X2NvbnRhaW5zKSA/ICd2YWx1ZSBjb250YWlucyBzdWJzdHJpbmcgYCVzYCcuZm9ybWF0KFtydWxlcy5ub3RfY29udGFpbnNdKSA6ICcnEoABCgJpbhgKIAMoCUJ0wkhxCm8KCXN0cmluZy5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAsgAygJQmfCSGQKYgoNc3RyaW5nLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEt8BCgVlbWFpbBgMIAEoCELNAcJIyQEKYQoMc3RyaW5nLmVtYWlsEiN2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcxosIXJ1bGVzLmVtYWlsIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0VtYWlsKCkKZAoSc3RyaW5nLmVtYWlsX2VtcHR5EjJ2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcxoaIXJ1bGVzLmVtYWlsIHx8IHRoaXMgIT0gJydIABLnAQoIaG9zdG5hbWUYDSABKAhC0gHCSM4BCmUKD3N0cmluZy5ob3N0bmFtZRIedmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIABLHAQoCaXAYDiABKAhCuAHCSLQBClUKCXN0cmluZy5pcBIgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3MaJiFydWxlcy5pcCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCgpClsKD3N0cmluZy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaFyFydWxlcy5pcCB8fCB0aGlzICE9ICcnSAAS1gEKBGlwdjQYDyABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY0EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzGikhcnVsZXMuaXB2NCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg0KQphChFzdHJpbmcuaXB2NF9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcxoZIXJ1bGVzLmlwdjQgfHwgdGhpcyAhPSAnJ0gAEtYBCgRpcHY2GBAgASgIQsUBwkjBAQpcCgtzdHJpbmcuaXB2NhIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxopIXJ1bGVzLmlwdjYgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoNikKYQoRc3RyaW5nLmlwdjZfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MaGSFydWxlcy5pcHY2IHx8IHRoaXMgIT0gJydIABK/AQoDdXJpGBEgASgIQq8BwkirAQpRCgpzdHJpbmcudXJpEhl2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVJJGighcnVsZXMudXJpIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc1VyaSgpClYKEHN0cmluZy51cmlfZW1wdHkSKHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVUkkaGCFydWxlcy51cmkgfHwgdGhpcyAhPSAnJ0gAEnAKB3VyaV9yZWYYEiABKAhCXcJIWgpYCg5zdHJpbmcudXJpX3JlZhIjdmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVSSSBSZWZlcmVuY2UaISFydWxlcy51cmlfcmVmIHx8IHRoaXMuaXNVcmlSZWYoKUgAEpACCgdhZGRyZXNzGBUgASgIQvwBwkj4AQqBAQoOc3RyaW5nLmFkZHJlc3MSLXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0bmFtZSwgb3IgaXAgYWRkcmVzcxpAIXJ1bGVzLmFkZHJlc3MgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKSB8fCB0aGlzLmlzSXAoKQpyChRzdHJpbmcuYWRkcmVzc19lbXB0eRI8dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGhwhcnVsZXMuYWRkcmVzcyB8fCB0aGlzICE9ICcnSAASmAIKBHV1aWQYFiABKAhChwLCSIMCCqUBCgtzdHJpbmcudXVpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeiFydWxlcy51dWlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpClkKEXN0cmluZy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBoZIXJ1bGVzLnV1aWQgfHwgdGhpcyAhPSAnJ0gAEvABCgV0dXVpZBghIAEoCELeAcJI2gEKcwoMc3RyaW5nLnR1dWlkEiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgdHJpbW1lZCBVVUlEGj8hcnVsZXMudHV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXszMn0kJykKYwoSc3RyaW5nLnR1dWlkX2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgdHJpbW1lZCBVVUlEGhohcnVsZXMudHV1aWQgfHwgdGhpcyAhPSAnJ0gAEpYCChFpcF93aXRoX3ByZWZpeGxlbhgaIAEoCEL4AcJI9AEKeAoYc3RyaW5nLmlwX3dpdGhfcHJlZml4bGVuEh92YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgcHJlZml4GjshcnVsZXMuaXBfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoKQp4Ch5zdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW5fZW1wdHkSLnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUCBwcmVmaXgaJiFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAASzwIKE2lwdjRfd2l0aF9wcmVmaXhsZW4YGyABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQpCpIBCiBzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLPAgoTaXB2Nl93aXRoX3ByZWZpeGxlbhgcIAEoCEKvAsJIqwIKkwEKGnN0cmluZy5pcHY2X3dpdGhfcHJlZml4bGVuEjV2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjZfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNikKkgEKIHN0cmluZy5pcHY2X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NiBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjZfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEvIBCglpcF9wcmVmaXgYHSABKAhC3AHCSNgBCmwKEHN0cmluZy5pcF9wcmVmaXgSH3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaNyFydWxlcy5pcF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgodHJ1ZSkKaAoWc3RyaW5nLmlwX3ByZWZpeF9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBoeIXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzICE9ICcnSAASgwIKC2lwdjRfcHJlZml4GB4gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2NF9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IHByZWZpeBo8IXJ1bGVzLmlwdjRfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQsIHRydWUpCm4KGHN0cmluZy5pcHY0X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgcHJlZml4GiAhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAEoMCCgtpcHY2X3ByZWZpeBgfIAEoCELrAcJI5wEKdQoSc3RyaW5nLmlwdjZfcHJlZml4EiF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBwcmVmaXgaPCFydWxlcy5pcHY2X3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2LCB0cnVlKQpuChhzdHJpbmcuaXB2Nl9wcmVmaXhfZW1wdHkSMHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IHByZWZpeBogIXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgIT0gJydIABK1AgoNaG9zdF9hbmRfcG9ydBggIAEoCEKbAsJIlwIKmQEKFHN0cmluZy5ob3N0X2FuZF9wb3J0EkF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdCAoaG9zdG5hbWUgb3IgSVAgYWRkcmVzcykgYW5kIHBvcnQgcGFpcho+IXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdEFuZFBvcnQodHJ1ZSkKeQoac3RyaW5nLmhvc3RfYW5kX3BvcnRfZW1wdHkSN3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0IGFuZCBwb3J0IHBhaXIaIiFydWxlcy5ob3N0X2FuZF9wb3J0IHx8IHRoaXMgIT0gJydIABKoBQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QvEEwkjtBArwAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSJnZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrnAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEid2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAEg4KBnN0cmljdBgZIAEoCBIsCgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIuoQCgpCeXRlc1J1bGVzEoABCgVjb25zdBgBIAEoDEJxwkhuCmwKC2J5dGVzLmNvbnN0Gl10aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGJlICV4Jy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSeAoDbGVuGA0gASgEQmvCSGgKZgoJYnl0ZXMubGVuGll1aW50KHRoaXMuc2l6ZSgpKSAhPSBydWxlcy5sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuXSkgOiAnJxKQAQoHbWluX2xlbhgCIAEoBEJ/wkh8CnoKDWJ5dGVzLm1pbl9sZW4aaXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKIAQoHbWF4X2xlbhgDIAEoBEJ3wkh0CnIKDWJ5dGVzLm1heF9sZW4aYXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICd2YWx1ZSBtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSkAEKB3BhdHRlcm4YBCABKAlCf8JIfAp6Cg1ieXRlcy5wYXR0ZXJuGmkhc3RyaW5nKHRoaXMpLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgbXVzdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycSgQEKBnByZWZpeBgFIAEoDEJxwkhuCmwKDGJ5dGVzLnByZWZpeBpcIXRoaXMuc3RhcnRzV2l0aChydWxlcy5wcmVmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgcHJlZml4ICV4Jy5mb3JtYXQoW3J1bGVzLnByZWZpeF0pIDogJycSfwoGc3VmZml4GAYgASgMQm/CSGwKagoMYnl0ZXMuc3VmZml4GlohdGhpcy5lbmRzV2l0aChydWxlcy5zdWZmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgc3VmZml4ICV4Jy5mb3JtYXQoW3J1bGVzLnN1ZmZpeF0pIDogJycSgwEKCGNvbnRhaW5zGAcgASgMQnHCSG4KbAoOYnl0ZXMuY29udGFpbnMaWiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluICV4Jy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJxKnAQoCaW4YCCADKAxCmgHCSJYBCpMBCghieXRlcy5pbhqGAWdldEZpZWxkKHJ1bGVzLCAnaW4nKS5zaXplKCkgPiAwICYmICEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgJIAMoDEJmwkhjCmEKDGJ5dGVzLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEusBCgJpcBgKIAEoCELcAcJI2AEKdAoIYnl0ZXMuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGkYhcnVsZXMuaXAgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0IHx8IHRoaXMuc2l6ZSgpID09IDE2CmAKDmJ5dGVzLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxodIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpICE9IDBIABLkAQoEaXB2NBgLIAEoCELTAcJIzwEKZQoKYnl0ZXMuaXB2NBIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcxozIXJ1bGVzLmlwdjQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0CmYKEGJ5dGVzLmlwdjRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY0IGFkZHJlc3MaHyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpICE9IDBIABLlAQoEaXB2NhgMIAEoCELUAcJI0AEKZgoKYnl0ZXMuaXB2NhIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxo0IXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpmChBieXRlcy5pcHY2X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NiBhZGRyZXNzGh8hcnVsZXMuaXB2NiB8fCB0aGlzLnNpemUoKSAhPSAwSAASKwoHZXhhbXBsZRgOIAMoDEIawkgXChUKDWJ5dGVzLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duItQDCglFbnVtUnVsZXMSggEKBWNvbnN0GAEgASgFQnPCSHAKbgoKZW51bS5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEhQKDGRlZmluZWRfb25seRgCIAEoCBJ+CgJpbhgDIAMoBUJywkhvCm0KB2VudW0uaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnUKBm5vdF9pbhgEIAMoBUJlwkhiCmAKC2VudW0ubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKgoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIvsDCg1SZXBlYXRlZFJ1bGVzEp4BCgltaW5faXRlbXMYASABKARCigHCSIYBCoMBChJyZXBlYXRlZC5taW5faXRlbXMabXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAlZCBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1pbl9pdGVtc10pIDogJycSogEKCW1heF9pdGVtcxgCIAEoBEKOAcJIigEKhwEKEnJlcGVhdGVkLm1heF9pdGVtcxpxdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfaXRlbXMgPyAndmFsdWUgbXVzdCBjb250YWluIG5vIG1vcmUgdGhhbiAlcyBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1heF9pdGVtc10pIDogJycScAoGdW5pcXVlGAMgASgIQmDCSF0KWwoPcmVwZWF0ZWQudW5pcXVlEihyZXBlYXRlZCB2YWx1ZSBtdXN0IGNvbnRhaW4gdW5pcXVlIGl0ZW1zGh4hcnVsZXMudW5pcXVlIHx8IHRoaXMudW5pcXVlKCkSJwoFaXRlbXMYBCABKAsyGC5idWYudmFsaWRhdGUuRmllbGRSdWxlcyoJCOgHEICAgIACIooDCghNYXBSdWxlcxKPAQoJbWluX3BhaXJzGAEgASgEQnzCSHkKdwoNbWFwLm1pbl9wYWlycxpmdWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbGVhc3QgJWQgZW50cmllcycuZm9ybWF0KFtydWxlcy5taW5fcGFpcnNdKSA6ICcnEo4BCgltYXhfcGFpcnMYAiABKARCe8JIeAp2Cg1tYXAubWF4X3BhaXJzGmV1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBtb3N0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWF4X3BhaXJzXSkgOiAnJxImCgRrZXlzGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMSKAoGdmFsdWVzGAUgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiImCghBbnlSdWxlcxIKCgJpbhgCIAMoCRIOCgZub3RfaW4YAyADKAkimRcKDUR1cmF0aW9uUnVsZXMSoQEKBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnfCSHQKcgoOZHVyYXRpb24uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKoAQoCbHQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cf8JIfAp6CgtkdXJhdGlvbi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABK6AQoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQo8BwkiLAQqIAQoMZHVyYXRpb24ubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABLBBwoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ClwfCSJMHCn0KC2R1cmF0aW9uLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOZHVyYXRpb24uZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPZHVyYXRpb24uZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZZHVyYXRpb24uZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESjQgKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkLiB8JI3gcKiwEKDGR1cmF0aW9uLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9kdXJhdGlvbi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGWR1cmF0aW9uLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBkdXJhdGlvbi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpkdXJhdGlvbi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKdAQoCaW4YByADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CdsJIcwpxCgtkdXJhdGlvbi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSlAEKBm5vdF9pbhgIIAMoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJpwkhmCmQKD2R1cmF0aW9uLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEkkKB2V4YW1wbGUYCSADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CHcJIGgoYChBkdXJhdGlvbi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKSGAoOVGltZXN0YW1wUnVsZXMSowEKBWNvbnN0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEJ4wkh1CnMKD3RpbWVzdGFtcC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEqsBCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCgAHCSH0KewoMdGltZXN0YW1wLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAErwBCgNsdGUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQpABwkiMAQqJAQoNdGltZXN0YW1wLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASbAoGbHRfbm93GAcgASgIQlrCSFcKVQoQdGltZXN0YW1wLmx0X25vdxpBKHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIABLHBwoCZ3QYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQpwHwkiYBwp+Cgx0aW1lc3RhbXAuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrcBCg90aW1lc3RhbXAuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr8BChl0aW1lc3RhbXAuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxwEKEHRpbWVzdGFtcC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs8BChp0aW1lc3RhbXAuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESkwgKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBC5wfCSOMHCowBCg10aW1lc3RhbXAuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxgEKEHRpbWVzdGFtcC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKGnRpbWVzdGFtcC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrWAQoRdGltZXN0YW1wLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3gEKG3RpbWVzdGFtcC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJvCgZndF9ub3cYCCABKAhCXcJIWgpYChB0aW1lc3RhbXAuZ3Rfbm93GkQocnVsZXMuZ3Rfbm93ICYmIHRoaXMgPCBub3cpID8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG5vdycgOiAnJ0gBErgBCgZ3aXRoaW4YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CjAHCSIgBCoUBChB0aW1lc3RhbXAud2l0aGluGnF0aGlzIDwgbm93LXJ1bGVzLndpdGhpbiB8fCB0aGlzID4gbm93K3J1bGVzLndpdGhpbiA/ICd2YWx1ZSBtdXN0IGJlIHdpdGhpbiAlcyBvZiBub3cnLmZvcm1hdChbcnVsZXMud2l0aGluXSkgOiAnJxJLCgdleGFtcGxlGAogAygLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIewkgbChkKEXRpbWVzdGFtcC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiI5CgpWaW9sYXRpb25zEisKCnZpb2xhdGlvbnMYASADKAsyFy5idWYudmFsaWRhdGUuVmlvbGF0aW9uIp8BCglWaW9sYXRpb24SJgoFZmllbGQYBSABKAsyFy5idWYudmFsaWRhdGUuRmllbGRQYXRoEiUKBHJ1bGUYBiABKAsyFy5idWYudmFsaWRhdGUuRmllbGRQYXRoEg8KB3J1bGVfaWQYAiABKAkSDwoHbWVzc2FnZRgDIAEoCRIPCgdmb3Jfa2V5GAQgASgISgQIARACUgpmaWVsZF9wYXRoIj0KCUZpZWxkUGF0aBIwCghlbGVtZW50cxgBIAMoCzIeLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhFbGVtZW50IukCChBGaWVsZFBhdGhFbGVtZW50EhQKDGZpZWxkX251bWJlchgBIAEoBRISCgpmaWVsZF9uYW1lGAIgASgJEj4KCmZpZWxkX3R5cGUYAyABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRI8CghrZXlfdHlwZRgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEj4KCnZhbHVlX3R5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRIPCgVpbmRleBgGIAEoBEgAEhIKCGJvb2xfa2V5GAcgASgISAASEQoHaW50X2tleRgIIAEoA0gAEhIKCHVpbnRfa2V5GAkgASgESAASFAoKc3RyaW5nX2tleRgKIAEoCUgAQgsKCXN1YnNjcmlwdCqhAQoGSWdub3JlEhYKEklHTk9SRV9VTlNQRUNJRklFRBAAEhgKFElHTk9SRV9JRl9aRVJPX1ZBTFVFEAESEQoNSUdOT1JFX0FMV0FZUxADIgQIAhACKgxJR05PUkVfRU1QVFkqDklHTk9SRV9ERUZBVUxUKhdJR05PUkVfSUZfREVGQVVMVF9WQUxVRSoVSUdOT1JFX0lGX1VOUE9QVUxBVEVEKm4KCktub3duUmVnZXgSGwoXS05PV05fUkVHRVhfVU5TUEVDSUZJRUQQABIgChxLTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9OQU1FEAESIQodS05PV05fUkVHRVhfSFRUUF9IRUFERVJfVkFMVUUQAjpWCgdtZXNzYWdlEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGIcJIAEoCzIaLmJ1Zi52YWxpZGF0ZS5NZXNzYWdlUnVsZXNSB21lc3NhZ2U6TgoFb25lb2YSHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5PbmVvZlJ1bGVzUgVvbmVvZjpOCgVmaWVsZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYhwkgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXNSBWZpZWxkOl0KCnByZWRlZmluZWQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIgJIAEoCzIdLmJ1Zi52YWxpZGF0ZS5QcmVkZWZpbmVkUnVsZXNSCnByZWRlZmluZWRCbgoSYnVpbGQuYnVmLnZhbGlkYXRlQg1WYWxpZGF0ZVByb3RvUAFaR2J1Zi5idWlsZC9nZW4vZ28vYnVmYnVpbGQvcHJvdG92YWxpZGF0ZS9wcm90b2NvbGJ1ZmZlcnMvZ28vYnVmL3ZhbGlkYXRl\", [file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_timestamp]);\n\n/**\n * `Rule` represents a validation rule written in the Common Expression\n * Language (CEL) syntax. Each Rule includes a unique identifier, an\n * optional error message, and the CEL expression to evaluate. For more\n * information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message Foo {\n * option (buf.validate.message).cel = {\n * id: \"foo.bar\"\n * message: \"bar must be greater than 0\"\n * expression: \"this.bar > 0\"\n * };\n * int32 bar = 1;\n * }\n * ```\n *\n * @generated from message buf.validate.Rule\n */\nexport type Rule = Message<\"buf.validate.Rule\"> & {\n /**\n * `id` is a string that serves as a machine-readable name for this Rule.\n * It should be unique within its scope, which could be either a message or a field.\n *\n * @generated from field: optional string id = 1;\n */\n id: string;\n\n /**\n * `message` is an optional field that provides a human-readable error message\n * for this Rule when the CEL expression evaluates to false. If a\n * non-empty message is provided, any strings resulting from the CEL\n * expression evaluation are ignored.\n *\n * @generated from field: optional string message = 2;\n */\n message: string;\n\n /**\n * `expression` is the actual CEL expression that will be evaluated for\n * validation. This string must resolve to either a boolean or a string\n * value. If the expression evaluates to false or a non-empty string, the\n * validation is considered failed, and the message is rejected.\n *\n * @generated from field: optional string expression = 3;\n */\n expression: string;\n};\n\n/**\n * `Rule` represents a validation rule written in the Common Expression\n * Language (CEL) syntax. Each Rule includes a unique identifier, an\n * optional error message, and the CEL expression to evaluate. For more\n * information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message Foo {\n * option (buf.validate.message).cel = {\n * id: \"foo.bar\"\n * message: \"bar must be greater than 0\"\n * expression: \"this.bar > 0\"\n * };\n * int32 bar = 1;\n * }\n * ```\n *\n * @generated from message buf.validate.Rule\n */\nexport type RuleJson = {\n /**\n * `id` is a string that serves as a machine-readable name for this Rule.\n * It should be unique within its scope, which could be either a message or a field.\n *\n * @generated from field: optional string id = 1;\n */\n id?: string;\n\n /**\n * `message` is an optional field that provides a human-readable error message\n * for this Rule when the CEL expression evaluates to false. If a\n * non-empty message is provided, any strings resulting from the CEL\n * expression evaluation are ignored.\n *\n * @generated from field: optional string message = 2;\n */\n message?: string;\n\n /**\n * `expression` is the actual CEL expression that will be evaluated for\n * validation. This string must resolve to either a boolean or a string\n * value. If the expression evaluates to false or a non-empty string, the\n * validation is considered failed, and the message is rejected.\n *\n * @generated from field: optional string expression = 3;\n */\n expression?: string;\n};\n\n/**\n * Describes the message buf.validate.Rule.\n * Use `create(RuleSchema)` to create a new message.\n */\nexport const RuleSchema: GenMessage<Rule, {jsonType: RuleJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 0);\n\n/**\n * MessageRules represents validation rules that are applied to the entire message.\n * It includes disabling options and a list of Rule messages representing Common Expression Language (CEL) validation rules.\n *\n * @generated from message buf.validate.MessageRules\n */\nexport type MessageRules = Message<\"buf.validate.MessageRules\"> & {\n /**\n * `cel` is a repeated field of type Rule. Each Rule specifies a validation rule to be applied to this message.\n * These rules are written in Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n *\n * ```proto\n * message MyMessage {\n * // The field `foo` must be greater than 42.\n * option (buf.validate.message).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this.foo > 42\",\n * };\n * optional int32 foo = 1;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 3;\n */\n cel: Rule[];\n\n /**\n * `oneof` is a repeated field of type MessageOneofRule that specifies a list of fields\n * of which at most one can be present. If `required` is also specified, then exactly one\n * of the specified fields _must_ be present.\n *\n * This will enforce oneof-like constraints with a few features not provided by\n * actual Protobuf oneof declarations:\n * 1. Repeated and map fields are allowed in this validation. In a Protobuf oneof,\n * only scalar fields are allowed.\n * 2. Fields with implicit presence are allowed. In a Protobuf oneof, all member\n * fields have explicit presence. This means that, for the purpose of determining\n * how many fields are set, explicitly setting such a field to its zero value is\n * effectively the same as not setting it at all.\n * 3. This will always generate validation errors for a message unmarshalled from\n * serialized data that sets more than one field. With a Protobuf oneof, when\n * multiple fields are present in the serialized form, earlier values are usually\n * silently ignored when unmarshalling, with only the last field being set when\n * unmarshalling completes.\n *\n * Note that adding a field to a `oneof` will also set the IGNORE_IF_ZERO_VALUE on the fields. This means\n * only the field that is set will be validated and the unset fields are not validated according to the field rules.\n * This behavior can be overridden by setting `ignore` against a field.\n *\n * ```proto\n * message MyMessage {\n * // Only one of `field1` or `field2` _can_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field1\", \"field2\"] };\n * // Exactly one of `field3` or `field4` _must_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field3\", \"field4\"], required: true };\n * string field1 = 1;\n * bytes field2 = 2;\n * bool field3 = 3;\n * int32 field4 = 4;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.MessageOneofRule oneof = 4;\n */\n oneof: MessageOneofRule[];\n};\n\n/**\n * MessageRules represents validation rules that are applied to the entire message.\n * It includes disabling options and a list of Rule messages representing Common Expression Language (CEL) validation rules.\n *\n * @generated from message buf.validate.MessageRules\n */\nexport type MessageRulesJson = {\n /**\n * `cel` is a repeated field of type Rule. Each Rule specifies a validation rule to be applied to this message.\n * These rules are written in Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n *\n * ```proto\n * message MyMessage {\n * // The field `foo` must be greater than 42.\n * option (buf.validate.message).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this.foo > 42\",\n * };\n * optional int32 foo = 1;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 3;\n */\n cel?: RuleJson[];\n\n /**\n * `oneof` is a repeated field of type MessageOneofRule that specifies a list of fields\n * of which at most one can be present. If `required` is also specified, then exactly one\n * of the specified fields _must_ be present.\n *\n * This will enforce oneof-like constraints with a few features not provided by\n * actual Protobuf oneof declarations:\n * 1. Repeated and map fields are allowed in this validation. In a Protobuf oneof,\n * only scalar fields are allowed.\n * 2. Fields with implicit presence are allowed. In a Protobuf oneof, all member\n * fields have explicit presence. This means that, for the purpose of determining\n * how many fields are set, explicitly setting such a field to its zero value is\n * effectively the same as not setting it at all.\n * 3. This will always generate validation errors for a message unmarshalled from\n * serialized data that sets more than one field. With a Protobuf oneof, when\n * multiple fields are present in the serialized form, earlier values are usually\n * silently ignored when unmarshalling, with only the last field being set when\n * unmarshalling completes.\n *\n * Note that adding a field to a `oneof` will also set the IGNORE_IF_ZERO_VALUE on the fields. This means\n * only the field that is set will be validated and the unset fields are not validated according to the field rules.\n * This behavior can be overridden by setting `ignore` against a field.\n *\n * ```proto\n * message MyMessage {\n * // Only one of `field1` or `field2` _can_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field1\", \"field2\"] };\n * // Exactly one of `field3` or `field4` _must_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field3\", \"field4\"], required: true };\n * string field1 = 1;\n * bytes field2 = 2;\n * bool field3 = 3;\n * int32 field4 = 4;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.MessageOneofRule oneof = 4;\n */\n oneof?: MessageOneofRuleJson[];\n};\n\n/**\n * Describes the message buf.validate.MessageRules.\n * Use `create(MessageRulesSchema)` to create a new message.\n */\nexport const MessageRulesSchema: GenMessage<MessageRules, {jsonType: MessageRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 1);\n\n/**\n * @generated from message buf.validate.MessageOneofRule\n */\nexport type MessageOneofRule = Message<\"buf.validate.MessageOneofRule\"> & {\n /**\n * A list of field names to include in the oneof. All field names must be\n * defined in the message. At least one field must be specified, and\n * duplicates are not permitted.\n *\n * @generated from field: repeated string fields = 1;\n */\n fields: string[];\n\n /**\n * If true, one of the fields specified _must_ be set.\n *\n * @generated from field: optional bool required = 2;\n */\n required: boolean;\n};\n\n/**\n * @generated from message buf.validate.MessageOneofRule\n */\nexport type MessageOneofRuleJson = {\n /**\n * A list of field names to include in the oneof. All field names must be\n * defined in the message. At least one field must be specified, and\n * duplicates are not permitted.\n *\n * @generated from field: repeated string fields = 1;\n */\n fields?: string[];\n\n /**\n * If true, one of the fields specified _must_ be set.\n *\n * @generated from field: optional bool required = 2;\n */\n required?: boolean;\n};\n\n/**\n * Describes the message buf.validate.MessageOneofRule.\n * Use `create(MessageOneofRuleSchema)` to create a new message.\n */\nexport const MessageOneofRuleSchema: GenMessage<MessageOneofRule, {jsonType: MessageOneofRuleJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 2);\n\n/**\n * The `OneofRules` message type enables you to manage rules for\n * oneof fields in your protobuf messages.\n *\n * @generated from message buf.validate.OneofRules\n */\nexport type OneofRules = Message<\"buf.validate.OneofRules\"> & {\n /**\n * If `required` is true, exactly one field of the oneof must be set. A\n * validation error is returned if no fields in the oneof are set. Further rules\n * should be placed on the fields themselves to ensure they are valid values,\n * such as `min_len` or `gt`.\n *\n * ```proto\n * message MyMessage {\n * oneof value {\n * // Either `a` or `b` must be set. If `a` is set, it must also be\n * // non-empty; whereas if `b` is set, it can still be an empty string.\n * option (buf.validate.oneof).required = true;\n * string a = 1 [(buf.validate.field).string.min_len = 1];\n * string b = 2;\n * }\n * }\n * ```\n *\n * @generated from field: optional bool required = 1;\n */\n required: boolean;\n};\n\n/**\n * The `OneofRules` message type enables you to manage rules for\n * oneof fields in your protobuf messages.\n *\n * @generated from message buf.validate.OneofRules\n */\nexport type OneofRulesJson = {\n /**\n * If `required` is true, exactly one field of the oneof must be set. A\n * validation error is returned if no fields in the oneof are set. Further rules\n * should be placed on the fields themselves to ensure they are valid values,\n * such as `min_len` or `gt`.\n *\n * ```proto\n * message MyMessage {\n * oneof value {\n * // Either `a` or `b` must be set. If `a` is set, it must also be\n * // non-empty; whereas if `b` is set, it can still be an empty string.\n * option (buf.validate.oneof).required = true;\n * string a = 1 [(buf.validate.field).string.min_len = 1];\n * string b = 2;\n * }\n * }\n * ```\n *\n * @generated from field: optional bool required = 1;\n */\n required?: boolean;\n};\n\n/**\n * Describes the message buf.validate.OneofRules.\n * Use `create(OneofRulesSchema)` to create a new message.\n */\nexport const OneofRulesSchema: GenMessage<OneofRules, {jsonType: OneofRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 3);\n\n/**\n * FieldRules encapsulates the rules for each type of field. Depending on\n * the field, the correct set should be used to ensure proper validations.\n *\n * @generated from message buf.validate.FieldRules\n */\nexport type FieldRules = Message<\"buf.validate.FieldRules\"> & {\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.field).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 23;\n */\n cel: Rule[];\n\n /**\n * If `required` is true, the field must be set. A validation error is returned\n * if the field is not set.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithPresence {\n * // Requires any string to be set, including the empty string.\n * optional string link = 1 [\n * (buf.validate.field).required = true\n * ];\n * // Requires true or false to be set.\n * optional bool disabled = 2 [\n * (buf.validate.field).required = true\n * ];\n * // Requires a message to be set, including the empty message.\n * SomeMessage msg = 4 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * All fields in the example above track presence. By default, Protovalidate\n * ignores rules on those fields if no value is set. `required` ensures that\n * the fields are set and valid.\n *\n * Fields that don't track presence are always validated by Protovalidate,\n * whether they are set or not. It is not necessary to add `required`. It\n * can be added to indicate that the field cannot be the zero value.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithoutPresence {\n * // `string.email` always applies, even to an empty string.\n * string link = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * // `repeated.min_items` always applies, even to an empty list.\n * repeated string labels = 2 [\n * (buf.validate.field).repeated.min_items = 1\n * ];\n * // `required`, for fields that don't track presence, indicates\n * // the value of the field can't be the zero value.\n * int32 zero_value_not_allowed = 3 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * To learn which fields track presence, see the\n * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat).\n *\n * Note: While field rules can be applied to repeated items, map keys, and map\n * values, the elements are always considered to be set. Consequently,\n * specifying `repeated.items.required` is redundant.\n *\n * @generated from field: optional bool required = 25;\n */\n required: boolean;\n\n /**\n * Ignore validation rules on the field if its value matches the specified\n * criteria. See the `Ignore` enum for details.\n *\n * ```proto\n * message UpdateRequest {\n * // The uri rule only applies if the field is not an empty string.\n * string url = 1 [\n * (buf.validate.field).ignore = IGNORE_IF_ZERO_VALUE,\n * (buf.validate.field).string.uri = true\n * ];\n * }\n * ```\n *\n * @generated from field: optional buf.validate.Ignore ignore = 27;\n */\n ignore: Ignore;\n\n /**\n * @generated from oneof buf.validate.FieldRules.type\n */\n type: {\n /**\n * Scalar Field Types\n *\n * @generated from field: buf.validate.FloatRules float = 1;\n */\n value: FloatRules;\n case: \"float\";\n } | {\n /**\n * @generated from field: buf.validate.DoubleRules double = 2;\n */\n value: DoubleRules;\n case: \"double\";\n } | {\n /**\n * @generated from field: buf.validate.Int32Rules int32 = 3;\n */\n value: Int32Rules;\n case: \"int32\";\n } | {\n /**\n * @generated from field: buf.validate.Int64Rules int64 = 4;\n */\n value: Int64Rules;\n case: \"int64\";\n } | {\n /**\n * @generated from field: buf.validate.UInt32Rules uint32 = 5;\n */\n value: UInt32Rules;\n case: \"uint32\";\n } | {\n /**\n * @generated from field: buf.validate.UInt64Rules uint64 = 6;\n */\n value: UInt64Rules;\n case: \"uint64\";\n } | {\n /**\n * @generated from field: buf.validate.SInt32Rules sint32 = 7;\n */\n value: SInt32Rules;\n case: \"sint32\";\n } | {\n /**\n * @generated from field: buf.validate.SInt64Rules sint64 = 8;\n */\n value: SInt64Rules;\n case: \"sint64\";\n } | {\n /**\n * @generated from field: buf.validate.Fixed32Rules fixed32 = 9;\n */\n value: Fixed32Rules;\n case: \"fixed32\";\n } | {\n /**\n * @generated from field: buf.validate.Fixed64Rules fixed64 = 10;\n */\n value: Fixed64Rules;\n case: \"fixed64\";\n } | {\n /**\n * @generated from field: buf.validate.SFixed32Rules sfixed32 = 11;\n */\n value: SFixed32Rules;\n case: \"sfixed32\";\n } | {\n /**\n * @generated from field: buf.validate.SFixed64Rules sfixed64 = 12;\n */\n value: SFixed64Rules;\n case: \"sfixed64\";\n } | {\n /**\n * @generated from field: buf.validate.BoolRules bool = 13;\n */\n value: BoolRules;\n case: \"bool\";\n } | {\n /**\n * @generated from field: buf.validate.StringRules string = 14;\n */\n value: StringRules;\n case: \"string\";\n } | {\n /**\n * @generated from field: buf.validate.BytesRules bytes = 15;\n */\n value: BytesRules;\n case: \"bytes\";\n } | {\n /**\n * Complex Field Types\n *\n * @generated from field: buf.validate.EnumRules enum = 16;\n */\n value: EnumRules;\n case: \"enum\";\n } | {\n /**\n * @generated from field: buf.validate.RepeatedRules repeated = 18;\n */\n value: RepeatedRules;\n case: \"repeated\";\n } | {\n /**\n * @generated from field: buf.validate.MapRules map = 19;\n */\n value: MapRules;\n case: \"map\";\n } | {\n /**\n * Well-Known Field Types\n *\n * @generated from field: buf.validate.AnyRules any = 20;\n */\n value: AnyRules;\n case: \"any\";\n } | {\n /**\n * @generated from field: buf.validate.DurationRules duration = 21;\n */\n value: DurationRules;\n case: \"duration\";\n } | {\n /**\n * @generated from field: buf.validate.TimestampRules timestamp = 22;\n */\n value: TimestampRules;\n case: \"timestamp\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * FieldRules encapsulates the rules for each type of field. Depending on\n * the field, the correct set should be used to ensure proper validations.\n *\n * @generated from message buf.validate.FieldRules\n */\nexport type FieldRulesJson = {\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.field).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 23;\n */\n cel?: RuleJson[];\n\n /**\n * If `required` is true, the field must be set. A validation error is returned\n * if the field is not set.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithPresence {\n * // Requires any string to be set, including the empty string.\n * optional string link = 1 [\n * (buf.validate.field).required = true\n * ];\n * // Requires true or false to be set.\n * optional bool disabled = 2 [\n * (buf.validate.field).required = true\n * ];\n * // Requires a message to be set, including the empty message.\n * SomeMessage msg = 4 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * All fields in the example above track presence. By default, Protovalidate\n * ignores rules on those fields if no value is set. `required` ensures that\n * the fields are set and valid.\n *\n * Fields that don't track presence are always validated by Protovalidate,\n * whether they are set or not. It is not necessary to add `required`. It\n * can be added to indicate that the field cannot be the zero value.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithoutPresence {\n * // `string.email` always applies, even to an empty string.\n * string link = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * // `repeated.min_items` always applies, even to an empty list.\n * repeated string labels = 2 [\n * (buf.validate.field).repeated.min_items = 1\n * ];\n * // `required`, for fields that don't track presence, indicates\n * // the value of the field can't be the zero value.\n * int32 zero_value_not_allowed = 3 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * To learn which fields track presence, see the\n * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat).\n *\n * Note: While field rules can be applied to repeated items, map keys, and map\n * values, the elements are always considered to be set. Consequently,\n * specifying `repeated.items.required` is redundant.\n *\n * @generated from field: optional bool required = 25;\n */\n required?: boolean;\n\n /**\n * Ignore validation rules on the field if its value matches the specified\n * criteria. See the `Ignore` enum for details.\n *\n * ```proto\n * message UpdateRequest {\n * // The uri rule only applies if the field is not an empty string.\n * string url = 1 [\n * (buf.validate.field).ignore = IGNORE_IF_ZERO_VALUE,\n * (buf.validate.field).string.uri = true\n * ];\n * }\n * ```\n *\n * @generated from field: optional buf.validate.Ignore ignore = 27;\n */\n ignore?: IgnoreJson;\n\n /**\n * Scalar Field Types\n *\n * @generated from field: buf.validate.FloatRules float = 1;\n */\n float?: FloatRulesJson;\n\n /**\n * @generated from field: buf.validate.DoubleRules double = 2;\n */\n double?: DoubleRulesJson;\n\n /**\n * @generated from field: buf.validate.Int32Rules int32 = 3;\n */\n int32?: Int32RulesJson;\n\n /**\n * @generated from field: buf.validate.Int64Rules int64 = 4;\n */\n int64?: Int64RulesJson;\n\n /**\n * @generated from field: buf.validate.UInt32Rules uint32 = 5;\n */\n uint32?: UInt32RulesJson;\n\n /**\n * @generated from field: buf.validate.UInt64Rules uint64 = 6;\n */\n uint64?: UInt64RulesJson;\n\n /**\n * @generated from field: buf.validate.SInt32Rules sint32 = 7;\n */\n sint32?: SInt32RulesJson;\n\n /**\n * @generated from field: buf.validate.SInt64Rules sint64 = 8;\n */\n sint64?: SInt64RulesJson;\n\n /**\n * @generated from field: buf.validate.Fixed32Rules fixed32 = 9;\n */\n fixed32?: Fixed32RulesJson;\n\n /**\n * @generated from field: buf.validate.Fixed64Rules fixed64 = 10;\n */\n fixed64?: Fixed64RulesJson;\n\n /**\n * @generated from field: buf.validate.SFixed32Rules sfixed32 = 11;\n */\n sfixed32?: SFixed32RulesJson;\n\n /**\n * @generated from field: buf.validate.SFixed64Rules sfixed64 = 12;\n */\n sfixed64?: SFixed64RulesJson;\n\n /**\n * @generated from field: buf.validate.BoolRules bool = 13;\n */\n bool?: BoolRulesJson;\n\n /**\n * @generated from field: buf.validate.StringRules string = 14;\n */\n string?: StringRulesJson;\n\n /**\n * @generated from field: buf.validate.BytesRules bytes = 15;\n */\n bytes?: BytesRulesJson;\n\n /**\n * Complex Field Types\n *\n * @generated from field: buf.validate.EnumRules enum = 16;\n */\n enum?: EnumRulesJson;\n\n /**\n * @generated from field: buf.validate.RepeatedRules repeated = 18;\n */\n repeated?: RepeatedRulesJson;\n\n /**\n * @generated from field: buf.validate.MapRules map = 19;\n */\n map?: MapRulesJson;\n\n /**\n * Well-Known Field Types\n *\n * @generated from field: buf.validate.AnyRules any = 20;\n */\n any?: AnyRulesJson;\n\n /**\n * @generated from field: buf.validate.DurationRules duration = 21;\n */\n duration?: DurationRulesJson;\n\n /**\n * @generated from field: buf.validate.TimestampRules timestamp = 22;\n */\n timestamp?: TimestampRulesJson;\n};\n\n/**\n * Describes the message buf.validate.FieldRules.\n * Use `create(FieldRulesSchema)` to create a new message.\n */\nexport const FieldRulesSchema: GenMessage<FieldRules, {jsonType: FieldRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 4);\n\n/**\n * PredefinedRules are custom rules that can be re-used with\n * multiple fields.\n *\n * @generated from message buf.validate.PredefinedRules\n */\nexport type PredefinedRules = Message<\"buf.validate.PredefinedRules\"> & {\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/predefined-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.predefined).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 1;\n */\n cel: Rule[];\n};\n\n/**\n * PredefinedRules are custom rules that can be re-used with\n * multiple fields.\n *\n * @generated from message buf.validate.PredefinedRules\n */\nexport type PredefinedRulesJson = {\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/predefined-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.predefined).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 1;\n */\n cel?: RuleJson[];\n};\n\n/**\n * Describes the message buf.validate.PredefinedRules.\n * Use `create(PredefinedRulesSchema)` to create a new message.\n */\nexport const PredefinedRulesSchema: GenMessage<PredefinedRules, {jsonType: PredefinedRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 5);\n\n/**\n * FloatRules describes the rules applied to `float` values. These\n * rules may also be applied to the `google.protobuf.FloatValue` Well-Known-Type.\n *\n * @generated from message buf.validate.FloatRules\n */\nexport type FloatRules = Message<\"buf.validate.FloatRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must equal 42.0\n * float value = 1 [(buf.validate.field).float.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional float const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.FloatRules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be less than 10.0\n * float value = 1 [(buf.validate.field).float.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: float lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be less than or equal to 10.0\n * float value = 1 [(buf.validate.field).float.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: float lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.FloatRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be greater than 5.0 [float.gt]\n * float value = 1 [(buf.validate.field).float.gt = 5.0];\n *\n * // value must be greater than 5 and less than 10.0 [float.gt_lt]\n * float other_value = 2 [(buf.validate.field).float = { gt: 5.0, lt: 10.0 }];\n *\n * // value must be greater than 10 or less than 5.0 [float.gt_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be greater than or equal to 5.0 [float.gte]\n * float value = 1 [(buf.validate.field).float.gte = 5.0];\n *\n * // value must be greater than or equal to 5.0 and less than 10.0 [float.gte_lt]\n * float other_value = 2 [(buf.validate.field).float = { gte: 5.0, lt: 10.0 }];\n *\n * // value must be greater than or equal to 10.0 or less than 5.0 [float.gte_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float in = 6;\n */\n in: number[];\n\n /**\n * `in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must not be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float not_in = 7;\n */\n notIn: number[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFloat {\n * float value = 1 [\n * (buf.validate.field).float.example = 1.0,\n * (buf.validate.field).float.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated float example = 9;\n */\n example: number[];\n};\n\n/**\n * FloatRules describes the rules applied to `float` values. These\n * rules may also be applied to the `google.protobuf.FloatValue` Well-Known-Type.\n *\n * @generated from message buf.validate.FloatRules\n */\nexport type FloatRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must equal 42.0\n * float value = 1 [(buf.validate.field).float.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional float const = 1;\n */\n const?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be less than 10.0\n * float value = 1 [(buf.validate.field).float.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: float lt = 2;\n */\n lt?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be less than or equal to 10.0\n * float value = 1 [(buf.validate.field).float.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: float lte = 3;\n */\n lte?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be greater than 5.0 [float.gt]\n * float value = 1 [(buf.validate.field).float.gt = 5.0];\n *\n * // value must be greater than 5 and less than 10.0 [float.gt_lt]\n * float other_value = 2 [(buf.validate.field).float = { gt: 5.0, lt: 10.0 }];\n *\n * // value must be greater than 10 or less than 5.0 [float.gt_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gt = 4;\n */\n gt?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be greater than or equal to 5.0 [float.gte]\n * float value = 1 [(buf.validate.field).float.gte = 5.0];\n *\n * // value must be greater than or equal to 5.0 and less than 10.0 [float.gte_lt]\n * float other_value = 2 [(buf.validate.field).float = { gte: 5.0, lt: 10.0 }];\n *\n * // value must be greater than or equal to 10.0 or less than 5.0 [float.gte_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gte = 5;\n */\n gte?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float in = 6;\n */\n in?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n\n /**\n * `in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must not be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float not_in = 7;\n */\n notIn?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFloat {\n * float value = 1 [\n * (buf.validate.field).float.example = 1.0,\n * (buf.validate.field).float.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated float example = 9;\n */\n example?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n};\n\n/**\n * Describes the message buf.validate.FloatRules.\n * Use `create(FloatRulesSchema)` to create a new message.\n */\nexport const FloatRulesSchema: GenMessage<FloatRules, {jsonType: FloatRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 6);\n\n/**\n * DoubleRules describes the rules applied to `double` values. These\n * rules may also be applied to the `google.protobuf.DoubleValue` Well-Known-Type.\n *\n * @generated from message buf.validate.DoubleRules\n */\nexport type DoubleRules = Message<\"buf.validate.DoubleRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must equal 42.0\n * double value = 1 [(buf.validate.field).double.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional double const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.DoubleRules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be less than 10.0\n * double value = 1 [(buf.validate.field).double.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: double lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified value\n * (field <= value). If the field value is greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be less than or equal to 10.0\n * double value = 1 [(buf.validate.field).double.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: double lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.DoubleRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or `lte`,\n * the range is reversed, and the field value must be outside the specified\n * range. If the field value doesn't meet the required conditions, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be greater than 5.0 [double.gt]\n * double value = 1 [(buf.validate.field).double.gt = 5.0];\n *\n * // value must be greater than 5 and less than 10.0 [double.gt_lt]\n * double other_value = 2 [(buf.validate.field).double = { gt: 5.0, lt: 10.0 }];\n *\n * // value must be greater than 10 or less than 5.0 [double.gt_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be greater than or equal to 5.0 [double.gte]\n * double value = 1 [(buf.validate.field).double.gte = 5.0];\n *\n * // value must be greater than or equal to 5.0 and less than 10.0 [double.gte_lt]\n * double other_value = 2 [(buf.validate.field).double = { gte: 5.0, lt: 10.0 }];\n *\n * // value must be greater than or equal to 10.0 or less than 5.0 [double.gte_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must not be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double not_in = 7;\n */\n notIn: number[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDouble {\n * double value = 1 [\n * (buf.validate.field).double.example = 1.0,\n * (buf.validate.field).double.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated double example = 9;\n */\n example: number[];\n};\n\n/**\n * DoubleRules describes the rules applied to `double` values. These\n * rules may also be applied to the `google.protobuf.DoubleValue` Well-Known-Type.\n *\n * @generated from message buf.validate.DoubleRules\n */\nexport type DoubleRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must equal 42.0\n * double value = 1 [(buf.validate.field).double.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional double const = 1;\n */\n const?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be less than 10.0\n * double value = 1 [(buf.validate.field).double.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: double lt = 2;\n */\n lt?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `lte` requires the field value to be less than or equal to the specified value\n * (field <= value). If the field value is greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be less than or equal to 10.0\n * double value = 1 [(buf.validate.field).double.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: double lte = 3;\n */\n lte?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or `lte`,\n * the range is reversed, and the field value must be outside the specified\n * range. If the field value doesn't meet the required conditions, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be greater than 5.0 [double.gt]\n * double value = 1 [(buf.validate.field).double.gt = 5.0];\n *\n * // value must be greater than 5 and less than 10.0 [double.gt_lt]\n * double other_value = 2 [(buf.validate.field).double = { gt: 5.0, lt: 10.0 }];\n *\n * // value must be greater than 10 or less than 5.0 [double.gt_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gt = 4;\n */\n gt?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be greater than or equal to 5.0 [double.gte]\n * double value = 1 [(buf.validate.field).double.gte = 5.0];\n *\n * // value must be greater than or equal to 5.0 and less than 10.0 [double.gte_lt]\n * double other_value = 2 [(buf.validate.field).double = { gte: 5.0, lt: 10.0 }];\n *\n * // value must be greater than or equal to 10.0 or less than 5.0 [double.gte_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gte = 5;\n */\n gte?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double in = 6;\n */\n in?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must not be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double not_in = 7;\n */\n notIn?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDouble {\n * double value = 1 [\n * (buf.validate.field).double.example = 1.0,\n * (buf.validate.field).double.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated double example = 9;\n */\n example?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n};\n\n/**\n * Describes the message buf.validate.DoubleRules.\n * Use `create(DoubleRulesSchema)` to create a new message.\n */\nexport const DoubleRulesSchema: GenMessage<DoubleRules, {jsonType: DoubleRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 7);\n\n/**\n * Int32Rules describes the rules applied to `int32` values. These\n * rules may also be applied to the `google.protobuf.Int32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int32Rules\n */\nexport type Int32Rules = Message<\"buf.validate.Int32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must equal 42\n * int32 value = 1 [(buf.validate.field).int32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.Int32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be less than 10\n * int32 value = 1 [(buf.validate.field).int32.lt = 10];\n * }\n * ```\n *\n * @generated from field: int32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be less than or equal to 10\n * int32 value = 1 [(buf.validate.field).int32.lte = 10];\n * }\n * ```\n *\n * @generated from field: int32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Int32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be greater than 5 [int32.gt]\n * int32 value = 1 [(buf.validate.field).int32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [int32.gt_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [int32.gt_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified value\n * (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be greater than or equal to 5 [int32.gte]\n * int32 value = 1 [(buf.validate.field).int32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [int32.gte_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [int32.gte_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must not be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt32 {\n * int32 value = 1 [\n * (buf.validate.field).int32.example = 1,\n * (buf.validate.field).int32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 8;\n */\n example: number[];\n};\n\n/**\n * Int32Rules describes the rules applied to `int32` values. These\n * rules may also be applied to the `google.protobuf.Int32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int32Rules\n */\nexport type Int32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must equal 42\n * int32 value = 1 [(buf.validate.field).int32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be less than 10\n * int32 value = 1 [(buf.validate.field).int32.lt = 10];\n * }\n * ```\n *\n * @generated from field: int32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be less than or equal to 10\n * int32 value = 1 [(buf.validate.field).int32.lte = 10];\n * }\n * ```\n *\n * @generated from field: int32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be greater than 5 [int32.gt]\n * int32 value = 1 [(buf.validate.field).int32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [int32.gt_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [int32.gt_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified value\n * (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be greater than or equal to 5 [int32.gte]\n * int32 value = 1 [(buf.validate.field).int32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [int32.gte_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [int32.gte_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must not be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt32 {\n * int32 value = 1 [\n * (buf.validate.field).int32.example = 1,\n * (buf.validate.field).int32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.Int32Rules.\n * Use `create(Int32RulesSchema)` to create a new message.\n */\nexport const Int32RulesSchema: GenMessage<Int32Rules, {jsonType: Int32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 8);\n\n/**\n * Int64Rules describes the rules applied to `int64` values. These\n * rules may also be applied to the `google.protobuf.Int64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int64Rules\n */\nexport type Int64Rules = Message<\"buf.validate.Int64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must equal 42\n * int64 value = 1 [(buf.validate.field).int64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.Int64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be less than 10\n * int64 value = 1 [(buf.validate.field).int64.lt = 10];\n * }\n * ```\n *\n * @generated from field: int64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be less than or equal to 10\n * int64 value = 1 [(buf.validate.field).int64.lte = 10];\n * }\n * ```\n *\n * @generated from field: int64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Int64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be greater than 5 [int64.gt]\n * int64 value = 1 [(buf.validate.field).int64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [int64.gt_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [int64.gt_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be greater than or equal to 5 [int64.gte]\n * int64 value = 1 [(buf.validate.field).int64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [int64.gte_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [int64.gte_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must not be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt64 {\n * int64 value = 1 [\n * (buf.validate.field).int64.example = 1,\n * (buf.validate.field).int64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int64 example = 9;\n */\n example: bigint[];\n};\n\n/**\n * Int64Rules describes the rules applied to `int64` values. These\n * rules may also be applied to the `google.protobuf.Int64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int64Rules\n */\nexport type Int64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must equal 42\n * int64 value = 1 [(buf.validate.field).int64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be less than 10\n * int64 value = 1 [(buf.validate.field).int64.lt = 10];\n * }\n * ```\n *\n * @generated from field: int64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be less than or equal to 10\n * int64 value = 1 [(buf.validate.field).int64.lte = 10];\n * }\n * ```\n *\n * @generated from field: int64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be greater than 5 [int64.gt]\n * int64 value = 1 [(buf.validate.field).int64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [int64.gt_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [int64.gt_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be greater than or equal to 5 [int64.gte]\n * int64 value = 1 [(buf.validate.field).int64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [int64.gte_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [int64.gte_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must not be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt64 {\n * int64 value = 1 [\n * (buf.validate.field).int64.example = 1,\n * (buf.validate.field).int64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int64 example = 9;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.Int64Rules.\n * Use `create(Int64RulesSchema)` to create a new message.\n */\nexport const Int64RulesSchema: GenMessage<Int64Rules, {jsonType: Int64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 9);\n\n/**\n * UInt32Rules describes the rules applied to `uint32` values. These\n * rules may also be applied to the `google.protobuf.UInt32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt32Rules\n */\nexport type UInt32Rules = Message<\"buf.validate.UInt32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must equal 42\n * uint32 value = 1 [(buf.validate.field).uint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.UInt32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be less than 10\n * uint32 value = 1 [(buf.validate.field).uint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be less than or equal to 10\n * uint32 value = 1 [(buf.validate.field).uint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.UInt32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be greater than 5 [uint32.gt]\n * uint32 value = 1 [(buf.validate.field).uint32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [uint32.gt_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [uint32.gt_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be greater than or equal to 5 [uint32.gte]\n * uint32 value = 1 [(buf.validate.field).uint32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [uint32.gte_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [uint32.gte_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must not be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt32 {\n * uint32 value = 1 [\n * (buf.validate.field).uint32.example = 1,\n * (buf.validate.field).uint32.example = 10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint32 example = 8;\n */\n example: number[];\n};\n\n/**\n * UInt32Rules describes the rules applied to `uint32` values. These\n * rules may also be applied to the `google.protobuf.UInt32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt32Rules\n */\nexport type UInt32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must equal 42\n * uint32 value = 1 [(buf.validate.field).uint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be less than 10\n * uint32 value = 1 [(buf.validate.field).uint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be less than or equal to 10\n * uint32 value = 1 [(buf.validate.field).uint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be greater than 5 [uint32.gt]\n * uint32 value = 1 [(buf.validate.field).uint32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [uint32.gt_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [uint32.gt_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be greater than or equal to 5 [uint32.gte]\n * uint32 value = 1 [(buf.validate.field).uint32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [uint32.gte_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [uint32.gte_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must not be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt32 {\n * uint32 value = 1 [\n * (buf.validate.field).uint32.example = 1,\n * (buf.validate.field).uint32.example = 10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.UInt32Rules.\n * Use `create(UInt32RulesSchema)` to create a new message.\n */\nexport const UInt32RulesSchema: GenMessage<UInt32Rules, {jsonType: UInt32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 10);\n\n/**\n * UInt64Rules describes the rules applied to `uint64` values. These\n * rules may also be applied to the `google.protobuf.UInt64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt64Rules\n */\nexport type UInt64Rules = Message<\"buf.validate.UInt64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must equal 42\n * uint64 value = 1 [(buf.validate.field).uint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.UInt64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be less than 10\n * uint64 value = 1 [(buf.validate.field).uint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be less than or equal to 10\n * uint64 value = 1 [(buf.validate.field).uint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.UInt64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be greater than 5 [uint64.gt]\n * uint64 value = 1 [(buf.validate.field).uint64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [uint64.gt_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [uint64.gt_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be greater than or equal to 5 [uint64.gte]\n * uint64 value = 1 [(buf.validate.field).uint64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [uint64.gte_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [uint64.gte_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must not be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt64 {\n * uint64 value = 1 [\n * (buf.validate.field).uint64.example = 1,\n * (buf.validate.field).uint64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * UInt64Rules describes the rules applied to `uint64` values. These\n * rules may also be applied to the `google.protobuf.UInt64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt64Rules\n */\nexport type UInt64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must equal 42\n * uint64 value = 1 [(buf.validate.field).uint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be less than 10\n * uint64 value = 1 [(buf.validate.field).uint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be less than or equal to 10\n * uint64 value = 1 [(buf.validate.field).uint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be greater than 5 [uint64.gt]\n * uint64 value = 1 [(buf.validate.field).uint64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [uint64.gt_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [uint64.gt_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be greater than or equal to 5 [uint64.gte]\n * uint64 value = 1 [(buf.validate.field).uint64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [uint64.gte_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [uint64.gte_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must not be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt64 {\n * uint64 value = 1 [\n * (buf.validate.field).uint64.example = 1,\n * (buf.validate.field).uint64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint64 example = 8;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.UInt64Rules.\n * Use `create(UInt64RulesSchema)` to create a new message.\n */\nexport const UInt64RulesSchema: GenMessage<UInt64Rules, {jsonType: UInt64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 11);\n\n/**\n * SInt32Rules describes the rules applied to `sint32` values.\n *\n * @generated from message buf.validate.SInt32Rules\n */\nexport type SInt32Rules = Message<\"buf.validate.SInt32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must equal 42\n * sint32 value = 1 [(buf.validate.field).sint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.SInt32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be less than 10\n * sint32 value = 1 [(buf.validate.field).sint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be less than or equal to 10\n * sint32 value = 1 [(buf.validate.field).sint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SInt32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be greater than 5 [sint32.gt]\n * sint32 value = 1 [(buf.validate.field).sint32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sint32.gt_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sint32.gt_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be greater than or equal to 5 [sint32.gte]\n * sint32 value = 1 [(buf.validate.field).sint32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sint32.gte_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sint32.gte_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must not be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt32 {\n * sint32 value = 1 [\n * (buf.validate.field).sint32.example = 1,\n * (buf.validate.field).sint32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint32 example = 8;\n */\n example: number[];\n};\n\n/**\n * SInt32Rules describes the rules applied to `sint32` values.\n *\n * @generated from message buf.validate.SInt32Rules\n */\nexport type SInt32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must equal 42\n * sint32 value = 1 [(buf.validate.field).sint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be less than 10\n * sint32 value = 1 [(buf.validate.field).sint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be less than or equal to 10\n * sint32 value = 1 [(buf.validate.field).sint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be greater than 5 [sint32.gt]\n * sint32 value = 1 [(buf.validate.field).sint32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sint32.gt_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sint32.gt_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be greater than or equal to 5 [sint32.gte]\n * sint32 value = 1 [(buf.validate.field).sint32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sint32.gte_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sint32.gte_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must not be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt32 {\n * sint32 value = 1 [\n * (buf.validate.field).sint32.example = 1,\n * (buf.validate.field).sint32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.SInt32Rules.\n * Use `create(SInt32RulesSchema)` to create a new message.\n */\nexport const SInt32RulesSchema: GenMessage<SInt32Rules, {jsonType: SInt32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 12);\n\n/**\n * SInt64Rules describes the rules applied to `sint64` values.\n *\n * @generated from message buf.validate.SInt64Rules\n */\nexport type SInt64Rules = Message<\"buf.validate.SInt64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must equal 42\n * sint64 value = 1 [(buf.validate.field).sint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.SInt64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be less than 10\n * sint64 value = 1 [(buf.validate.field).sint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be less than or equal to 10\n * sint64 value = 1 [(buf.validate.field).sint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SInt64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be greater than 5 [sint64.gt]\n * sint64 value = 1 [(buf.validate.field).sint64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sint64.gt_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sint64.gt_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be greater than or equal to 5 [sint64.gte]\n * sint64 value = 1 [(buf.validate.field).sint64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sint64.gte_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sint64.gte_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must not be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt64 {\n * sint64 value = 1 [\n * (buf.validate.field).sint64.example = 1,\n * (buf.validate.field).sint64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * SInt64Rules describes the rules applied to `sint64` values.\n *\n * @generated from message buf.validate.SInt64Rules\n */\nexport type SInt64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must equal 42\n * sint64 value = 1 [(buf.validate.field).sint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be less than 10\n * sint64 value = 1 [(buf.validate.field).sint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be less than or equal to 10\n * sint64 value = 1 [(buf.validate.field).sint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be greater than 5 [sint64.gt]\n * sint64 value = 1 [(buf.validate.field).sint64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sint64.gt_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sint64.gt_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be greater than or equal to 5 [sint64.gte]\n * sint64 value = 1 [(buf.validate.field).sint64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sint64.gte_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sint64.gte_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must not be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt64 {\n * sint64 value = 1 [\n * (buf.validate.field).sint64.example = 1,\n * (buf.validate.field).sint64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint64 example = 8;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.SInt64Rules.\n * Use `create(SInt64RulesSchema)` to create a new message.\n */\nexport const SInt64RulesSchema: GenMessage<SInt64Rules, {jsonType: SInt64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 13);\n\n/**\n * Fixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.Fixed32Rules\n */\nexport type Fixed32Rules = Message<\"buf.validate.Fixed32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must equal 42\n * fixed32 value = 1 [(buf.validate.field).fixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.Fixed32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be less than 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be less than or equal to 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Fixed32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be greater than 5 [fixed32.gt]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [fixed32.gt_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [fixed32.gt_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be greater than or equal to 5 [fixed32.gte]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [fixed32.gte_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [fixed32.gte_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must not be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed32 {\n * fixed32 value = 1 [\n * (buf.validate.field).fixed32.example = 1,\n * (buf.validate.field).fixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 example = 8;\n */\n example: number[];\n};\n\n/**\n * Fixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.Fixed32Rules\n */\nexport type Fixed32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must equal 42\n * fixed32 value = 1 [(buf.validate.field).fixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be less than 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be less than or equal to 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be greater than 5 [fixed32.gt]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [fixed32.gt_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [fixed32.gt_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be greater than or equal to 5 [fixed32.gte]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [fixed32.gte_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [fixed32.gte_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must not be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed32 {\n * fixed32 value = 1 [\n * (buf.validate.field).fixed32.example = 1,\n * (buf.validate.field).fixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.Fixed32Rules.\n * Use `create(Fixed32RulesSchema)` to create a new message.\n */\nexport const Fixed32RulesSchema: GenMessage<Fixed32Rules, {jsonType: Fixed32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 14);\n\n/**\n * Fixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.Fixed64Rules\n */\nexport type Fixed64Rules = Message<\"buf.validate.Fixed64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must equal 42\n * fixed64 value = 1 [(buf.validate.field).fixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.Fixed64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be less than 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be less than or equal to 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Fixed64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be greater than 5 [fixed64.gt]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [fixed64.gt_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [fixed64.gt_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be greater than or equal to 5 [fixed64.gte]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [fixed64.gte_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [fixed64.gte_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must not be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed64 {\n * fixed64 value = 1 [\n * (buf.validate.field).fixed64.example = 1,\n * (buf.validate.field).fixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * Fixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.Fixed64Rules\n */\nexport type Fixed64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must equal 42\n * fixed64 value = 1 [(buf.validate.field).fixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be less than 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be less than or equal to 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be greater than 5 [fixed64.gt]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [fixed64.gt_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [fixed64.gt_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be greater than or equal to 5 [fixed64.gte]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [fixed64.gte_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [fixed64.gte_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must not be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed64 {\n * fixed64 value = 1 [\n * (buf.validate.field).fixed64.example = 1,\n * (buf.validate.field).fixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 example = 8;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.Fixed64Rules.\n * Use `create(Fixed64RulesSchema)` to create a new message.\n */\nexport const Fixed64RulesSchema: GenMessage<Fixed64Rules, {jsonType: Fixed64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 15);\n\n/**\n * SFixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.SFixed32Rules\n */\nexport type SFixed32Rules = Message<\"buf.validate.SFixed32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must equal 42\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.SFixed32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be less than 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be less than or equal to 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SFixed32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be greater than 5 [sfixed32.gt]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sfixed32.gt_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sfixed32.gt_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be greater than or equal to 5 [sfixed32.gte]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sfixed32.gte_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sfixed32.gte_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must not be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed32 {\n * sfixed32 value = 1 [\n * (buf.validate.field).sfixed32.example = 1,\n * (buf.validate.field).sfixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 example = 8;\n */\n example: number[];\n};\n\n/**\n * SFixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.SFixed32Rules\n */\nexport type SFixed32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must equal 42\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be less than 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be less than or equal to 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be greater than 5 [sfixed32.gt]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sfixed32.gt_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sfixed32.gt_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be greater than or equal to 5 [sfixed32.gte]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sfixed32.gte_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sfixed32.gte_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must not be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed32 {\n * sfixed32 value = 1 [\n * (buf.validate.field).sfixed32.example = 1,\n * (buf.validate.field).sfixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.SFixed32Rules.\n * Use `create(SFixed32RulesSchema)` to create a new message.\n */\nexport const SFixed32RulesSchema: GenMessage<SFixed32Rules, {jsonType: SFixed32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 16);\n\n/**\n * SFixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.SFixed64Rules\n */\nexport type SFixed64Rules = Message<\"buf.validate.SFixed64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must equal 42\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.SFixed64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be less than 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be less than or equal to 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SFixed64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be greater than 5 [sfixed64.gt]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sfixed64.gt_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sfixed64.gt_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be greater than or equal to 5 [sfixed64.gte]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sfixed64.gte_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sfixed64.gte_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must not be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed64 {\n * sfixed64 value = 1 [\n * (buf.validate.field).sfixed64.example = 1,\n * (buf.validate.field).sfixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * SFixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.SFixed64Rules\n */\nexport type SFixed64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must equal 42\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be less than 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be less than or equal to 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be greater than 5 [sfixed64.gt]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sfixed64.gt_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sfixed64.gt_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be greater than or equal to 5 [sfixed64.gte]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sfixed64.gte_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sfixed64.gte_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must not be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed64 {\n * sfixed64 value = 1 [\n * (buf.validate.field).sfixed64.example = 1,\n * (buf.validate.field).sfixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 example = 8;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.SFixed64Rules.\n * Use `create(SFixed64RulesSchema)` to create a new message.\n */\nexport const SFixed64RulesSchema: GenMessage<SFixed64Rules, {jsonType: SFixed64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 17);\n\n/**\n * BoolRules describes the rules applied to `bool` values. These rules\n * may also be applied to the `google.protobuf.BoolValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BoolRules\n */\nexport type BoolRules = Message<\"buf.validate.BoolRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified boolean value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBool {\n * // value must equal true\n * bool value = 1 [(buf.validate.field).bool.const = true];\n * }\n * ```\n *\n * @generated from field: optional bool const = 1;\n */\n const: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBool {\n * bool value = 1 [\n * (buf.validate.field).bool.example = 1,\n * (buf.validate.field).bool.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bool example = 2;\n */\n example: boolean[];\n};\n\n/**\n * BoolRules describes the rules applied to `bool` values. These rules\n * may also be applied to the `google.protobuf.BoolValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BoolRules\n */\nexport type BoolRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified boolean value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBool {\n * // value must equal true\n * bool value = 1 [(buf.validate.field).bool.const = true];\n * }\n * ```\n *\n * @generated from field: optional bool const = 1;\n */\n const?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBool {\n * bool value = 1 [\n * (buf.validate.field).bool.example = 1,\n * (buf.validate.field).bool.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bool example = 2;\n */\n example?: boolean[];\n};\n\n/**\n * Describes the message buf.validate.BoolRules.\n * Use `create(BoolRulesSchema)` to create a new message.\n */\nexport const BoolRulesSchema: GenMessage<BoolRules, {jsonType: BoolRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 18);\n\n/**\n * StringRules describes the rules applied to `string` values These\n * rules may also be applied to the `google.protobuf.StringValue` Well-Known-Type.\n *\n * @generated from message buf.validate.StringRules\n */\nexport type StringRules = Message<\"buf.validate.StringRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyString {\n * // value must equal `hello`\n * string value = 1 [(buf.validate.field).string.const = \"hello\"];\n * }\n * ```\n *\n * @generated from field: optional string const = 1;\n */\n const: string;\n\n /**\n * `len` dictates that the field value must have the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value does not meet the specified\n * length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 5 characters\n * string value = 1 [(buf.validate.field).string.len = 5];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 19;\n */\n len: bigint;\n\n /**\n * `min_len` specifies that the field value must have at least the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value contains fewer characters, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 3 characters\n * string value = 1 [(buf.validate.field).string.min_len = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen: bigint;\n\n /**\n * `max_len` specifies that the field value must have no more than the specified\n * number of characters (Unicode code points), which may differ from the\n * number of bytes in the string. If the field value contains more characters,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 10 characters\n * string value = 1 [(buf.validate.field).string.max_len = 10];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen: bigint;\n\n /**\n * `len_bytes` dictates that the field value must have the specified number of\n * bytes. If the field value does not match the specified length in bytes,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 6 bytes\n * string value = 1 [(buf.validate.field).string.len_bytes = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 len_bytes = 20;\n */\n lenBytes: bigint;\n\n /**\n * `min_bytes` specifies that the field value must have at least the specified\n * number of bytes. If the field value contains fewer bytes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 4 bytes\n * string value = 1 [(buf.validate.field).string.min_bytes = 4];\n * }\n *\n * ```\n *\n * @generated from field: optional uint64 min_bytes = 4;\n */\n minBytes: bigint;\n\n /**\n * `max_bytes` specifies that the field value must have no more than the\n * specified number of bytes. If the field value contains more bytes, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 8 bytes\n * string value = 1 [(buf.validate.field).string.max_bytes = 8];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_bytes = 5;\n */\n maxBytes: bigint;\n\n /**\n * `pattern` specifies that the field value must match the specified\n * regular expression (RE2 syntax), with the expression provided without any\n * delimiters. If the field value doesn't match the regular expression, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not match regex pattern `^[a-zA-Z]//$`\n * string value = 1 [(buf.validate.field).string.pattern = \"^[a-zA-Z]//$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 6;\n */\n pattern: string;\n\n /**\n * `prefix` specifies that the field value must have the\n * specified substring at the beginning of the string. If the field value\n * doesn't start with the specified prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value does not have prefix `pre`\n * string value = 1 [(buf.validate.field).string.prefix = \"pre\"];\n * }\n * ```\n *\n * @generated from field: optional string prefix = 7;\n */\n prefix: string;\n\n /**\n * `suffix` specifies that the field value must have the\n * specified substring at the end of the string. If the field value doesn't\n * end with the specified suffix, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not have suffix `post`\n * string value = 1 [(buf.validate.field).string.suffix = \"post\"];\n * }\n * ```\n *\n * @generated from field: optional string suffix = 8;\n */\n suffix: string;\n\n /**\n * `contains` specifies that the field value must have the\n * specified substring anywhere in the string. If the field value doesn't\n * contain the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not contain substring `inside`.\n * string value = 1 [(buf.validate.field).string.contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string contains = 9;\n */\n contains: string;\n\n /**\n * `not_contains` specifies that the field value must not have the\n * specified substring anywhere in the string. If the field value contains\n * the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value contains substring `inside`.\n * string value = 1 [(buf.validate.field).string.not_contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string not_contains = 23;\n */\n notContains: string;\n\n /**\n * `in` specifies that the field value must be equal to one of the specified\n * values. If the field value isn't one of the specified values, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be in list [\"apple\", \"banana\"]\n * string value = 1 [(buf.validate.field).string.in = \"apple\", (buf.validate.field).string.in = \"banana\"];\n * }\n * ```\n *\n * @generated from field: repeated string in = 10;\n */\n in: string[];\n\n /**\n * `not_in` specifies that the field value cannot be equal to any\n * of the specified values. If the field value is one of the specified values,\n * an error message will be generated.\n * ```proto\n * message MyString {\n * // value must not be in list [\"orange\", \"grape\"]\n * string value = 1 [(buf.validate.field).string.not_in = \"orange\", (buf.validate.field).string.not_in = \"grape\"];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 11;\n */\n notIn: string[];\n\n /**\n * `WellKnown` rules provide advanced rules against common string\n * patterns.\n *\n * @generated from oneof buf.validate.StringRules.well_known\n */\n wellKnown: {\n /**\n * `email` specifies that the field value must be a valid email address, for\n * example \"foo@example.com\".\n *\n * Conforms to the definition for a valid email address from the [HTML standard](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address).\n * Note that this standard willfully deviates from [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322),\n * which allows many unexpected forms of email addresses and will easily match\n * a typographical error.\n *\n * If the field value isn't a valid email address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid email address\n * string value = 1 [(buf.validate.field).string.email = true];\n * }\n * ```\n *\n * @generated from field: bool email = 12;\n */\n value: boolean;\n case: \"email\";\n } | {\n /**\n * `hostname` specifies that the field value must be a valid hostname, for\n * example \"foo.example.com\".\n *\n * A valid hostname follows the rules below:\n * - The name consists of one or more labels, separated by a dot (\".\").\n * - Each label can be 1 to 63 alphanumeric characters.\n * - A label can contain hyphens (\"-\"), but must not start or end with a hyphen.\n * - The right-most label must not be digits only.\n * - The name can have a trailing dot\u2014for example, \"foo.example.com.\".\n * - The name can be 253 characters at most, excluding the optional trailing dot.\n *\n * If the field value isn't a valid hostname, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid hostname\n * string value = 1 [(buf.validate.field).string.hostname = true];\n * }\n * ```\n *\n * @generated from field: bool hostname = 13;\n */\n value: boolean;\n case: \"hostname\";\n } | {\n /**\n * `ip` specifies that the field value must be a valid IP (v4 or v6) address.\n *\n * IPv4 addresses are expected in the dotted decimal format\u2014for example, \"192.168.5.21\".\n * IPv6 addresses are expected in their text representation\u2014for example, \"::1\",\n * or \"2001:0DB8:ABCD:0012::0\".\n *\n * Both formats are well-defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone identifiers for IPv6 addresses (for example, \"fe80::a%en1\") are supported.\n *\n * If the field value isn't a valid IP address, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP address\n * string value = 1 [(buf.validate.field).string.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 14;\n */\n value: boolean;\n case: \"ip\";\n } | {\n /**\n * `ipv4` specifies that the field value must be a valid IPv4 address\u2014for\n * example \"192.168.5.21\". If the field value isn't a valid IPv4 address, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 address\n * string value = 1 [(buf.validate.field).string.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 15;\n */\n value: boolean;\n case: \"ipv4\";\n } | {\n /**\n * `ipv6` specifies that the field value must be a valid IPv6 address\u2014for\n * example \"::1\", or \"d7a:115c:a1e0:ab12:4843:cd96:626b:430b\". If the field\n * value is not a valid IPv6 address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 address\n * string value = 1 [(buf.validate.field).string.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 16;\n */\n value: boolean;\n case: \"ipv6\";\n } | {\n /**\n * `uri` specifies that the field value must be a valid URI, for example\n * \"https://example.com/foo/bar?baz=quux#frag\".\n *\n * URI is defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid URI\n * string value = 1 [(buf.validate.field).string.uri = true];\n * }\n * ```\n *\n * @generated from field: bool uri = 17;\n */\n value: boolean;\n case: \"uri\";\n } | {\n /**\n * `uri_ref` specifies that the field value must be a valid URI Reference\u2014either\n * a URI such as \"https://example.com/foo/bar?baz=quux#frag\", or a Relative\n * Reference such as \"./foo/bar?query\".\n *\n * URI, URI Reference, and Relative Reference are defined in the internet\n * standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986). Zone\n * Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI Reference, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid URI Reference\n * string value = 1 [(buf.validate.field).string.uri_ref = true];\n * }\n * ```\n *\n * @generated from field: bool uri_ref = 18;\n */\n value: boolean;\n case: \"uriRef\";\n } | {\n /**\n * `address` specifies that the field value must be either a valid hostname\n * (for example, \"example.com\"), or a valid IP (v4 or v6) address (for example,\n * \"192.168.0.1\", or \"::1\"). If the field value isn't a valid hostname or IP,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid hostname, or ip address\n * string value = 1 [(buf.validate.field).string.address = true];\n * }\n * ```\n *\n * @generated from field: bool address = 21;\n */\n value: boolean;\n case: \"address\";\n } | {\n /**\n * `uuid` specifies that the field value must be a valid UUID as defined by\n * [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2). If the\n * field value isn't a valid UUID, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid UUID\n * string value = 1 [(buf.validate.field).string.uuid = true];\n * }\n * ```\n *\n * @generated from field: bool uuid = 22;\n */\n value: boolean;\n case: \"uuid\";\n } | {\n /**\n * `tuuid` (trimmed UUID) specifies that the field value must be a valid UUID as\n * defined by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2) with all dashes\n * omitted. If the field value isn't a valid UUID without dashes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid trimmed UUID\n * string value = 1 [(buf.validate.field).string.tuuid = true];\n * }\n * ```\n *\n * @generated from field: bool tuuid = 33;\n */\n value: boolean;\n case: \"tuuid\";\n } | {\n /**\n * `ip_with_prefixlen` specifies that the field value must be a valid IP\n * (v4 or v6) address with prefix length\u2014for example, \"192.168.5.21/16\" or\n * \"2001:0DB8:ABCD:0012::F1/64\". If the field value isn't a valid IP with\n * prefix length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP with prefix length\n * string value = 1 [(buf.validate.field).string.ip_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ip_with_prefixlen = 26;\n */\n value: boolean;\n case: \"ipWithPrefixlen\";\n } | {\n /**\n * `ipv4_with_prefixlen` specifies that the field value must be a valid\n * IPv4 address with prefix length\u2014for example, \"192.168.5.21/16\". If the\n * field value isn't a valid IPv4 address with prefix length, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 address with prefix length\n * string value = 1 [(buf.validate.field).string.ipv4_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_with_prefixlen = 27;\n */\n value: boolean;\n case: \"ipv4WithPrefixlen\";\n } | {\n /**\n * `ipv6_with_prefixlen` specifies that the field value must be a valid\n * IPv6 address with prefix length\u2014for example, \"2001:0DB8:ABCD:0012::F1/64\".\n * If the field value is not a valid IPv6 address with prefix length,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 address prefix length\n * string value = 1 [(buf.validate.field).string.ipv6_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_with_prefixlen = 28;\n */\n value: boolean;\n case: \"ipv6WithPrefixlen\";\n } | {\n /**\n * `ip_prefix` specifies that the field value must be a valid IP (v4 or v6)\n * prefix\u2014for example, \"192.168.0.0/16\" or \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value isn't a valid IP prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP prefix\n * string value = 1 [(buf.validate.field).string.ip_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ip_prefix = 29;\n */\n value: boolean;\n case: \"ipPrefix\";\n } | {\n /**\n * `ipv4_prefix` specifies that the field value must be a valid IPv4\n * prefix, for example \"192.168.0.0/16\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"192.168.0.0/16\" designates the left-most 16 bits for the prefix,\n * and the remaining 16 bits must be zero.\n *\n * If the field value isn't a valid IPv4 prefix, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 prefix\n * string value = 1 [(buf.validate.field).string.ipv4_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_prefix = 30;\n */\n value: boolean;\n case: \"ipv4Prefix\";\n } | {\n /**\n * `ipv6_prefix` specifies that the field value must be a valid IPv6 prefix\u2014for\n * example, \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value is not a valid IPv6 prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 prefix\n * string value = 1 [(buf.validate.field).string.ipv6_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_prefix = 31;\n */\n value: boolean;\n case: \"ipv6Prefix\";\n } | {\n /**\n * `host_and_port` specifies that the field value must be valid host/port\n * pair\u2014for example, \"example.com:8080\".\n *\n * The host can be one of:\n * - An IPv4 address in dotted decimal format\u2014for example, \"192.168.5.21\".\n * - An IPv6 address enclosed in square brackets\u2014for example, \"[2001:0DB8:ABCD:0012::F1]\".\n * - A hostname\u2014for example, \"example.com\".\n *\n * The port is separated by a colon. It must be non-empty, with a decimal number\n * in the range of 0-65535, inclusive.\n *\n * @generated from field: bool host_and_port = 32;\n */\n value: boolean;\n case: \"hostAndPort\";\n } | {\n /**\n * `well_known_regex` specifies a common well-known pattern\n * defined as a regex. If the field value doesn't match the well-known\n * regex, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid HTTP header value\n * string value = 1 [(buf.validate.field).string.well_known_regex = KNOWN_REGEX_HTTP_HEADER_VALUE];\n * }\n * ```\n *\n * #### KnownRegex\n *\n * `well_known_regex` contains some well-known patterns.\n *\n * | Name | Number | Description |\n * |-------------------------------|--------|-------------------------------------------|\n * | KNOWN_REGEX_UNSPECIFIED | 0 | |\n * | KNOWN_REGEX_HTTP_HEADER_NAME | 1 | HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2) |\n * | KNOWN_REGEX_HTTP_HEADER_VALUE | 2 | HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4) |\n *\n * @generated from field: buf.validate.KnownRegex well_known_regex = 24;\n */\n value: KnownRegex;\n case: \"wellKnownRegex\";\n } | { case: undefined; value?: undefined };\n\n /**\n * This applies to regexes `HTTP_HEADER_NAME` and `HTTP_HEADER_VALUE` to\n * enable strict header validation. By default, this is true, and HTTP header\n * validations are [RFC-compliant](https://datatracker.ietf.org/doc/html/rfc7230#section-3). Setting to false will enable looser\n * validations that only disallow `\\r\\n\\0` characters, which can be used to\n * bypass header matching rules.\n *\n * ```proto\n * message MyString {\n * // The field `value` must have be a valid HTTP headers, but not enforced with strict rules.\n * string value = 1 [(buf.validate.field).string.strict = false];\n * }\n * ```\n *\n * @generated from field: optional bool strict = 25;\n */\n strict: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyString {\n * string value = 1 [\n * (buf.validate.field).string.example = \"hello\",\n * (buf.validate.field).string.example = \"world\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated string example = 34;\n */\n example: string[];\n};\n\n/**\n * StringRules describes the rules applied to `string` values These\n * rules may also be applied to the `google.protobuf.StringValue` Well-Known-Type.\n *\n * @generated from message buf.validate.StringRules\n */\nexport type StringRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyString {\n * // value must equal `hello`\n * string value = 1 [(buf.validate.field).string.const = \"hello\"];\n * }\n * ```\n *\n * @generated from field: optional string const = 1;\n */\n const?: string;\n\n /**\n * `len` dictates that the field value must have the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value does not meet the specified\n * length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 5 characters\n * string value = 1 [(buf.validate.field).string.len = 5];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 19;\n */\n len?: string;\n\n /**\n * `min_len` specifies that the field value must have at least the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value contains fewer characters, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 3 characters\n * string value = 1 [(buf.validate.field).string.min_len = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen?: string;\n\n /**\n * `max_len` specifies that the field value must have no more than the specified\n * number of characters (Unicode code points), which may differ from the\n * number of bytes in the string. If the field value contains more characters,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 10 characters\n * string value = 1 [(buf.validate.field).string.max_len = 10];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen?: string;\n\n /**\n * `len_bytes` dictates that the field value must have the specified number of\n * bytes. If the field value does not match the specified length in bytes,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 6 bytes\n * string value = 1 [(buf.validate.field).string.len_bytes = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 len_bytes = 20;\n */\n lenBytes?: string;\n\n /**\n * `min_bytes` specifies that the field value must have at least the specified\n * number of bytes. If the field value contains fewer bytes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 4 bytes\n * string value = 1 [(buf.validate.field).string.min_bytes = 4];\n * }\n *\n * ```\n *\n * @generated from field: optional uint64 min_bytes = 4;\n */\n minBytes?: string;\n\n /**\n * `max_bytes` specifies that the field value must have no more than the\n * specified number of bytes. If the field value contains more bytes, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 8 bytes\n * string value = 1 [(buf.validate.field).string.max_bytes = 8];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_bytes = 5;\n */\n maxBytes?: string;\n\n /**\n * `pattern` specifies that the field value must match the specified\n * regular expression (RE2 syntax), with the expression provided without any\n * delimiters. If the field value doesn't match the regular expression, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not match regex pattern `^[a-zA-Z]//$`\n * string value = 1 [(buf.validate.field).string.pattern = \"^[a-zA-Z]//$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 6;\n */\n pattern?: string;\n\n /**\n * `prefix` specifies that the field value must have the\n * specified substring at the beginning of the string. If the field value\n * doesn't start with the specified prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value does not have prefix `pre`\n * string value = 1 [(buf.validate.field).string.prefix = \"pre\"];\n * }\n * ```\n *\n * @generated from field: optional string prefix = 7;\n */\n prefix?: string;\n\n /**\n * `suffix` specifies that the field value must have the\n * specified substring at the end of the string. If the field value doesn't\n * end with the specified suffix, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not have suffix `post`\n * string value = 1 [(buf.validate.field).string.suffix = \"post\"];\n * }\n * ```\n *\n * @generated from field: optional string suffix = 8;\n */\n suffix?: string;\n\n /**\n * `contains` specifies that the field value must have the\n * specified substring anywhere in the string. If the field value doesn't\n * contain the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not contain substring `inside`.\n * string value = 1 [(buf.validate.field).string.contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string contains = 9;\n */\n contains?: string;\n\n /**\n * `not_contains` specifies that the field value must not have the\n * specified substring anywhere in the string. If the field value contains\n * the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value contains substring `inside`.\n * string value = 1 [(buf.validate.field).string.not_contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string not_contains = 23;\n */\n notContains?: string;\n\n /**\n * `in` specifies that the field value must be equal to one of the specified\n * values. If the field value isn't one of the specified values, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be in list [\"apple\", \"banana\"]\n * string value = 1 [(buf.validate.field).string.in = \"apple\", (buf.validate.field).string.in = \"banana\"];\n * }\n * ```\n *\n * @generated from field: repeated string in = 10;\n */\n in?: string[];\n\n /**\n * `not_in` specifies that the field value cannot be equal to any\n * of the specified values. If the field value is one of the specified values,\n * an error message will be generated.\n * ```proto\n * message MyString {\n * // value must not be in list [\"orange\", \"grape\"]\n * string value = 1 [(buf.validate.field).string.not_in = \"orange\", (buf.validate.field).string.not_in = \"grape\"];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 11;\n */\n notIn?: string[];\n\n /**\n * `email` specifies that the field value must be a valid email address, for\n * example \"foo@example.com\".\n *\n * Conforms to the definition for a valid email address from the [HTML standard](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address).\n * Note that this standard willfully deviates from [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322),\n * which allows many unexpected forms of email addresses and will easily match\n * a typographical error.\n *\n * If the field value isn't a valid email address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid email address\n * string value = 1 [(buf.validate.field).string.email = true];\n * }\n * ```\n *\n * @generated from field: bool email = 12;\n */\n email?: boolean;\n\n /**\n * `hostname` specifies that the field value must be a valid hostname, for\n * example \"foo.example.com\".\n *\n * A valid hostname follows the rules below:\n * - The name consists of one or more labels, separated by a dot (\".\").\n * - Each label can be 1 to 63 alphanumeric characters.\n * - A label can contain hyphens (\"-\"), but must not start or end with a hyphen.\n * - The right-most label must not be digits only.\n * - The name can have a trailing dot\u2014for example, \"foo.example.com.\".\n * - The name can be 253 characters at most, excluding the optional trailing dot.\n *\n * If the field value isn't a valid hostname, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid hostname\n * string value = 1 [(buf.validate.field).string.hostname = true];\n * }\n * ```\n *\n * @generated from field: bool hostname = 13;\n */\n hostname?: boolean;\n\n /**\n * `ip` specifies that the field value must be a valid IP (v4 or v6) address.\n *\n * IPv4 addresses are expected in the dotted decimal format\u2014for example, \"192.168.5.21\".\n * IPv6 addresses are expected in their text representation\u2014for example, \"::1\",\n * or \"2001:0DB8:ABCD:0012::0\".\n *\n * Both formats are well-defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone identifiers for IPv6 addresses (for example, \"fe80::a%en1\") are supported.\n *\n * If the field value isn't a valid IP address, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP address\n * string value = 1 [(buf.validate.field).string.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 14;\n */\n ip?: boolean;\n\n /**\n * `ipv4` specifies that the field value must be a valid IPv4 address\u2014for\n * example \"192.168.5.21\". If the field value isn't a valid IPv4 address, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 address\n * string value = 1 [(buf.validate.field).string.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 15;\n */\n ipv4?: boolean;\n\n /**\n * `ipv6` specifies that the field value must be a valid IPv6 address\u2014for\n * example \"::1\", or \"d7a:115c:a1e0:ab12:4843:cd96:626b:430b\". If the field\n * value is not a valid IPv6 address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 address\n * string value = 1 [(buf.validate.field).string.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 16;\n */\n ipv6?: boolean;\n\n /**\n * `uri` specifies that the field value must be a valid URI, for example\n * \"https://example.com/foo/bar?baz=quux#frag\".\n *\n * URI is defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid URI\n * string value = 1 [(buf.validate.field).string.uri = true];\n * }\n * ```\n *\n * @generated from field: bool uri = 17;\n */\n uri?: boolean;\n\n /**\n * `uri_ref` specifies that the field value must be a valid URI Reference\u2014either\n * a URI such as \"https://example.com/foo/bar?baz=quux#frag\", or a Relative\n * Reference such as \"./foo/bar?query\".\n *\n * URI, URI Reference, and Relative Reference are defined in the internet\n * standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986). Zone\n * Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI Reference, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid URI Reference\n * string value = 1 [(buf.validate.field).string.uri_ref = true];\n * }\n * ```\n *\n * @generated from field: bool uri_ref = 18;\n */\n uriRef?: boolean;\n\n /**\n * `address` specifies that the field value must be either a valid hostname\n * (for example, \"example.com\"), or a valid IP (v4 or v6) address (for example,\n * \"192.168.0.1\", or \"::1\"). If the field value isn't a valid hostname or IP,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid hostname, or ip address\n * string value = 1 [(buf.validate.field).string.address = true];\n * }\n * ```\n *\n * @generated from field: bool address = 21;\n */\n address?: boolean;\n\n /**\n * `uuid` specifies that the field value must be a valid UUID as defined by\n * [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2). If the\n * field value isn't a valid UUID, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid UUID\n * string value = 1 [(buf.validate.field).string.uuid = true];\n * }\n * ```\n *\n * @generated from field: bool uuid = 22;\n */\n uuid?: boolean;\n\n /**\n * `tuuid` (trimmed UUID) specifies that the field value must be a valid UUID as\n * defined by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2) with all dashes\n * omitted. If the field value isn't a valid UUID without dashes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid trimmed UUID\n * string value = 1 [(buf.validate.field).string.tuuid = true];\n * }\n * ```\n *\n * @generated from field: bool tuuid = 33;\n */\n tuuid?: boolean;\n\n /**\n * `ip_with_prefixlen` specifies that the field value must be a valid IP\n * (v4 or v6) address with prefix length\u2014for example, \"192.168.5.21/16\" or\n * \"2001:0DB8:ABCD:0012::F1/64\". If the field value isn't a valid IP with\n * prefix length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP with prefix length\n * string value = 1 [(buf.validate.field).string.ip_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ip_with_prefixlen = 26;\n */\n ipWithPrefixlen?: boolean;\n\n /**\n * `ipv4_with_prefixlen` specifies that the field value must be a valid\n * IPv4 address with prefix length\u2014for example, \"192.168.5.21/16\". If the\n * field value isn't a valid IPv4 address with prefix length, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 address with prefix length\n * string value = 1 [(buf.validate.field).string.ipv4_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_with_prefixlen = 27;\n */\n ipv4WithPrefixlen?: boolean;\n\n /**\n * `ipv6_with_prefixlen` specifies that the field value must be a valid\n * IPv6 address with prefix length\u2014for example, \"2001:0DB8:ABCD:0012::F1/64\".\n * If the field value is not a valid IPv6 address with prefix length,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 address prefix length\n * string value = 1 [(buf.validate.field).string.ipv6_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_with_prefixlen = 28;\n */\n ipv6WithPrefixlen?: boolean;\n\n /**\n * `ip_prefix` specifies that the field value must be a valid IP (v4 or v6)\n * prefix\u2014for example, \"192.168.0.0/16\" or \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value isn't a valid IP prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP prefix\n * string value = 1 [(buf.validate.field).string.ip_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ip_prefix = 29;\n */\n ipPrefix?: boolean;\n\n /**\n * `ipv4_prefix` specifies that the field value must be a valid IPv4\n * prefix, for example \"192.168.0.0/16\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"192.168.0.0/16\" designates the left-most 16 bits for the prefix,\n * and the remaining 16 bits must be zero.\n *\n * If the field value isn't a valid IPv4 prefix, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 prefix\n * string value = 1 [(buf.validate.field).string.ipv4_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_prefix = 30;\n */\n ipv4Prefix?: boolean;\n\n /**\n * `ipv6_prefix` specifies that the field value must be a valid IPv6 prefix\u2014for\n * example, \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value is not a valid IPv6 prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 prefix\n * string value = 1 [(buf.validate.field).string.ipv6_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_prefix = 31;\n */\n ipv6Prefix?: boolean;\n\n /**\n * `host_and_port` specifies that the field value must be valid host/port\n * pair\u2014for example, \"example.com:8080\".\n *\n * The host can be one of:\n * - An IPv4 address in dotted decimal format\u2014for example, \"192.168.5.21\".\n * - An IPv6 address enclosed in square brackets\u2014for example, \"[2001:0DB8:ABCD:0012::F1]\".\n * - A hostname\u2014for example, \"example.com\".\n *\n * The port is separated by a colon. It must be non-empty, with a decimal number\n * in the range of 0-65535, inclusive.\n *\n * @generated from field: bool host_and_port = 32;\n */\n hostAndPort?: boolean;\n\n /**\n * `well_known_regex` specifies a common well-known pattern\n * defined as a regex. If the field value doesn't match the well-known\n * regex, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid HTTP header value\n * string value = 1 [(buf.validate.field).string.well_known_regex = KNOWN_REGEX_HTTP_HEADER_VALUE];\n * }\n * ```\n *\n * #### KnownRegex\n *\n * `well_known_regex` contains some well-known patterns.\n *\n * | Name | Number | Description |\n * |-------------------------------|--------|-------------------------------------------|\n * | KNOWN_REGEX_UNSPECIFIED | 0 | |\n * | KNOWN_REGEX_HTTP_HEADER_NAME | 1 | HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2) |\n * | KNOWN_REGEX_HTTP_HEADER_VALUE | 2 | HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4) |\n *\n * @generated from field: buf.validate.KnownRegex well_known_regex = 24;\n */\n wellKnownRegex?: KnownRegexJson;\n\n /**\n * This applies to regexes `HTTP_HEADER_NAME` and `HTTP_HEADER_VALUE` to\n * enable strict header validation. By default, this is true, and HTTP header\n * validations are [RFC-compliant](https://datatracker.ietf.org/doc/html/rfc7230#section-3). Setting to false will enable looser\n * validations that only disallow `\\r\\n\\0` characters, which can be used to\n * bypass header matching rules.\n *\n * ```proto\n * message MyString {\n * // The field `value` must have be a valid HTTP headers, but not enforced with strict rules.\n * string value = 1 [(buf.validate.field).string.strict = false];\n * }\n * ```\n *\n * @generated from field: optional bool strict = 25;\n */\n strict?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyString {\n * string value = 1 [\n * (buf.validate.field).string.example = \"hello\",\n * (buf.validate.field).string.example = \"world\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated string example = 34;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.StringRules.\n * Use `create(StringRulesSchema)` to create a new message.\n */\nexport const StringRulesSchema: GenMessage<StringRules, {jsonType: StringRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 19);\n\n/**\n * BytesRules describe the rules applied to `bytes` values. These rules\n * may also be applied to the `google.protobuf.BytesValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BytesRules\n */\nexport type BytesRules = Message<\"buf.validate.BytesRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified bytes\n * value. If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be \"\\x01\\x02\\x03\\x04\"\n * bytes value = 1 [(buf.validate.field).bytes.const = \"\\x01\\x02\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes const = 1;\n */\n const: Uint8Array;\n\n /**\n * `len` requires the field value to have the specified length in bytes.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be 4 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.len = 4];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 13;\n */\n len: bigint;\n\n /**\n * `min_len` requires the field value to have at least the specified minimum\n * length in bytes.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be at least 2 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.min_len = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen: bigint;\n\n /**\n * `max_len` requires the field value to have at most the specified maximum\n * length in bytes.\n * If the field value exceeds the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be at most 6 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.max_len = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen: bigint;\n\n /**\n * `pattern` requires the field value to match the specified regular\n * expression ([RE2 syntax](https://github.com/google/re2/wiki/Syntax)).\n * The value of the field must be valid UTF-8 or validation will fail with a\n * runtime error.\n * If the field value doesn't match the pattern, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must match regex pattern \"^[a-zA-Z0-9]+$\".\n * optional bytes value = 1 [(buf.validate.field).bytes.pattern = \"^[a-zA-Z0-9]+$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 4;\n */\n pattern: string;\n\n /**\n * `prefix` requires the field value to have the specified bytes at the\n * beginning of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have prefix \\x01\\x02\n * optional bytes value = 1 [(buf.validate.field).bytes.prefix = \"\\x01\\x02\"];\n * }\n * ```\n *\n * @generated from field: optional bytes prefix = 5;\n */\n prefix: Uint8Array;\n\n /**\n * `suffix` requires the field value to have the specified bytes at the end\n * of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have suffix \\x03\\x04\n * optional bytes value = 1 [(buf.validate.field).bytes.suffix = \"\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes suffix = 6;\n */\n suffix: Uint8Array;\n\n /**\n * `contains` requires the field value to have the specified bytes anywhere in\n * the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```protobuf\n * message MyBytes {\n * // value does not contain \\x02\\x03\n * optional bytes value = 1 [(buf.validate.field).bytes.contains = \"\\x02\\x03\"];\n * }\n * ```\n *\n * @generated from field: optional bytes contains = 7;\n */\n contains: Uint8Array;\n\n /**\n * `in` requires the field value to be equal to one of the specified\n * values. If the field value doesn't match any of the specified values, an\n * error message is generated.\n *\n * ```protobuf\n * message MyBytes {\n * // value must in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes.in = {\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"}];\n * }\n * ```\n *\n * @generated from field: repeated bytes in = 8;\n */\n in: Uint8Array[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the specified\n * values.\n * If the field value matches any of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyBytes {\n * // value must not in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes.not_in = {\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"}];\n * }\n * ```\n *\n * @generated from field: repeated bytes not_in = 9;\n */\n notIn: Uint8Array[];\n\n /**\n * WellKnown rules provide advanced rules against common byte\n * patterns\n *\n * @generated from oneof buf.validate.BytesRules.well_known\n */\n wellKnown: {\n /**\n * `ip` ensures that the field `value` is a valid IP address (v4 or v6) in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be a valid IP address\n * optional bytes value = 1 [(buf.validate.field).bytes.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 10;\n */\n value: boolean;\n case: \"ip\";\n } | {\n /**\n * `ipv4` ensures that the field `value` is a valid IPv4 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be a valid IPv4 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 11;\n */\n value: boolean;\n case: \"ipv4\";\n } | {\n /**\n * `ipv6` ensures that the field `value` is a valid IPv6 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n * ```proto\n * message MyBytes {\n * // value must be a valid IPv6 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 12;\n */\n value: boolean;\n case: \"ipv6\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBytes {\n * bytes value = 1 [\n * (buf.validate.field).bytes.example = \"\\x01\\x02\",\n * (buf.validate.field).bytes.example = \"\\x02\\x03\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bytes example = 14;\n */\n example: Uint8Array[];\n};\n\n/**\n * BytesRules describe the rules applied to `bytes` values. These rules\n * may also be applied to the `google.protobuf.BytesValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BytesRules\n */\nexport type BytesRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified bytes\n * value. If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be \"\\x01\\x02\\x03\\x04\"\n * bytes value = 1 [(buf.validate.field).bytes.const = \"\\x01\\x02\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes const = 1;\n */\n const?: string;\n\n /**\n * `len` requires the field value to have the specified length in bytes.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be 4 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.len = 4];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 13;\n */\n len?: string;\n\n /**\n * `min_len` requires the field value to have at least the specified minimum\n * length in bytes.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be at least 2 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.min_len = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen?: string;\n\n /**\n * `max_len` requires the field value to have at most the specified maximum\n * length in bytes.\n * If the field value exceeds the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be at most 6 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.max_len = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen?: string;\n\n /**\n * `pattern` requires the field value to match the specified regular\n * expression ([RE2 syntax](https://github.com/google/re2/wiki/Syntax)).\n * The value of the field must be valid UTF-8 or validation will fail with a\n * runtime error.\n * If the field value doesn't match the pattern, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must match regex pattern \"^[a-zA-Z0-9]+$\".\n * optional bytes value = 1 [(buf.validate.field).bytes.pattern = \"^[a-zA-Z0-9]+$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 4;\n */\n pattern?: string;\n\n /**\n * `prefix` requires the field value to have the specified bytes at the\n * beginning of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have prefix \\x01\\x02\n * optional bytes value = 1 [(buf.validate.field).bytes.prefix = \"\\x01\\x02\"];\n * }\n * ```\n *\n * @generated from field: optional bytes prefix = 5;\n */\n prefix?: string;\n\n /**\n * `suffix` requires the field value to have the specified bytes at the end\n * of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have suffix \\x03\\x04\n * optional bytes value = 1 [(buf.validate.field).bytes.suffix = \"\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes suffix = 6;\n */\n suffix?: string;\n\n /**\n * `contains` requires the field value to have the specified bytes anywhere in\n * the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```protobuf\n * message MyBytes {\n * // value does not contain \\x02\\x03\n * optional bytes value = 1 [(buf.validate.field).bytes.contains = \"\\x02\\x03\"];\n * }\n * ```\n *\n * @generated from field: optional bytes contains = 7;\n */\n contains?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified\n * values. If the field value doesn't match any of the specified values, an\n * error message is generated.\n *\n * ```protobuf\n * message MyBytes {\n * // value must in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes.in = {\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"}];\n * }\n * ```\n *\n * @generated from field: repeated bytes in = 8;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the specified\n * values.\n * If the field value matches any of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyBytes {\n * // value must not in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes.not_in = {\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"}];\n * }\n * ```\n *\n * @generated from field: repeated bytes not_in = 9;\n */\n notIn?: string[];\n\n /**\n * `ip` ensures that the field `value` is a valid IP address (v4 or v6) in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be a valid IP address\n * optional bytes value = 1 [(buf.validate.field).bytes.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 10;\n */\n ip?: boolean;\n\n /**\n * `ipv4` ensures that the field `value` is a valid IPv4 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be a valid IPv4 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 11;\n */\n ipv4?: boolean;\n\n /**\n * `ipv6` ensures that the field `value` is a valid IPv6 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n * ```proto\n * message MyBytes {\n * // value must be a valid IPv6 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 12;\n */\n ipv6?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBytes {\n * bytes value = 1 [\n * (buf.validate.field).bytes.example = \"\\x01\\x02\",\n * (buf.validate.field).bytes.example = \"\\x02\\x03\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bytes example = 14;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.BytesRules.\n * Use `create(BytesRulesSchema)` to create a new message.\n */\nexport const BytesRulesSchema: GenMessage<BytesRules, {jsonType: BytesRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 20);\n\n/**\n * EnumRules describe the rules applied to `enum` values.\n *\n * @generated from message buf.validate.EnumRules\n */\nexport type EnumRules = Message<\"buf.validate.EnumRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified enum value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be exactly MY_ENUM_VALUE1.\n * MyEnum value = 1 [(buf.validate.field).enum.const = 1];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const: number;\n\n /**\n * `defined_only` requires the field value to be one of the defined values for\n * this enum, failing on any undefined value.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be a defined value of MyEnum.\n * MyEnum value = 1 [(buf.validate.field).enum.defined_only = true];\n * }\n * ```\n *\n * @generated from field: optional bool defined_only = 2;\n */\n definedOnly: boolean;\n\n /**\n * `in` requires the field value to be equal to one of the\n * specified enum values. If the field value doesn't match any of the\n * specified values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be equal to one of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 3;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the\n * specified enum values. If the field value matches one of the specified\n * values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must not be equal to any of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { not_in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 4;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * (buf.validate.field).enum.example = 1,\n * (buf.validate.field).enum.example = 2\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 5;\n */\n example: number[];\n};\n\n/**\n * EnumRules describe the rules applied to `enum` values.\n *\n * @generated from message buf.validate.EnumRules\n */\nexport type EnumRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified enum value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be exactly MY_ENUM_VALUE1.\n * MyEnum value = 1 [(buf.validate.field).enum.const = 1];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const?: number;\n\n /**\n * `defined_only` requires the field value to be one of the defined values for\n * this enum, failing on any undefined value.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be a defined value of MyEnum.\n * MyEnum value = 1 [(buf.validate.field).enum.defined_only = true];\n * }\n * ```\n *\n * @generated from field: optional bool defined_only = 2;\n */\n definedOnly?: boolean;\n\n /**\n * `in` requires the field value to be equal to one of the\n * specified enum values. If the field value doesn't match any of the\n * specified values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be equal to one of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 3;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the\n * specified enum values. If the field value matches one of the specified\n * values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must not be equal to any of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { not_in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 4;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * (buf.validate.field).enum.example = 1,\n * (buf.validate.field).enum.example = 2\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 5;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.EnumRules.\n * Use `create(EnumRulesSchema)` to create a new message.\n */\nexport const EnumRulesSchema: GenMessage<EnumRules, {jsonType: EnumRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 21);\n\n/**\n * RepeatedRules describe the rules applied to `repeated` values.\n *\n * @generated from message buf.validate.RepeatedRules\n */\nexport type RepeatedRules = Message<\"buf.validate.RepeatedRules\"> & {\n /**\n * `min_items` requires that this field must contain at least the specified\n * minimum number of items.\n *\n * Note that `min_items = 1` is equivalent to setting a field as `required`.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain at least 2 items\n * repeated string value = 1 [(buf.validate.field).repeated.min_items = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_items = 1;\n */\n minItems: bigint;\n\n /**\n * `max_items` denotes that this field must not exceed a\n * certain number of items as the upper limit. If the field contains more\n * items than specified, an error message will be generated, requiring the\n * field to maintain no more than the specified number of items.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain no more than 3 item(s)\n * repeated string value = 1 [(buf.validate.field).repeated.max_items = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_items = 2;\n */\n maxItems: bigint;\n\n /**\n * `unique` indicates that all elements in this field must\n * be unique. This rule is strictly applicable to scalar and enum\n * types, with message types not being supported.\n *\n * ```proto\n * message MyRepeated {\n * // repeated value must contain unique items\n * repeated string value = 1 [(buf.validate.field).repeated.unique = true];\n * }\n * ```\n *\n * @generated from field: optional bool unique = 3;\n */\n unique: boolean;\n\n /**\n * `items` details the rules to be applied to each item\n * in the field. Even for repeated message fields, validation is executed\n * against each item unless `ignore` is specified.\n *\n * ```proto\n * message MyRepeated {\n * // The items in the field `value` must follow the specified rules.\n * repeated string value = 1 [(buf.validate.field).repeated.items = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Repeated items\n * cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules items = 4;\n */\n items?: FieldRules;\n};\n\n/**\n * RepeatedRules describe the rules applied to `repeated` values.\n *\n * @generated from message buf.validate.RepeatedRules\n */\nexport type RepeatedRulesJson = {\n /**\n * `min_items` requires that this field must contain at least the specified\n * minimum number of items.\n *\n * Note that `min_items = 1` is equivalent to setting a field as `required`.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain at least 2 items\n * repeated string value = 1 [(buf.validate.field).repeated.min_items = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_items = 1;\n */\n minItems?: string;\n\n /**\n * `max_items` denotes that this field must not exceed a\n * certain number of items as the upper limit. If the field contains more\n * items than specified, an error message will be generated, requiring the\n * field to maintain no more than the specified number of items.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain no more than 3 item(s)\n * repeated string value = 1 [(buf.validate.field).repeated.max_items = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_items = 2;\n */\n maxItems?: string;\n\n /**\n * `unique` indicates that all elements in this field must\n * be unique. This rule is strictly applicable to scalar and enum\n * types, with message types not being supported.\n *\n * ```proto\n * message MyRepeated {\n * // repeated value must contain unique items\n * repeated string value = 1 [(buf.validate.field).repeated.unique = true];\n * }\n * ```\n *\n * @generated from field: optional bool unique = 3;\n */\n unique?: boolean;\n\n /**\n * `items` details the rules to be applied to each item\n * in the field. Even for repeated message fields, validation is executed\n * against each item unless `ignore` is specified.\n *\n * ```proto\n * message MyRepeated {\n * // The items in the field `value` must follow the specified rules.\n * repeated string value = 1 [(buf.validate.field).repeated.items = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Repeated items\n * cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules items = 4;\n */\n items?: FieldRulesJson;\n};\n\n/**\n * Describes the message buf.validate.RepeatedRules.\n * Use `create(RepeatedRulesSchema)` to create a new message.\n */\nexport const RepeatedRulesSchema: GenMessage<RepeatedRules, {jsonType: RepeatedRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 22);\n\n/**\n * MapRules describe the rules applied to `map` values.\n *\n * @generated from message buf.validate.MapRules\n */\nexport type MapRules = Message<\"buf.validate.MapRules\"> & {\n /**\n * Specifies the minimum number of key-value pairs allowed. If the field has\n * fewer key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at least 2 key-value pairs.\n * map<string, string> value = 1 [(buf.validate.field).map.min_pairs = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_pairs = 1;\n */\n minPairs: bigint;\n\n /**\n * Specifies the maximum number of key-value pairs allowed. If the field has\n * more key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at most 3 key-value pairs.\n * map<string, string> value = 1 [(buf.validate.field).map.max_pairs = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_pairs = 2;\n */\n maxPairs: bigint;\n\n /**\n * Specifies the rules to be applied to each key in the field.\n *\n * ```proto\n * message MyMap {\n * // The keys in the field `value` must follow the specified rules.\n * map<string, string> value = 1 [(buf.validate.field).map.keys = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Map keys cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules keys = 4;\n */\n keys?: FieldRules;\n\n /**\n * Specifies the rules to be applied to the value of each key in the\n * field. Message values will still have their validations evaluated unless\n * `ignore` is specified.\n *\n * ```proto\n * message MyMap {\n * // The values in the field `value` must follow the specified rules.\n * map<string, string> value = 1 [(buf.validate.field).map.values = {\n * string: {\n * min_len: 5\n * max_len: 20\n * }\n * }];\n * }\n * ```\n * Note that the `required` rule does not apply. Map values cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules values = 5;\n */\n values?: FieldRules;\n};\n\n/**\n * MapRules describe the rules applied to `map` values.\n *\n * @generated from message buf.validate.MapRules\n */\nexport type MapRulesJson = {\n /**\n * Specifies the minimum number of key-value pairs allowed. If the field has\n * fewer key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at least 2 key-value pairs.\n * map<string, string> value = 1 [(buf.validate.field).map.min_pairs = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_pairs = 1;\n */\n minPairs?: string;\n\n /**\n * Specifies the maximum number of key-value pairs allowed. If the field has\n * more key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at most 3 key-value pairs.\n * map<string, string> value = 1 [(buf.validate.field).map.max_pairs = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_pairs = 2;\n */\n maxPairs?: string;\n\n /**\n * Specifies the rules to be applied to each key in the field.\n *\n * ```proto\n * message MyMap {\n * // The keys in the field `value` must follow the specified rules.\n * map<string, string> value = 1 [(buf.validate.field).map.keys = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Map keys cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules keys = 4;\n */\n keys?: FieldRulesJson;\n\n /**\n * Specifies the rules to be applied to the value of each key in the\n * field. Message values will still have their validations evaluated unless\n * `ignore` is specified.\n *\n * ```proto\n * message MyMap {\n * // The values in the field `value` must follow the specified rules.\n * map<string, string> value = 1 [(buf.validate.field).map.values = {\n * string: {\n * min_len: 5\n * max_len: 20\n * }\n * }];\n * }\n * ```\n * Note that the `required` rule does not apply. Map values cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules values = 5;\n */\n values?: FieldRulesJson;\n};\n\n/**\n * Describes the message buf.validate.MapRules.\n * Use `create(MapRulesSchema)` to create a new message.\n */\nexport const MapRulesSchema: GenMessage<MapRules, {jsonType: MapRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 23);\n\n/**\n * AnyRules describe rules applied exclusively to the `google.protobuf.Any` well-known type.\n *\n * @generated from message buf.validate.AnyRules\n */\nexport type AnyRules = Message<\"buf.validate.AnyRules\"> & {\n /**\n * `in` requires the field's `type_url` to be equal to one of the\n * specified values. If it doesn't match any of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must have a `type_url` equal to one of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * in: [\"type.googleapis.com/MyType1\", \"type.googleapis.com/MyType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string in = 2;\n */\n in: string[];\n\n /**\n * requires the field's type_url to be not equal to any of the specified values. If it matches any of the specified values, an error message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must not have a `type_url` equal to any of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * not_in: [\"type.googleapis.com/ForbiddenType1\", \"type.googleapis.com/ForbiddenType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 3;\n */\n notIn: string[];\n};\n\n/**\n * AnyRules describe rules applied exclusively to the `google.protobuf.Any` well-known type.\n *\n * @generated from message buf.validate.AnyRules\n */\nexport type AnyRulesJson = {\n /**\n * `in` requires the field's `type_url` to be equal to one of the\n * specified values. If it doesn't match any of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must have a `type_url` equal to one of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * in: [\"type.googleapis.com/MyType1\", \"type.googleapis.com/MyType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string in = 2;\n */\n in?: string[];\n\n /**\n * requires the field's type_url to be not equal to any of the specified values. If it matches any of the specified values, an error message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must not have a `type_url` equal to any of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * not_in: [\"type.googleapis.com/ForbiddenType1\", \"type.googleapis.com/ForbiddenType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 3;\n */\n notIn?: string[];\n};\n\n/**\n * Describes the message buf.validate.AnyRules.\n * Use `create(AnyRulesSchema)` to create a new message.\n */\nexport const AnyRulesSchema: GenMessage<AnyRules, {jsonType: AnyRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 24);\n\n/**\n * DurationRules describe the rules applied exclusively to the `google.protobuf.Duration` well-known type.\n *\n * @generated from message buf.validate.DurationRules\n */\nexport type DurationRules = Message<\"buf.validate.DurationRules\"> & {\n /**\n * `const` dictates that the field must match the specified value of the `google.protobuf.Duration` type exactly.\n * If the field's value deviates from the specified value, an error message\n * will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must equal 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = \"5s\"];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration const = 2;\n */\n const?: Duration;\n\n /**\n * @generated from oneof buf.validate.DurationRules.less_than\n */\n lessThan: {\n /**\n * `lt` stipulates that the field must be less than the specified value of the `google.protobuf.Duration` type,\n * exclusive. If the field's value is greater than or equal to the specified\n * value, an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be less than 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = \"5s\"];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lt = 3;\n */\n value: Duration;\n case: \"lt\";\n } | {\n /**\n * `lte` indicates that the field must be less than or equal to the specified\n * value of the `google.protobuf.Duration` type, inclusive. If the field's value is greater than the specified value,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be less than or equal to 10s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = \"10s\"];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lte = 4;\n */\n value: Duration;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.DurationRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the duration field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than 5s [duration.gt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gt = { seconds: 5 }];\n *\n * // duration must be greater than 5s and less than 10s [duration.gt_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gt: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than 10s or less than 5s [duration.gt_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gt: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gt = 5;\n */\n value: Duration;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the duration field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value must\n * be outside the specified range. If the field value doesn't meet the\n * required conditions, an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than or equal to 5s [duration.gte]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gte = { seconds: 5 }];\n *\n * // duration must be greater than or equal to 5s and less than 10s [duration.gte_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gte: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than or equal to 10s or less than 5s [duration.gte_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gte: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gte = 6;\n */\n value: Duration;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` asserts that the field must be equal to one of the specified values of the `google.protobuf.Duration` type.\n * If the field's value doesn't correspond to any of the specified values,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = [\"1s\", \"2s\", \"3s\"]];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration in = 7;\n */\n in: Duration[];\n\n /**\n * `not_in` denotes that the field must not be equal to\n * any of the specified values of the `google.protobuf.Duration` type.\n * If the field's value matches any of these values, an error message will be\n * generated.\n *\n * ```proto\n * message MyDuration {\n * // value must not be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.not_in = [\"1s\", \"2s\", \"3s\"]];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration not_in = 8;\n */\n notIn: Duration[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDuration {\n * google.protobuf.Duration value = 1 [\n * (buf.validate.field).duration.example = { seconds: 1 },\n * (buf.validate.field).duration.example = { seconds: 2 },\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration example = 9;\n */\n example: Duration[];\n};\n\n/**\n * DurationRules describe the rules applied exclusively to the `google.protobuf.Duration` well-known type.\n *\n * @generated from message buf.validate.DurationRules\n */\nexport type DurationRulesJson = {\n /**\n * `const` dictates that the field must match the specified value of the `google.protobuf.Duration` type exactly.\n * If the field's value deviates from the specified value, an error message\n * will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must equal 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = \"5s\"];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration const = 2;\n */\n const?: DurationJson;\n\n /**\n * `lt` stipulates that the field must be less than the specified value of the `google.protobuf.Duration` type,\n * exclusive. If the field's value is greater than or equal to the specified\n * value, an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be less than 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = \"5s\"];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lt = 3;\n */\n lt?: DurationJson;\n\n /**\n * `lte` indicates that the field must be less than or equal to the specified\n * value of the `google.protobuf.Duration` type, inclusive. If the field's value is greater than the specified value,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be less than or equal to 10s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = \"10s\"];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lte = 4;\n */\n lte?: DurationJson;\n\n /**\n * `gt` requires the duration field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than 5s [duration.gt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gt = { seconds: 5 }];\n *\n * // duration must be greater than 5s and less than 10s [duration.gt_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gt: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than 10s or less than 5s [duration.gt_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gt: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gt = 5;\n */\n gt?: DurationJson;\n\n /**\n * `gte` requires the duration field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value must\n * be outside the specified range. If the field value doesn't meet the\n * required conditions, an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than or equal to 5s [duration.gte]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gte = { seconds: 5 }];\n *\n * // duration must be greater than or equal to 5s and less than 10s [duration.gte_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gte: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than or equal to 10s or less than 5s [duration.gte_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gte: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gte = 6;\n */\n gte?: DurationJson;\n\n /**\n * `in` asserts that the field must be equal to one of the specified values of the `google.protobuf.Duration` type.\n * If the field's value doesn't correspond to any of the specified values,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = [\"1s\", \"2s\", \"3s\"]];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration in = 7;\n */\n in?: DurationJson[];\n\n /**\n * `not_in` denotes that the field must not be equal to\n * any of the specified values of the `google.protobuf.Duration` type.\n * If the field's value matches any of these values, an error message will be\n * generated.\n *\n * ```proto\n * message MyDuration {\n * // value must not be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.not_in = [\"1s\", \"2s\", \"3s\"]];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration not_in = 8;\n */\n notIn?: DurationJson[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDuration {\n * google.protobuf.Duration value = 1 [\n * (buf.validate.field).duration.example = { seconds: 1 },\n * (buf.validate.field).duration.example = { seconds: 2 },\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration example = 9;\n */\n example?: DurationJson[];\n};\n\n/**\n * Describes the message buf.validate.DurationRules.\n * Use `create(DurationRulesSchema)` to create a new message.\n */\nexport const DurationRulesSchema: GenMessage<DurationRules, {jsonType: DurationRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 25);\n\n/**\n * TimestampRules describe the rules applied exclusively to the `google.protobuf.Timestamp` well-known type.\n *\n * @generated from message buf.validate.TimestampRules\n */\nexport type TimestampRules = Message<\"buf.validate.TimestampRules\"> & {\n /**\n * `const` dictates that this field, of the `google.protobuf.Timestamp` type, must exactly match the specified value. If the field value doesn't correspond to the specified timestamp, an error message will be generated.\n *\n * ```proto\n * message MyTimestamp {\n * // value must equal 2023-05-03T10:00:00Z\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.const = {seconds: 1727998800}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Timestamp const = 2;\n */\n const?: Timestamp;\n\n /**\n * @generated from oneof buf.validate.TimestampRules.less_than\n */\n lessThan: {\n /**\n * requires the duration field value to be less than the specified value (field < value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be less than 'P3D' [duration.lt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 259200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lt = 3;\n */\n value: Timestamp;\n case: \"lt\";\n } | {\n /**\n * requires the timestamp field value to be less than or equal to the specified value (field <= value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be less than or equal to '2023-05-14T00:00:00Z' [timestamp.lte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.lte = { seconds: 1678867200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lte = 4;\n */\n value: Timestamp;\n case: \"lte\";\n } | {\n /**\n * `lt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be less than the current time. `lt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be less than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.lt_now = true];\n * }\n * ```\n *\n * @generated from field: bool lt_now = 7;\n */\n value: boolean;\n case: \"ltNow\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.TimestampRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the timestamp field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than '2023-01-01T00:00:00Z' [timestamp.gt]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gt = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gt_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gt: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gt_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gt: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gt = 5;\n */\n value: Timestamp;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the timestamp field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value\n * must be outside the specified range. If the field value doesn't meet\n * the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' [timestamp.gte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gte = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gte_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gte: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than or equal to '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gte_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gte: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gte = 6;\n */\n value: Timestamp;\n case: \"gte\";\n } | {\n /**\n * `gt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be greater than the current time. `gt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be greater than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.gt_now = true];\n * }\n * ```\n *\n * @generated from field: bool gt_now = 8;\n */\n value: boolean;\n case: \"gtNow\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `within` specifies that this field, of the `google.protobuf.Timestamp` type, must be within the specified duration of the current time. If the field value isn't within the duration, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be within 1 hour of now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.within = {seconds: 3600}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration within = 9;\n */\n within?: Duration;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyTimestamp {\n * google.protobuf.Timestamp value = 1 [\n * (buf.validate.field).timestamp.example = { seconds: 1672444800 },\n * (buf.validate.field).timestamp.example = { seconds: 1672531200 },\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Timestamp example = 10;\n */\n example: Timestamp[];\n};\n\n/**\n * TimestampRules describe the rules applied exclusively to the `google.protobuf.Timestamp` well-known type.\n *\n * @generated from message buf.validate.TimestampRules\n */\nexport type TimestampRulesJson = {\n /**\n * `const` dictates that this field, of the `google.protobuf.Timestamp` type, must exactly match the specified value. If the field value doesn't correspond to the specified timestamp, an error message will be generated.\n *\n * ```proto\n * message MyTimestamp {\n * // value must equal 2023-05-03T10:00:00Z\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.const = {seconds: 1727998800}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Timestamp const = 2;\n */\n const?: TimestampJson;\n\n /**\n * requires the duration field value to be less than the specified value (field < value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be less than 'P3D' [duration.lt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 259200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lt = 3;\n */\n lt?: TimestampJson;\n\n /**\n * requires the timestamp field value to be less than or equal to the specified value (field <= value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be less than or equal to '2023-05-14T00:00:00Z' [timestamp.lte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.lte = { seconds: 1678867200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lte = 4;\n */\n lte?: TimestampJson;\n\n /**\n * `lt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be less than the current time. `lt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be less than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.lt_now = true];\n * }\n * ```\n *\n * @generated from field: bool lt_now = 7;\n */\n ltNow?: boolean;\n\n /**\n * `gt` requires the timestamp field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than '2023-01-01T00:00:00Z' [timestamp.gt]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gt = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gt_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gt: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gt_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gt: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gt = 5;\n */\n gt?: TimestampJson;\n\n /**\n * `gte` requires the timestamp field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value\n * must be outside the specified range. If the field value doesn't meet\n * the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' [timestamp.gte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gte = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gte_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gte: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than or equal to '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gte_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gte: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gte = 6;\n */\n gte?: TimestampJson;\n\n /**\n * `gt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be greater than the current time. `gt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be greater than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.gt_now = true];\n * }\n * ```\n *\n * @generated from field: bool gt_now = 8;\n */\n gtNow?: boolean;\n\n /**\n * `within` specifies that this field, of the `google.protobuf.Timestamp` type, must be within the specified duration of the current time. If the field value isn't within the duration, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be within 1 hour of now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.within = {seconds: 3600}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration within = 9;\n */\n within?: DurationJson;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyTimestamp {\n * google.protobuf.Timestamp value = 1 [\n * (buf.validate.field).timestamp.example = { seconds: 1672444800 },\n * (buf.validate.field).timestamp.example = { seconds: 1672531200 },\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Timestamp example = 10;\n */\n example?: TimestampJson[];\n};\n\n/**\n * Describes the message buf.validate.TimestampRules.\n * Use `create(TimestampRulesSchema)` to create a new message.\n */\nexport const TimestampRulesSchema: GenMessage<TimestampRules, {jsonType: TimestampRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 26);\n\n/**\n * `Violations` is a collection of `Violation` messages. This message type is returned by\n * Protovalidate when a proto message fails to meet the requirements set by the `Rule` validation rules.\n * Each individual violation is represented by a `Violation` message.\n *\n * @generated from message buf.validate.Violations\n */\nexport type Violations = Message<\"buf.validate.Violations\"> & {\n /**\n * `violations` is a repeated field that contains all the `Violation` messages corresponding to the violations detected.\n *\n * @generated from field: repeated buf.validate.Violation violations = 1;\n */\n violations: Violation[];\n};\n\n/**\n * `Violations` is a collection of `Violation` messages. This message type is returned by\n * Protovalidate when a proto message fails to meet the requirements set by the `Rule` validation rules.\n * Each individual violation is represented by a `Violation` message.\n *\n * @generated from message buf.validate.Violations\n */\nexport type ViolationsJson = {\n /**\n * `violations` is a repeated field that contains all the `Violation` messages corresponding to the violations detected.\n *\n * @generated from field: repeated buf.validate.Violation violations = 1;\n */\n violations?: ViolationJson[];\n};\n\n/**\n * Describes the message buf.validate.Violations.\n * Use `create(ViolationsSchema)` to create a new message.\n */\nexport const ViolationsSchema: GenMessage<Violations, {jsonType: ViolationsJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 27);\n\n/**\n * `Violation` represents a single instance where a validation rule, expressed\n * as a `Rule`, was not met. It provides information about the field that\n * caused the violation, the specific rule that wasn't fulfilled, and a\n * human-readable error message.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message User {\n * int32 age = 1 [(buf.validate.field).cel = {\n * id: \"user.age\",\n * expression: \"this < 18 ? 'User must be at least 18 years old' : ''\",\n * }];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```json\n * {\n * \"ruleId\": \"user.age\",\n * \"message\": \"User must be at least 18 years old\",\n * \"field\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 1,\n * \"fieldName\": \"age\",\n * \"fieldType\": \"TYPE_INT32\"\n * }\n * ]\n * },\n * \"rule\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 23,\n * \"fieldName\": \"cel\",\n * \"fieldType\": \"TYPE_MESSAGE\",\n * \"index\": \"0\"\n * }\n * ]\n * }\n * }\n * ```\n *\n * @generated from message buf.validate.Violation\n */\nexport type Violation = Message<\"buf.validate.Violation\"> & {\n /**\n * `field` is a machine-readable path to the field that failed validation.\n * This could be a nested field, in which case the path will include all the parent fields leading to the actual field that caused the violation.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```textproto\n * violation {\n * field { element { field_number: 1, field_name: \"a\", field_type: 8 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath field = 5;\n */\n field?: FieldPath;\n\n /**\n * `rule` is a machine-readable path that points to the specific rule that failed validation.\n * This will be a nested field starting from the FieldRules of the field that failed validation.\n * For custom rules, this will provide the path of the rule, e.g. `cel[0]`.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * bool b = 2 [(buf.validate.field).cel = {\n * id: \"custom_rule\",\n * expression: \"!this ? 'b must be true': ''\"\n * }]\n * }\n * ```\n *\n * It could produce the following violations:\n *\n * ```textproto\n * violation {\n * rule { element { field_number: 25, field_name: \"required\", field_type: 8 } }\n * ...\n * }\n * violation {\n * rule { element { field_number: 23, field_name: \"cel\", field_type: 11, index: 0 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath rule = 6;\n */\n rule?: FieldPath;\n\n /**\n * `rule_id` is the unique identifier of the `Rule` that was not fulfilled.\n * This is the same `id` that was specified in the `Rule` message, allowing easy tracing of which rule was violated.\n *\n * @generated from field: optional string rule_id = 2;\n */\n ruleId: string;\n\n /**\n * `message` is a human-readable error message that describes the nature of the violation.\n * This can be the default error message from the violated `Rule`, or it can be a custom message that gives more context about the violation.\n *\n * @generated from field: optional string message = 3;\n */\n message: string;\n\n /**\n * `for_key` indicates whether the violation was caused by a map key, rather than a value.\n *\n * @generated from field: optional bool for_key = 4;\n */\n forKey: boolean;\n};\n\n/**\n * `Violation` represents a single instance where a validation rule, expressed\n * as a `Rule`, was not met. It provides information about the field that\n * caused the violation, the specific rule that wasn't fulfilled, and a\n * human-readable error message.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message User {\n * int32 age = 1 [(buf.validate.field).cel = {\n * id: \"user.age\",\n * expression: \"this < 18 ? 'User must be at least 18 years old' : ''\",\n * }];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```json\n * {\n * \"ruleId\": \"user.age\",\n * \"message\": \"User must be at least 18 years old\",\n * \"field\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 1,\n * \"fieldName\": \"age\",\n * \"fieldType\": \"TYPE_INT32\"\n * }\n * ]\n * },\n * \"rule\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 23,\n * \"fieldName\": \"cel\",\n * \"fieldType\": \"TYPE_MESSAGE\",\n * \"index\": \"0\"\n * }\n * ]\n * }\n * }\n * ```\n *\n * @generated from message buf.validate.Violation\n */\nexport type ViolationJson = {\n /**\n * `field` is a machine-readable path to the field that failed validation.\n * This could be a nested field, in which case the path will include all the parent fields leading to the actual field that caused the violation.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```textproto\n * violation {\n * field { element { field_number: 1, field_name: \"a\", field_type: 8 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath field = 5;\n */\n field?: FieldPathJson;\n\n /**\n * `rule` is a machine-readable path that points to the specific rule that failed validation.\n * This will be a nested field starting from the FieldRules of the field that failed validation.\n * For custom rules, this will provide the path of the rule, e.g. `cel[0]`.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * bool b = 2 [(buf.validate.field).cel = {\n * id: \"custom_rule\",\n * expression: \"!this ? 'b must be true': ''\"\n * }]\n * }\n * ```\n *\n * It could produce the following violations:\n *\n * ```textproto\n * violation {\n * rule { element { field_number: 25, field_name: \"required\", field_type: 8 } }\n * ...\n * }\n * violation {\n * rule { element { field_number: 23, field_name: \"cel\", field_type: 11, index: 0 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath rule = 6;\n */\n rule?: FieldPathJson;\n\n /**\n * `rule_id` is the unique identifier of the `Rule` that was not fulfilled.\n * This is the same `id` that was specified in the `Rule` message, allowing easy tracing of which rule was violated.\n *\n * @generated from field: optional string rule_id = 2;\n */\n ruleId?: string;\n\n /**\n * `message` is a human-readable error message that describes the nature of the violation.\n * This can be the default error message from the violated `Rule`, or it can be a custom message that gives more context about the violation.\n *\n * @generated from field: optional string message = 3;\n */\n message?: string;\n\n /**\n * `for_key` indicates whether the violation was caused by a map key, rather than a value.\n *\n * @generated from field: optional bool for_key = 4;\n */\n forKey?: boolean;\n};\n\n/**\n * Describes the message buf.validate.Violation.\n * Use `create(ViolationSchema)` to create a new message.\n */\nexport const ViolationSchema: GenMessage<Violation, {jsonType: ViolationJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 28);\n\n/**\n * `FieldPath` provides a path to a nested protobuf field.\n *\n * This message provides enough information to render a dotted field path even without protobuf descriptors.\n * It also provides enough information to resolve a nested field through unknown wire data.\n *\n * @generated from message buf.validate.FieldPath\n */\nexport type FieldPath = Message<\"buf.validate.FieldPath\"> & {\n /**\n * `elements` contains each element of the path, starting from the root and recursing downward.\n *\n * @generated from field: repeated buf.validate.FieldPathElement elements = 1;\n */\n elements: FieldPathElement[];\n};\n\n/**\n * `FieldPath` provides a path to a nested protobuf field.\n *\n * This message provides enough information to render a dotted field path even without protobuf descriptors.\n * It also provides enough information to resolve a nested field through unknown wire data.\n *\n * @generated from message buf.validate.FieldPath\n */\nexport type FieldPathJson = {\n /**\n * `elements` contains each element of the path, starting from the root and recursing downward.\n *\n * @generated from field: repeated buf.validate.FieldPathElement elements = 1;\n */\n elements?: FieldPathElementJson[];\n};\n\n/**\n * Describes the message buf.validate.FieldPath.\n * Use `create(FieldPathSchema)` to create a new message.\n */\nexport const FieldPathSchema: GenMessage<FieldPath, {jsonType: FieldPathJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 29);\n\n/**\n * `FieldPathElement` provides enough information to nest through a single protobuf field.\n *\n * If the selected field is a map or repeated field, the `subscript` value selects a specific element from it.\n * A path that refers to a value nested under a map key or repeated field index will have a `subscript` value.\n * The `field_type` field allows unambiguous resolution of a field even if descriptors are not available.\n *\n * @generated from message buf.validate.FieldPathElement\n */\nexport type FieldPathElement = Message<\"buf.validate.FieldPathElement\"> & {\n /**\n * `field_number` is the field number this path element refers to.\n *\n * @generated from field: optional int32 field_number = 1;\n */\n fieldNumber: number;\n\n /**\n * `field_name` contains the field name this path element refers to.\n * This can be used to display a human-readable path even if the field number is unknown.\n *\n * @generated from field: optional string field_name = 2;\n */\n fieldName: string;\n\n /**\n * `field_type` specifies the type of this field. When using reflection, this value is not needed.\n *\n * This value is provided to make it possible to traverse unknown fields through wire data.\n * When traversing wire data, be mindful of both packed[1] and delimited[2] encoding schemes.\n *\n * [1]: https://protobuf.dev/programming-guides/encoding/#packed\n * [2]: https://protobuf.dev/programming-guides/encoding/#groups\n *\n * N.B.: Although groups are deprecated, the corresponding delimited encoding scheme is not, and\n * can be explicitly used in Protocol Buffers 2023 Edition.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type field_type = 3;\n */\n fieldType: FieldDescriptorProto_Type;\n\n /**\n * `key_type` specifies the map key type of this field. This value is useful when traversing\n * unknown fields through wire data: specifically, it allows handling the differences between\n * different integer encodings.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type key_type = 4;\n */\n keyType: FieldDescriptorProto_Type;\n\n /**\n * `value_type` specifies map value type of this field. This is useful if you want to display a\n * value inside unknown fields through wire data.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type value_type = 5;\n */\n valueType: FieldDescriptorProto_Type;\n\n /**\n * `subscript` contains a repeated index or map key, if this path element nests into a repeated or map field.\n *\n * @generated from oneof buf.validate.FieldPathElement.subscript\n */\n subscript: {\n /**\n * `index` specifies a 0-based index into a repeated field.\n *\n * @generated from field: uint64 index = 6;\n */\n value: bigint;\n case: \"index\";\n } | {\n /**\n * `bool_key` specifies a map key of type bool.\n *\n * @generated from field: bool bool_key = 7;\n */\n value: boolean;\n case: \"boolKey\";\n } | {\n /**\n * `int_key` specifies a map key of type int32, int64, sint32, sint64, sfixed32 or sfixed64.\n *\n * @generated from field: int64 int_key = 8;\n */\n value: bigint;\n case: \"intKey\";\n } | {\n /**\n * `uint_key` specifies a map key of type uint32, uint64, fixed32 or fixed64.\n *\n * @generated from field: uint64 uint_key = 9;\n */\n value: bigint;\n case: \"uintKey\";\n } | {\n /**\n * `string_key` specifies a map key of type string.\n *\n * @generated from field: string string_key = 10;\n */\n value: string;\n case: \"stringKey\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * `FieldPathElement` provides enough information to nest through a single protobuf field.\n *\n * If the selected field is a map or repeated field, the `subscript` value selects a specific element from it.\n * A path that refers to a value nested under a map key or repeated field index will have a `subscript` value.\n * The `field_type` field allows unambiguous resolution of a field even if descriptors are not available.\n *\n * @generated from message buf.validate.FieldPathElement\n */\nexport type FieldPathElementJson = {\n /**\n * `field_number` is the field number this path element refers to.\n *\n * @generated from field: optional int32 field_number = 1;\n */\n fieldNumber?: number;\n\n /**\n * `field_name` contains the field name this path element refers to.\n * This can be used to display a human-readable path even if the field number is unknown.\n *\n * @generated from field: optional string field_name = 2;\n */\n fieldName?: string;\n\n /**\n * `field_type` specifies the type of this field. When using reflection, this value is not needed.\n *\n * This value is provided to make it possible to traverse unknown fields through wire data.\n * When traversing wire data, be mindful of both packed[1] and delimited[2] encoding schemes.\n *\n * [1]: https://protobuf.dev/programming-guides/encoding/#packed\n * [2]: https://protobuf.dev/programming-guides/encoding/#groups\n *\n * N.B.: Although groups are deprecated, the corresponding delimited encoding scheme is not, and\n * can be explicitly used in Protocol Buffers 2023 Edition.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type field_type = 3;\n */\n fieldType?: FieldDescriptorProto_TypeJson;\n\n /**\n * `key_type` specifies the map key type of this field. This value is useful when traversing\n * unknown fields through wire data: specifically, it allows handling the differences between\n * different integer encodings.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type key_type = 4;\n */\n keyType?: FieldDescriptorProto_TypeJson;\n\n /**\n * `value_type` specifies map value type of this field. This is useful if you want to display a\n * value inside unknown fields through wire data.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type value_type = 5;\n */\n valueType?: FieldDescriptorProto_TypeJson;\n\n /**\n * `index` specifies a 0-based index into a repeated field.\n *\n * @generated from field: uint64 index = 6;\n */\n index?: string;\n\n /**\n * `bool_key` specifies a map key of type bool.\n *\n * @generated from field: bool bool_key = 7;\n */\n boolKey?: boolean;\n\n /**\n * `int_key` specifies a map key of type int32, int64, sint32, sint64, sfixed32 or sfixed64.\n *\n * @generated from field: int64 int_key = 8;\n */\n intKey?: string;\n\n /**\n * `uint_key` specifies a map key of type uint32, uint64, fixed32 or fixed64.\n *\n * @generated from field: uint64 uint_key = 9;\n */\n uintKey?: string;\n\n /**\n * `string_key` specifies a map key of type string.\n *\n * @generated from field: string string_key = 10;\n */\n stringKey?: string;\n};\n\n/**\n * Describes the message buf.validate.FieldPathElement.\n * Use `create(FieldPathElementSchema)` to create a new message.\n */\nexport const FieldPathElementSchema: GenMessage<FieldPathElement, {jsonType: FieldPathElementJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 30);\n\n/**\n * Specifies how `FieldRules.ignore` behaves, depending on the field's value, and\n * whether the field tracks presence.\n *\n * @generated from enum buf.validate.Ignore\n */\nexport enum Ignore {\n /**\n * Ignore rules if the field tracks presence and is unset. This is the default\n * behavior.\n *\n * In proto3, only message fields, members of a Protobuf `oneof`, and fields\n * with the `optional` label track presence. Consequently, the following fields\n * are always validated, whether a value is set or not:\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message RulesApply {\n * string email = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * int32 age = 2 [\n * (buf.validate.field).int32.gt = 0\n * ];\n * repeated string labels = 3 [\n * (buf.validate.field).repeated.min_items = 1\n * ];\n * }\n * ```\n *\n * In contrast, the following fields track presence, and are only validated if\n * a value is set:\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message RulesApplyIfSet {\n * optional string email = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * oneof ref {\n * string reference = 2 [\n * (buf.validate.field).string.uuid = true\n * ];\n * string name = 3 [\n * (buf.validate.field).string.min_len = 4\n * ];\n * }\n * SomeMessage msg = 4 [\n * (buf.validate.field).cel = {/* ... *\\/}\n * ];\n * }\n * ```\n *\n * To ensure that such a field is set, add the `required` rule.\n *\n * To learn which fields track presence, see the\n * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat).\n *\n * @generated from enum value: IGNORE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Ignore rules if the field is unset, or set to the zero value.\n *\n * The zero value depends on the field type:\n * - For strings, the zero value is the empty string.\n * - For bytes, the zero value is empty bytes.\n * - For bool, the zero value is false.\n * - For numeric types, the zero value is zero.\n * - For enums, the zero value is the first defined enum value.\n * - For repeated fields, the zero is an empty list.\n * - For map fields, the zero is an empty map.\n * - For message fields, absence of the message (typically a null-value) is considered zero value.\n *\n * For fields that track presence (e.g. adding the `optional` label in proto3),\n * this a no-op and behavior is the same as the default `IGNORE_UNSPECIFIED`.\n *\n * @generated from enum value: IGNORE_IF_ZERO_VALUE = 1;\n */\n IF_ZERO_VALUE = 1,\n\n /**\n * Always ignore rules, including the `required` rule.\n *\n * This is useful for ignoring the rules of a referenced message, or to\n * temporarily ignore rules during development.\n *\n * ```proto\n * message MyMessage {\n * // The field's rules will always be ignored, including any validations\n * // on value's fields.\n * MyOtherMessage value = 1 [\n * (buf.validate.field).ignore = IGNORE_ALWAYS\n * ];\n * }\n * ```\n *\n * @generated from enum value: IGNORE_ALWAYS = 3;\n */\n ALWAYS = 3,\n}\n\n/**\n * Specifies how `FieldRules.ignore` behaves, depending on the field's value, and\n * whether the field tracks presence.\n *\n * @generated from enum buf.validate.Ignore\n */\nexport type IgnoreJson = \"IGNORE_UNSPECIFIED\" | \"IGNORE_IF_ZERO_VALUE\" | \"IGNORE_ALWAYS\";\n\n/**\n * Describes the enum buf.validate.Ignore.\n */\nexport const IgnoreSchema: GenEnum<Ignore, IgnoreJson> = /*@__PURE__*/\n enumDesc(file_buf_validate_validate, 0);\n\n/**\n * KnownRegex contains some well-known patterns.\n *\n * @generated from enum buf.validate.KnownRegex\n */\nexport enum KnownRegex {\n /**\n * @generated from enum value: KNOWN_REGEX_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2).\n *\n * @generated from enum value: KNOWN_REGEX_HTTP_HEADER_NAME = 1;\n */\n HTTP_HEADER_NAME = 1,\n\n /**\n * HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4).\n *\n * @generated from enum value: KNOWN_REGEX_HTTP_HEADER_VALUE = 2;\n */\n HTTP_HEADER_VALUE = 2,\n}\n\n/**\n * KnownRegex contains some well-known patterns.\n *\n * @generated from enum buf.validate.KnownRegex\n */\nexport type KnownRegexJson = \"KNOWN_REGEX_UNSPECIFIED\" | \"KNOWN_REGEX_HTTP_HEADER_NAME\" | \"KNOWN_REGEX_HTTP_HEADER_VALUE\";\n\n/**\n * Describes the enum buf.validate.KnownRegex.\n */\nexport const KnownRegexSchema: GenEnum<KnownRegex, KnownRegexJson> = /*@__PURE__*/\n enumDesc(file_buf_validate_validate, 1);\n\n/**\n * Rules specify the validations to be performed on this message. By default,\n * no validation is performed against a message.\n *\n * @generated from extension: optional buf.validate.MessageRules message = 1159;\n */\nexport const message: GenExtension<MessageOptions, MessageRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 0);\n\n/**\n * Rules specify the validations to be performed on this oneof. By default,\n * no validation is performed against a oneof.\n *\n * @generated from extension: optional buf.validate.OneofRules oneof = 1159;\n */\nexport const oneof: GenExtension<OneofOptions, OneofRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 1);\n\n/**\n * Rules specify the validations to be performed on this field. By default,\n * no validation is performed against a field.\n *\n * @generated from extension: optional buf.validate.FieldRules field = 1159;\n */\nexport const field: GenExtension<FieldOptions, FieldRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 2);\n\n/**\n * Specifies predefined rules. When extending a standard rule message,\n * this adds additional CEL expressions that apply when the extension is used.\n *\n * ```proto\n * extend buf.validate.Int32Rules {\n * bool is_zero [(buf.validate.predefined).cel = {\n * id: \"int32.is_zero\",\n * message: \"value must be zero\",\n * expression: \"!rule || this == 0\",\n * }];\n * }\n *\n * message Foo {\n * int32 reserved = 1 [(buf.validate.field).int32.(is_zero) = true];\n * }\n * ```\n *\n * @generated from extension: optional buf.validate.PredefinedRules predefined = 1160;\n */\nexport const predefined: GenExtension<FieldOptions, PredefinedRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 3);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/file.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/file.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_file: GenFile = /*@__PURE__*/\n fileDesc(\"Cihtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9maWxlLnByb3RvEh1tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MSJ+CgRGaWxlEisKBG5hbWUYASABKAlCHbpIGnIYEAIYgCAyEV5bXi9dKyhcL1teL10rKSokEhgKBGRhdGEYAiABKAxCCrpIB3oFGIC0iRMSIQoJbWltZV90eXBlGAMgASgJQgm6SAZyBBABGGRIAIgBAUIMCgpfbWltZV90eXBlYgZwcm90bzM\", [file_buf_validate_validate]);\n\n/**\n * File represents a file within a plugin package.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.File\n */\nexport type File = Message<\"mochabugapis.adapt.plugins.v1.File\"> & {\n /**\n * The 'name' or 'path' of the file\n *\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * 'data' contains the actual binary file data.\n *\n * @generated from field: bytes data = 2;\n */\n data: Uint8Array;\n\n /**\n * The mime type of the file\n *\n * @generated from field: optional string mime_type = 3;\n */\n mimeType?: string;\n};\n\n/**\n * File represents a file within a plugin package.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.File\n */\nexport type FileJson = {\n /**\n * The 'name' or 'path' of the file\n *\n * @generated from field: string name = 1;\n */\n name?: string;\n\n /**\n * 'data' contains the actual binary file data.\n *\n * @generated from field: bytes data = 2;\n */\n data?: string;\n\n /**\n * The mime type of the file\n *\n * @generated from field: optional string mime_type = 3;\n */\n mimeType?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.File.\n * Use `create(FileSchema)` to create a new message.\n */\nexport const FileSchema: GenMessage<File, {jsonType: FileJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_file, 0);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/manifest.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { ServiceDefinition, ServiceDefinitionJson } from \"./service_definition_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_service_definition } from \"./service_definition_pb\";\nimport type { Vertex, VertexJson } from \"./vertex_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_vertex } from \"./vertex_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/manifest.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_manifest: GenFile = /*@__PURE__*/\n fileDesc(\"Cixtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9tYW5pZmVzdC5wcm90bxIdbW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEi0QoKCE1hbmlmZXN0EjMKBG5hbWUYASABKAlCJbpIInIgEAEYZDIaXltfJGEtekEtWl1bXyRhLXpBLVowLTldKiQS1AEKB3ZlcnNpb24YAiABKAlCwgG6SL4BcrsBEAUYlgEyswFeKDB8WzEtOV1cZCopXC4oMHxbMS05XVxkKilcLigwfFsxLTldXGQqKSg/Oi0oKD86MHxbMS05XVxkKnxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSg/OlwuKD86MHxbMS05XVxkKnxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSkqKSk/KD86XCsoWzAtOWEtekEtWi1dKyg/OlwuWzAtOWEtekEtWi1dKykqKSk/JBIYCgVsYWJlbBgDIAEoCUIJukgGcgQQARhkEh8KC2Rlc2NyaXB0aW9uGAQgASgJQgq6SAdyBRABGPoBEh4KDG9yZ2FuaXphdGlvbhgFIAEoCUIIukgFcgOwAQESVQoIaG9tZXBhZ2UYBiABKAlCPrpIO3I5EAsYgCAyMl5odHRwczovL1thLXpBLVowLTkuLV0rKD86XC5bYS16QS1aXXsyLH0pKD86Ly4qKT8kSACIAQESVwoKcmVwb3NpdG9yeRgHIAEoCUI+ukg7cjkQCxiAIDIyXmh0dHBzOi8vW2EtekEtWjAtOS4tXSsoPzpcLlthLXpBLVpdezIsfSkoPzovLiopPyRIAYgBARLWAQoEYnVncxgIIAEoCULCAbpIvgG6AboBChJ2YWxpZF9lbWFpbF9vcl91cmwSIWJ1Z3MgbXVzdCBiZSBhIHZhbGlkIGVtYWlsIG9yIFVSTBqAAXNpemUodGhpcykgPj0gMiAmJiBzaXplKHRoaXMpIDw9IDQwOTYgJiYgKHRoaXMuaXNFbWFpbCgpIHx8IHRoaXMubWF0Y2hlcygnXmh0dHBzOi8vW2EtekEtWjAtOS4tXSsoPzpcXC5bYS16QS1aXXsyLH0pKD86Ly4qKT8kJykpSAKIAQESHgoGYXV0aG9yGAkgASgJQgm6SAZyBBABGGRIA4gBARJiCgRsb2dvGAogASgJQk+6SExyShACGIAgMkNeKFteL10rKC9bXi9dKykqKVwuKGdpZnxqcGd8anBlZ3xqZmlmfHBqcGVnfHBqcHxwbmd8c3ZnfHdlYnB8YXZpZikkSASIAQESqQEKCHZlcnRpY2VzGAsgAygLMiUubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuVmVydGV4QnC6SG26AWIKE3ZlcnRleF91bmlxdWVfbmFtZXMSI2EgbmFtZSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlGiZ0aGlzLm1hcCh2ZXJ0ZXgsIHZlcnRleC5uYW1lKS51bmlxdWUoKZIBBQgBEPQDEsMBChNzZXJ2aWNlX2RlZmluaXRpb25zGAwgAygLMjAubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuU2VydmljZURlZmluaXRpb25CdLpIcboBZgoVc2VydmljZXNfdW5pcXVlX25hbWVzEiNhIG5hbWUgY2Fubm90IGFwcGVhciBtb3JlIHRoYW4gb25jZRoodGhpcy5tYXAoc2VydmljZSwgc2VydmljZS5uYW1lKS51bmlxdWUoKZIBBQgAEPQDEiYKD3N5c3RlbV9zZXJ2aWNlcxgNIAMoCUINukgKkgEHCAAQ9AMYAUILCglfaG9tZXBhZ2VCDQoLX3JlcG9zaXRvcnlCBwoFX2J1Z3NCCQoHX2F1dGhvckIHCgVfbG9nb2IGcHJvdG8z\", [file_buf_validate_validate, file_mochabugapis_adapt_plugins_v1_service_definition, file_mochabugapis_adapt_plugins_v1_vertex]);\n\n/**\n * Manifest describes a plugin and its properties.\n *\n * ## Architecture Overview\n *\n * A plugin consists of:\n * 1. **Vertices**: The actual workflow nodes that users add to automation graphs\n * 2. **Service Definitions**: Flat declarations of services (OAuth2, HTTP Proxy, Variables, Groups, OneOf)\n * 3. **System Services**: String array referencing service definitions used at the plugin level\n *\n * ## Service Architecture\n *\n * **Service definitions are ALWAYS flat** - they exist at the top level of the manifest\n * and are never nested within each other. This includes:\n * - Oauth2Definition\n * - HttpProxyDefinition\n * - VariableDefinition\n * - GroupedDefinition (references other flat definitions)\n * - OneOfDefinition (references other flat definitions)\n *\n * **Services are referenced by name as strings**. Service lists are string arrays where each\n * string must match a ServiceDefinition's `name`. Services exist at two levels:\n * - `system_services`: Plugin-level services configured once for the entire plugin\n * - `user_services` (in Vertex): Vertex-level services configured per vertex instance\n *\n * The `optional` field in ServiceDefinition controls whether a service must be configured:\n * - `optional: false` (default): User MUST configure this service\n * - `optional: true`: User MAY skip configuring this service\n *\n * ## Example Structure\n *\n * ```protobuf\n * Manifest {\n * name: \"stripe_plugin\"\n * version: \"1.0.0\"\n *\n * // Flat service definitions at manifest level\n * service_definitions: [\n * { name: \"stripe_oauth\", oauth2: {...} },\n * { name: \"stripe_api\", http_proxy: {...} },\n * { name: \"webhook_secret\", variable: {...} }\n * ]\n *\n * // System-level services (plugin-wide)\n * // Each string references a service definition name\n * system_services: [\"stripe_oauth\"]\n *\n * // Vertices with their own service references\n * vertices: [\n * {\n * name: \"CreatePayment\",\n * user_services: [\"stripe_api\", \"webhook_secret\"]\n * }\n * ]\n * }\n * ```\n *\n * ## Security Considerations\n *\n * The platform ensures that secrets and certificates are stored and transmitted securely.\n *\n * *** Plugin authors must also ensure that their implementations\n * handle sensitive data appropriately! ***\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Manifest\n */\nexport type Manifest = Message<\"mochabugapis.adapt.plugins.v1.Manifest\"> & {\n /**\n * 'name' is the alpha-numeric identifier of the plugin. Must be conform to a ES variable name\n *\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * 'version' is the plugin's version, following SemVer 2.0: https://semver.org/\n *\n * @generated from field: string version = 2;\n */\n version: string;\n\n /**\n * 'label' is a human-friendly label displayed in the UI.\n *\n * @generated from field: string label = 3;\n */\n label: string;\n\n /**\n * 'description' is a short, human-friendly description displayed in the UI.\n *\n * @generated from field: string description = 4;\n */\n description: string;\n\n /**\n * 'organization' is the id of the organization the user belongs to.\n *\n * @generated from field: string organization = 5;\n */\n organization: string;\n\n /**\n * 'homepage' is the plugin's homepage URL.\n *\n * @generated from field: optional string homepage = 6;\n */\n homepage?: string;\n\n /**\n * 'repository' is the plugin's repository URL.\n *\n * @generated from field: optional string repository = 7;\n */\n repository?: string;\n\n /**\n * 'bugs' is the URL or email for reporting bugs.\n *\n * @generated from field: optional string bugs = 8;\n */\n bugs?: string;\n\n /**\n * 'author' is the name of the plugin's author.\n *\n * @generated from field: optional string author = 9;\n */\n author?: string;\n\n /**\n * 'logo' is an optional path to the plugin logo.\n * The logo will be resized to a maximum of 80x80 pixels.\n * - Supported file formats:\n * - GIF: .gif\n * - JPEG: .jpg, .jpeg, .jfif, .pjpeg, .pjp\n * - PNG: .png\n * - SVG: .svg\n * - WEBP: .webp\n * - AVIF: .avif\n *\n * @generated from field: optional string logo = 10;\n */\n logo?: string;\n\n /**\n * 'vertices' is a list of vertices that constitute the plugin.\n * this is filled in automatically when configurating a project on the filesystem\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.Vertex vertices = 11;\n */\n vertices: Vertex[];\n\n /**\n * 'service_definitions' are flat service definitions that can be referenced by bindings.\n *\n * All service definitions exist at this top level - they are NEVER nested.\n * Definitions can be referenced by:\n * - system_services (plugin-level bindings)\n * - user_services in vertices (vertex-level bindings)\n *\n * Each definition has a unique name used for referencing in bindings.\n * Service types: OAuth2, HTTP Proxy, Variable, Group, OneOf.\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.ServiceDefinition service_definitions = 12;\n */\n serviceDefinitions: ServiceDefinition[];\n\n /**\n * 'system_services' are plugin-level services configured once for the entire plugin.\n *\n * System services are:\n * - Configured by plugin administrators (via PostPluginSettings API)\n * - Shared across all vertices in the plugin\n * - Required to be configured before the plugin can be used (status = ACTIVE), unless marked optional\n *\n * This is a string array where each string directly references a ServiceDefinition by its name.\n * Plugin code accesses these services using the referenced service name.\n *\n * The `optional` field in the ServiceDefinition controls whether configuration is required:\n * - If ServiceDefinition.optional = false (default): MUST be configured\n * - If ServiceDefinition.optional = true: MAY be skipped\n *\n * Example:\n * service_definitions: [\n * { name: \"github_oauth\", oauth2: {...} },\n * { name: \"analytics\", oauth2: {...}, optional: true }\n * ]\n * system_services: [\"github_oauth\", \"analytics\"]\n * Plugin code references: \"github_oauth\", \"analytics\"\n *\n * IMPORTANT: For OAuth2 CODE grant type services, the service definition name is used\n * for callback URL generation.\n *\n * @generated from field: repeated string system_services = 13;\n */\n systemServices: string[];\n};\n\n/**\n * Manifest describes a plugin and its properties.\n *\n * ## Architecture Overview\n *\n * A plugin consists of:\n * 1. **Vertices**: The actual workflow nodes that users add to automation graphs\n * 2. **Service Definitions**: Flat declarations of services (OAuth2, HTTP Proxy, Variables, Groups, OneOf)\n * 3. **System Services**: String array referencing service definitions used at the plugin level\n *\n * ## Service Architecture\n *\n * **Service definitions are ALWAYS flat** - they exist at the top level of the manifest\n * and are never nested within each other. This includes:\n * - Oauth2Definition\n * - HttpProxyDefinition\n * - VariableDefinition\n * - GroupedDefinition (references other flat definitions)\n * - OneOfDefinition (references other flat definitions)\n *\n * **Services are referenced by name as strings**. Service lists are string arrays where each\n * string must match a ServiceDefinition's `name`. Services exist at two levels:\n * - `system_services`: Plugin-level services configured once for the entire plugin\n * - `user_services` (in Vertex): Vertex-level services configured per vertex instance\n *\n * The `optional` field in ServiceDefinition controls whether a service must be configured:\n * - `optional: false` (default): User MUST configure this service\n * - `optional: true`: User MAY skip configuring this service\n *\n * ## Example Structure\n *\n * ```protobuf\n * Manifest {\n * name: \"stripe_plugin\"\n * version: \"1.0.0\"\n *\n * // Flat service definitions at manifest level\n * service_definitions: [\n * { name: \"stripe_oauth\", oauth2: {...} },\n * { name: \"stripe_api\", http_proxy: {...} },\n * { name: \"webhook_secret\", variable: {...} }\n * ]\n *\n * // System-level services (plugin-wide)\n * // Each string references a service definition name\n * system_services: [\"stripe_oauth\"]\n *\n * // Vertices with their own service references\n * vertices: [\n * {\n * name: \"CreatePayment\",\n * user_services: [\"stripe_api\", \"webhook_secret\"]\n * }\n * ]\n * }\n * ```\n *\n * ## Security Considerations\n *\n * The platform ensures that secrets and certificates are stored and transmitted securely.\n *\n * *** Plugin authors must also ensure that their implementations\n * handle sensitive data appropriately! ***\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Manifest\n */\nexport type ManifestJson = {\n /**\n * 'name' is the alpha-numeric identifier of the plugin. Must be conform to a ES variable name\n *\n * @generated from field: string name = 1;\n */\n name?: string;\n\n /**\n * 'version' is the plugin's version, following SemVer 2.0: https://semver.org/\n *\n * @generated from field: string version = 2;\n */\n version?: string;\n\n /**\n * 'label' is a human-friendly label displayed in the UI.\n *\n * @generated from field: string label = 3;\n */\n label?: string;\n\n /**\n * 'description' is a short, human-friendly description displayed in the UI.\n *\n * @generated from field: string description = 4;\n */\n description?: string;\n\n /**\n * 'organization' is the id of the organization the user belongs to.\n *\n * @generated from field: string organization = 5;\n */\n organization?: string;\n\n /**\n * 'homepage' is the plugin's homepage URL.\n *\n * @generated from field: optional string homepage = 6;\n */\n homepage?: string;\n\n /**\n * 'repository' is the plugin's repository URL.\n *\n * @generated from field: optional string repository = 7;\n */\n repository?: string;\n\n /**\n * 'bugs' is the URL or email for reporting bugs.\n *\n * @generated from field: optional string bugs = 8;\n */\n bugs?: string;\n\n /**\n * 'author' is the name of the plugin's author.\n *\n * @generated from field: optional string author = 9;\n */\n author?: string;\n\n /**\n * 'logo' is an optional path to the plugin logo.\n * The logo will be resized to a maximum of 80x80 pixels.\n * - Supported file formats:\n * - GIF: .gif\n * - JPEG: .jpg, .jpeg, .jfif, .pjpeg, .pjp\n * - PNG: .png\n * - SVG: .svg\n * - WEBP: .webp\n * - AVIF: .avif\n *\n * @generated from field: optional string logo = 10;\n */\n logo?: string;\n\n /**\n * 'vertices' is a list of vertices that constitute the plugin.\n * this is filled in automatically when configurating a project on the filesystem\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.Vertex vertices = 11;\n */\n vertices?: VertexJson[];\n\n /**\n * 'service_definitions' are flat service definitions that can be referenced by bindings.\n *\n * All service definitions exist at this top level - they are NEVER nested.\n * Definitions can be referenced by:\n * - system_services (plugin-level bindings)\n * - user_services in vertices (vertex-level bindings)\n *\n * Each definition has a unique name used for referencing in bindings.\n * Service types: OAuth2, HTTP Proxy, Variable, Group, OneOf.\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.ServiceDefinition service_definitions = 12;\n */\n serviceDefinitions?: ServiceDefinitionJson[];\n\n /**\n * 'system_services' are plugin-level services configured once for the entire plugin.\n *\n * System services are:\n * - Configured by plugin administrators (via PostPluginSettings API)\n * - Shared across all vertices in the plugin\n * - Required to be configured before the plugin can be used (status = ACTIVE), unless marked optional\n *\n * This is a string array where each string directly references a ServiceDefinition by its name.\n * Plugin code accesses these services using the referenced service name.\n *\n * The `optional` field in the ServiceDefinition controls whether configuration is required:\n * - If ServiceDefinition.optional = false (default): MUST be configured\n * - If ServiceDefinition.optional = true: MAY be skipped\n *\n * Example:\n * service_definitions: [\n * { name: \"github_oauth\", oauth2: {...} },\n * { name: \"analytics\", oauth2: {...}, optional: true }\n * ]\n * system_services: [\"github_oauth\", \"analytics\"]\n * Plugin code references: \"github_oauth\", \"analytics\"\n *\n * IMPORTANT: For OAuth2 CODE grant type services, the service definition name is used\n * for callback URL generation.\n *\n * @generated from field: repeated string system_services = 13;\n */\n systemServices?: string[];\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Manifest.\n * Use `create(ManifestSchema)` to create a new message.\n */\nexport const ManifestSchema: GenMessage<Manifest, {jsonType: ManifestJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_manifest, 0);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/service_definition.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { GroupedDefinition, GroupedDefinitionJson, OneOfDefinition, OneOfDefinitionJson } from \"./compound_services_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_compound_services } from \"./compound_services_pb\";\nimport type { HttpProxyDefinition, HttpProxyDefinitionJson } from \"./http_proxy_service_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_http_proxy_service } from \"./http_proxy_service_pb\";\nimport type { Oauth2Definition, Oauth2DefinitionJson } from \"./oauth2_service_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_oauth2_service } from \"./oauth2_service_pb\";\nimport type { VariableDefinition, VariableDefinitionJson } from \"./variable_service_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_variable_service } from \"./variable_service_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/service_definition.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_service_definition: GenFile = /*@__PURE__*/\n fileDesc(\"CjZtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9zZXJ2aWNlX2RlZmluaXRpb24ucHJvdG8SHW1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxIqMEChFTZXJ2aWNlRGVmaW5pdGlvbhIzCgRuYW1lGAEgASgJQiW6SCJyIBABGGQyGl5bXyRhLXpBLVpdW18kYS16QS1aMC05XSokEhgKBWxhYmVsGAIgASgJQgm6SAZyBBABGGQSJAoLZGVzY3JpcHRpb24YAyABKAlCCrpIB3IFEAEY+gFIAYgBARIVCghvcHRpb25hbBgEIAEoCEgCiAEBEkUKCHZhcmlhYmxlGAUgASgLMjEubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuVmFyaWFibGVEZWZpbml0aW9uSAASQQoGb2F1dGgyGAYgASgLMi8ubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuT2F1dGgyRGVmaW5pdGlvbkgAEkgKCmh0dHBfcHJveHkYByABKAsyMi5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5IdHRwUHJveHlEZWZpbml0aW9uSAASQQoFZ3JvdXAYCCABKAsyMC5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5Hcm91cGVkRGVmaW5pdGlvbkgAEj8KBW9uZW9mGAkgASgLMi4ubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuT25lT2ZEZWZpbml0aW9uSABCDQoEdHlwZRIFukgCCAFCDgoMX2Rlc2NyaXB0aW9uQgsKCV9vcHRpb25hbGIGcHJvdG8z\", [file_buf_validate_validate, file_mochabugapis_adapt_plugins_v1_compound_services, file_mochabugapis_adapt_plugins_v1_http_proxy_service, file_mochabugapis_adapt_plugins_v1_oauth2_service, file_mochabugapis_adapt_plugins_v1_variable_service]);\n\n/**\n * The service definition - a flat declaration of a service that can be referenced by bindings.\n *\n * ## Architecture Principle: Service Definitions Are Always Flat\n *\n * Service definitions exist ONLY at the Manifest.service_definitions level and are NEVER nested.\n * Each definition has a unique name and a specific type (Variable, OAuth2, HTTP Proxy, Group, OneOf).\n *\n * ## Referencing from Service Lists\n *\n * Service lists (Manifest.system_services and Vertex.user_services) are string arrays that\n * directly reference service definitions by name. Each string must match a ServiceDefinition's `name`.\n *\n * ## Service Types\n *\n * - **VariableDefinition**: JSON variable with schema validation\n * - **Oauth2Definition**: OAuth2 authentication (various grant types)\n * - **HttpProxyDefinition**: HTTP proxy with TLS and header injection\n * - **GroupedDefinition**: References multiple other flat definitions as a group\n * - **OneOfDefinition**: Allows user to choose one from multiple flat definitions\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"api_key\", variable: { schema: {...} } },\n * { name: \"oauth\", oauth2: { grant_type: AUTHORIZATION_CODE, ... } },\n * { name: \"proxy\", http_proxy: { allowed_hosts: [...], ... } }\n * ]\n *\n * // Referenced in service lists (strings matching service definition names)\n * system_services: [\"oauth\"]\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.ServiceDefinition\n */\nexport type ServiceDefinition = Message<\"mochabugapis.adapt.plugins.v1.ServiceDefinition\"> & {\n /**\n * 'name' is the identifier of the service, referenced in code\n *\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * 'label' is a human-friendly label shown in the UI\n *\n * @generated from field: string label = 2;\n */\n label: string;\n\n /**\n * 'description' is an optional detailed description of the service\n *\n * @generated from field: optional string description = 3;\n */\n description?: string;\n\n /**\n * Whether this service is optional.\n *\n * If false (default):\n * - User MUST configure this service during installation\n * - Plugin can safely assume the service exists\n *\n * If true:\n * - User MAY skip configuring this service\n * - Plugin must handle the service being absent\n * - Useful for optional features (analytics, monitoring, etc.)\n *\n * @generated from field: optional bool optional = 4;\n */\n optional?: boolean;\n\n /**\n * The actual type of service that the definition is\n *\n * @generated from oneof mochabugapis.adapt.plugins.v1.ServiceDefinition.type\n */\n type: {\n /**\n * Variable service containing arbitrary JSON\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.VariableDefinition variable = 5;\n */\n value: VariableDefinition;\n case: \"variable\";\n } | {\n /**\n * An OAuth2 service\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.Oauth2Definition oauth2 = 6;\n */\n value: Oauth2Definition;\n case: \"oauth2\";\n } | {\n /**\n * HTTP proxy service with TLS and header injection\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.HttpProxyDefinition http_proxy = 7;\n */\n value: HttpProxyDefinition;\n case: \"httpProxy\";\n } | {\n /**\n * A group definition, requiring it to be submitted as a group\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.GroupedDefinition group = 8;\n */\n value: GroupedDefinition;\n case: \"group\";\n } | {\n /**\n * A oneof definition, allowing one of several sub-definitions to be chosen\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.OneOfDefinition oneof = 9;\n */\n value: OneOfDefinition;\n case: \"oneof\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * The service definition - a flat declaration of a service that can be referenced by bindings.\n *\n * ## Architecture Principle: Service Definitions Are Always Flat\n *\n * Service definitions exist ONLY at the Manifest.service_definitions level and are NEVER nested.\n * Each definition has a unique name and a specific type (Variable, OAuth2, HTTP Proxy, Group, OneOf).\n *\n * ## Referencing from Service Lists\n *\n * Service lists (Manifest.system_services and Vertex.user_services) are string arrays that\n * directly reference service definitions by name. Each string must match a ServiceDefinition's `name`.\n *\n * ## Service Types\n *\n * - **VariableDefinition**: JSON variable with schema validation\n * - **Oauth2Definition**: OAuth2 authentication (various grant types)\n * - **HttpProxyDefinition**: HTTP proxy with TLS and header injection\n * - **GroupedDefinition**: References multiple other flat definitions as a group\n * - **OneOfDefinition**: Allows user to choose one from multiple flat definitions\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"api_key\", variable: { schema: {...} } },\n * { name: \"oauth\", oauth2: { grant_type: AUTHORIZATION_CODE, ... } },\n * { name: \"proxy\", http_proxy: { allowed_hosts: [...], ... } }\n * ]\n *\n * // Referenced in service lists (strings matching service definition names)\n * system_services: [\"oauth\"]\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.ServiceDefinition\n */\nexport type ServiceDefinitionJson = {\n /**\n * 'name' is the identifier of the service, referenced in code\n *\n * @generated from field: string name = 1;\n */\n name?: string;\n\n /**\n * 'label' is a human-friendly label shown in the UI\n *\n * @generated from field: string label = 2;\n */\n label?: string;\n\n /**\n * 'description' is an optional detailed description of the service\n *\n * @generated from field: optional string description = 3;\n */\n description?: string;\n\n /**\n * Whether this service is optional.\n *\n * If false (default):\n * - User MUST configure this service during installation\n * - Plugin can safely assume the service exists\n *\n * If true:\n * - User MAY skip configuring this service\n * - Plugin must handle the service being absent\n * - Useful for optional features (analytics, monitoring, etc.)\n *\n * @generated from field: optional bool optional = 4;\n */\n optional?: boolean;\n\n /**\n * Variable service containing arbitrary JSON\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.VariableDefinition variable = 5;\n */\n variable?: VariableDefinitionJson;\n\n /**\n * An OAuth2 service\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.Oauth2Definition oauth2 = 6;\n */\n oauth2?: Oauth2DefinitionJson;\n\n /**\n * HTTP proxy service with TLS and header injection\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.HttpProxyDefinition http_proxy = 7;\n */\n httpProxy?: HttpProxyDefinitionJson;\n\n /**\n * A group definition, requiring it to be submitted as a group\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.GroupedDefinition group = 8;\n */\n group?: GroupedDefinitionJson;\n\n /**\n * A oneof definition, allowing one of several sub-definitions to be chosen\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.OneOfDefinition oneof = 9;\n */\n oneof?: OneOfDefinitionJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.ServiceDefinition.\n * Use `create(ServiceDefinitionSchema)` to create a new message.\n */\nexport const ServiceDefinitionSchema: GenMessage<ServiceDefinition, {jsonType: ServiceDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_service_definition, 0);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/compound_services.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/compound_services.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_compound_services: GenFile = /*@__PURE__*/\n fileDesc(\"CjVtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9jb21wb3VuZF9zZXJ2aWNlcy5wcm90bxIdbW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEiJQoRR3JvdXBlZERlZmluaXRpb24SEAoIc2VydmljZXMYASADKAkikQMKD09uZU9mRGVmaW5pdGlvbhKFAQoHb3B0aW9ucxgBIAMoCzI7Lm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk9uZU9mRGVmaW5pdGlvbi5PcHRpb25zRW50cnlCN7pINJoBMQgBEDIiInIgEAEYZDIaXltfJGEtekEtWl1bXyRhLXpBLVowLTldKiQqB3IFEAEY+gESOwoHZGVmYXVsdBgCIAEoCUIlukgiciAQARhkMhpeW18kYS16QS1aXVtfJGEtekEtWjAtOV0qJEgAiAEBGi4KDE9wdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBOn26SHoaeAoSZGVmYXVsdF9pbl9vcHRpb25zEi5kZWZhdWx0IG11c3QgZXhpc3QgYXMgYSBrZXkgaW4gdGhlIG9wdGlvbnMgbWFwGjIhaGFzKHRoaXMuZGVmYXVsdCkgfHwgdGhpcy5kZWZhdWx0IGluIHRoaXMub3B0aW9uc0IKCghfZGVmYXVsdGIGcHJvdG8z\", [file_buf_validate_validate]);\n\n/**\n * A grouped service definition that references multiple other flat service definitions.\n *\n * ## Architecture: Groups Reference Flat Definitions\n *\n * GroupedDefinition is itself a flat service definition at the Manifest.service_definitions level.\n * It references OTHER flat service definitions by name as a string array.\n *\n * ## Purpose\n *\n * Groups allow plugin authors to bundle related services together. For example:\n * - Production and sandbox environments for the same API\n * - Multiple related API keys\n * - Primary and backup authentication methods\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"stripe_prod\", label: \"Stripe Production\", oauth2: {...} },\n * { name: \"stripe_sandbox\", label: \"Stripe Sandbox\", oauth2: {...}, optional: true },\n * {\n * name: \"stripe_envs\",\n * label: \"Stripe Environments\",\n * group: {\n * services: [\"stripe_prod\", \"stripe_sandbox\"]\n * }\n * }\n * ]\n *\n * // Referenced in system services list\n * system_services: [\"stripe_envs\"]\n *\n * // Plugin code accesses members with dot notation:\n * \"stripe_envs.stripe_prod\", \"stripe_envs.stripe_sandbox\"\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.GroupedDefinition\n */\nexport type GroupedDefinition = Message<\"mochabugapis.adapt.plugins.v1.GroupedDefinition\"> & {\n /**\n * References to other flat service definitions that comprise this group\n *\n * @generated from field: repeated string services = 1;\n */\n services: string[];\n};\n\n/**\n * A grouped service definition that references multiple other flat service definitions.\n *\n * ## Architecture: Groups Reference Flat Definitions\n *\n * GroupedDefinition is itself a flat service definition at the Manifest.service_definitions level.\n * It references OTHER flat service definitions by name as a string array.\n *\n * ## Purpose\n *\n * Groups allow plugin authors to bundle related services together. For example:\n * - Production and sandbox environments for the same API\n * - Multiple related API keys\n * - Primary and backup authentication methods\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"stripe_prod\", label: \"Stripe Production\", oauth2: {...} },\n * { name: \"stripe_sandbox\", label: \"Stripe Sandbox\", oauth2: {...}, optional: true },\n * {\n * name: \"stripe_envs\",\n * label: \"Stripe Environments\",\n * group: {\n * services: [\"stripe_prod\", \"stripe_sandbox\"]\n * }\n * }\n * ]\n *\n * // Referenced in system services list\n * system_services: [\"stripe_envs\"]\n *\n * // Plugin code accesses members with dot notation:\n * \"stripe_envs.stripe_prod\", \"stripe_envs.stripe_sandbox\"\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.GroupedDefinition\n */\nexport type GroupedDefinitionJson = {\n /**\n * References to other flat service definitions that comprise this group\n *\n * @generated from field: repeated string services = 1;\n */\n services?: string[];\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.GroupedDefinition.\n * Use `create(GroupedDefinitionSchema)` to create a new message.\n */\nexport const GroupedDefinitionSchema: GenMessage<GroupedDefinition, {jsonType: GroupedDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_compound_services, 0);\n\n/**\n * A one-of service definition that allows users to choose from multiple flat service definitions.\n *\n * ## Architecture: One-Of References Flat Definitions\n *\n * OneOfDefinition is itself a flat service definition at the Manifest.service_definitions level.\n * It references OTHER flat service definitions by name.\n *\n * ## Purpose\n *\n * One-of definitions allow plugins to support multiple alternative implementations:\n * - Different payment providers (Stripe, PayPal, Square)\n * - Different authentication methods (OAuth2, API Key, mTLS)\n * - Different deployment environments\n *\n * Users choose ONE option during plugin installation/configuration.\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"stripe_oauth\", label: \"Stripe OAuth\", oauth2: {...} },\n * { name: \"paypal_oauth\", label: \"PayPal OAuth\", oauth2: {...} },\n * { name: \"square_oauth\", label: \"Square OAuth\", oauth2: {...} },\n * {\n * name: \"payment_provider\",\n * label: \"Payment Provider\",\n * oneof: {\n * options: {\n * \"stripe_oauth\": \"Stripe\",\n * \"paypal_oauth\": \"PayPal\",\n * \"square_oauth\": \"Square\"\n * },\n * default: \"stripe_oauth\"\n * }\n * }\n * ]\n *\n * // Referenced in system services list\n * system_services: [\"payment_provider\"]\n *\n * // Plugin code accesses using the service name:\n * \"payment_provider\" (regardless of which provider user chose)\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.OneOfDefinition\n */\nexport type OneOfDefinition = Message<\"mochabugapis.adapt.plugins.v1.OneOfDefinition\"> & {\n /**\n * Map of service definition options users can choose from.\n *\n * Key: Service definition name (from Manifest.service_definitions)\n * Value: Human-friendly label shown to users during selection\n *\n * The map key must reference an existing ServiceDefinition.name.\n * The map value is displayed to users when choosing between options.\n *\n * ## Examples\n *\n * Basic options:\n * options: {\n * \"stripe_oauth\": \"Stripe\",\n * \"paypal_oauth\": \"PayPal\"\n * }\n *\n * Descriptive labels:\n * options: {\n * \"stripe_oauth\": \"Stripe (recommended for production)\",\n * \"paypal_oauth\": \"PayPal (simpler setup)\"\n * }\n *\n * @generated from field: map<string, string> options = 1;\n */\n options: { [key: string]: string };\n\n /**\n * Optional default selection.\n *\n * If specified, this service definition will be pre-selected in the UI during installation.\n * Users can still choose a different option.\n *\n * The default value MUST match one of the keys in the options map.\n *\n * Use this to:\n * - Suggest the most common choice\n * - Indicate the recommended option\n * - Set a safe default for new users\n *\n * ## Default Behavior: System Settings vs User Settings\n *\n * **System Settings** (Manifest.system_services):\n * - Default selection is automatically applied when the plugin is installed\n * - The service is marked as \"configured\" if the default option has all required values\n * - Plugin creators define and approve these defaults\n *\n * **User Settings** (Vertex.user_services):\n * - Default selection is a UI hint only and NOT automatically applied\n * - The service is NOT marked as \"configured\" until the user explicitly submits settings\n * - Users must review and approve the selection, even with a default present\n * - This ensures users actively consent to which option is selected\n *\n * ## Rationale\n *\n * System settings use automatic defaults because the plugin creator (who defines\n * the defaults) is also the one approving them during plugin development.\n *\n * User settings require explicit submission because end users need to review and\n * consciously approve which option is selected and configured.\n *\n * @generated from field: optional string default = 2;\n */\n default?: string;\n};\n\n/**\n * A one-of service definition that allows users to choose from multiple flat service definitions.\n *\n * ## Architecture: One-Of References Flat Definitions\n *\n * OneOfDefinition is itself a flat service definition at the Manifest.service_definitions level.\n * It references OTHER flat service definitions by name.\n *\n * ## Purpose\n *\n * One-of definitions allow plugins to support multiple alternative implementations:\n * - Different payment providers (Stripe, PayPal, Square)\n * - Different authentication methods (OAuth2, API Key, mTLS)\n * - Different deployment environments\n *\n * Users choose ONE option during plugin installation/configuration.\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"stripe_oauth\", label: \"Stripe OAuth\", oauth2: {...} },\n * { name: \"paypal_oauth\", label: \"PayPal OAuth\", oauth2: {...} },\n * { name: \"square_oauth\", label: \"Square OAuth\", oauth2: {...} },\n * {\n * name: \"payment_provider\",\n * label: \"Payment Provider\",\n * oneof: {\n * options: {\n * \"stripe_oauth\": \"Stripe\",\n * \"paypal_oauth\": \"PayPal\",\n * \"square_oauth\": \"Square\"\n * },\n * default: \"stripe_oauth\"\n * }\n * }\n * ]\n *\n * // Referenced in system services list\n * system_services: [\"payment_provider\"]\n *\n * // Plugin code accesses using the service name:\n * \"payment_provider\" (regardless of which provider user chose)\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.OneOfDefinition\n */\nexport type OneOfDefinitionJson = {\n /**\n * Map of service definition options users can choose from.\n *\n * Key: Service definition name (from Manifest.service_definitions)\n * Value: Human-friendly label shown to users during selection\n *\n * The map key must reference an existing ServiceDefinition.name.\n * The map value is displayed to users when choosing between options.\n *\n * ## Examples\n *\n * Basic options:\n * options: {\n * \"stripe_oauth\": \"Stripe\",\n * \"paypal_oauth\": \"PayPal\"\n * }\n *\n * Descriptive labels:\n * options: {\n * \"stripe_oauth\": \"Stripe (recommended for production)\",\n * \"paypal_oauth\": \"PayPal (simpler setup)\"\n * }\n *\n * @generated from field: map<string, string> options = 1;\n */\n options?: { [key: string]: string };\n\n /**\n * Optional default selection.\n *\n * If specified, this service definition will be pre-selected in the UI during installation.\n * Users can still choose a different option.\n *\n * The default value MUST match one of the keys in the options map.\n *\n * Use this to:\n * - Suggest the most common choice\n * - Indicate the recommended option\n * - Set a safe default for new users\n *\n * ## Default Behavior: System Settings vs User Settings\n *\n * **System Settings** (Manifest.system_services):\n * - Default selection is automatically applied when the plugin is installed\n * - The service is marked as \"configured\" if the default option has all required values\n * - Plugin creators define and approve these defaults\n *\n * **User Settings** (Vertex.user_services):\n * - Default selection is a UI hint only and NOT automatically applied\n * - The service is NOT marked as \"configured\" until the user explicitly submits settings\n * - Users must review and approve the selection, even with a default present\n * - This ensures users actively consent to which option is selected\n *\n * ## Rationale\n *\n * System settings use automatic defaults because the plugin creator (who defines\n * the defaults) is also the one approving them during plugin development.\n *\n * User settings require explicit submission because end users need to review and\n * consciously approve which option is selected and configured.\n *\n * @generated from field: optional string default = 2;\n */\n default?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.OneOfDefinition.\n * Use `create(OneOfDefinitionSchema)` to create a new message.\n */\nexport const OneOfDefinitionSchema: GenMessage<OneOfDefinition, {jsonType: OneOfDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_compound_services, 1);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/http_proxy_service.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenEnum, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { File, FileJson } from \"./file_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_file } from \"./file_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/http_proxy_service.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_http_proxy_service: GenFile = /*@__PURE__*/\n fileDesc(\"CjZtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9odHRwX3Byb3h5X3NlcnZpY2UucHJvdG8SHW1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxItMFChNIdHRwUHJveHlEZWZpbml0aW9uEo4BCg1hbGxvd2VkX2hvc3RzGAEgAygJQne6SHSSAXEIARBkGAEiaXJnEAEY/wEyYF4oXCpcLik/W2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyhcLlthLXowLTldKFthLXowLTktXXswLDYxfVthLXowLTldKT8pKyg6WzAtOV17MSw1fSk/JBI+CgN0bHMYAiABKAsyLC5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5UbHNEZWZpbml0aW9uSACIAQESjgEKDmluamVjdF9oZWFkZXJzGAMgAygLMkUubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuSHR0cFByb3h5RGVmaW5pdGlvbi5JbmplY3RIZWFkZXJzRW50cnlCL7pILJoBKSInciUQARiAAjIeXlshIyQlJicqK1wtLjAtOUEtWl5fYGEtenx+XSskGmMKEkluamVjdEhlYWRlcnNFbnRyeRILCgNrZXkYASABKAkSPAoFdmFsdWUYAiABKAsyLS5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5IZWFkZXJUZW1wbGF0ZToCOAE67AG6SOgBGuUBCh9odHRwX3Byb3h5X2RlZmluaXRpb24ubm90X2VtcHR5EpABSHR0cFByb3h5RGVmaW5pdGlvbiBtdXN0IGNvbmZpZ3VyZSBlaXRoZXIgVExTICh0bHMgZmllbGQpIG9yIGhlYWRlciBpbmplY3Rpb24gKGluamVjdF9oZWFkZXJzKSwgb3RoZXJ3aXNlIHRoZSBwcm94eSBwcm92aWRlcyBubyBhZGRpdGlvbmFsIHZhbHVlGi9oYXModGhpcy50bHMpIHx8IHRoaXMuaW5qZWN0X2hlYWRlcnMuc2l6ZSgpID4gMEIGCgRfdGxzImoKDkhlYWRlclRlbXBsYXRlEkUKCHRlbXBsYXRlGAEgASgJQjO6SDByLhABGIBAMideKD86W14lXXwlJXwlW0EtWmEtel9dW0EtWmEtejAtOV9dKiUpKyQSEQoJcGxhaW50ZXh0GAIgASgIIv4CCg1UbHNEZWZpbml0aW9uEksKBG1vZGUYASABKA4yMS5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5UbHNEZWZpbml0aW9uLk1vZGVCCrpIB4IBBBABIAASfQoQY2VydGlmaWNhdGVfaG9zdBgCIAEoCUJeukhbclkQARj9ATJSXihcKlwuKT9bYS16MC05XShbYS16MC05LV17MCw2MX1bYS16MC05XSk/KFwuW2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPykqJEgAiAEBEjsKCWNhX2J1bmRsZRgDIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVIAYgBASJBCgRNb2RlEhQKEE1PREVfVU5TUEVDSUZJRUQQABINCglNT0RFX01UTFMQARIUChBNT0RFX1NFUlZFUl9PTkxZEAJCEwoRX2NlcnRpZmljYXRlX2hvc3RCDAoKX2NhX2J1bmRsZSL0AQoJVGxzQ29uZmlnEjsKCWNhX2J1bmRsZRgBIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVIAIgBARI9CgtjZXJ0aWZpY2F0ZRgCIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVIAYgBARI9Cgtwcml2YXRlX2tleRgDIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVIAogBAUIMCgpfY2FfYnVuZGxlQg4KDF9jZXJ0aWZpY2F0ZUIOCgxfcHJpdmF0ZV9rZXkiqgIKD0h0dHBQcm94eUNvbmZpZxJBCgp0bHNfY29uZmlnGAEgASgLMigubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuVGxzQ29uZmlnSACIAQESXQoQaGVhZGVyX3ZhcmlhYmxlcxgCIAMoCzJDLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkh0dHBQcm94eUNvbmZpZy5IZWFkZXJWYXJpYWJsZXNFbnRyeRpmChRIZWFkZXJWYXJpYWJsZXNFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5IZWFkZXJWYXJpYWJsZXM6AjgBQg0KC190bHNfY29uZmlnIs0BCg9IZWFkZXJWYXJpYWJsZXMShwEKCXZhcmlhYmxlcxgBIAMoCzI9Lm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkhlYWRlclZhcmlhYmxlcy5WYXJpYWJsZXNFbnRyeUI1ukgymgEvEDIiIXIfEAEYgAEyGF5bQS1aYS16X11bQS1aYS16MC05X10qJCoIcgYQARiAgAEaMAoOVmFyaWFibGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AWIGcHJvdG8z\", [file_buf_validate_validate, file_mochabugapis_adapt_plugins_v1_file]);\n\n/**\n * The http proxy service definition\n *\n * This service provides HTTP proxy capabilities with optional TLS configuration\n * and dynamic header injection for outgoing requests.\n *\n * An HTTP proxy configuration must do at least one of the following:\n * - Configure custom TLS settings (self-signed certs, mTLS, CA pinning)\n * - Inject dynamic headers using template variables\n *\n * If neither TLS nor header injection is configured, the proxy provides no value\n * and the plugin should use direct HTTP requests instead.\n *\n * Example use cases:\n * - Adding authentication headers to upstream services (Bearer tokens, API keys)\n * - Injecting custom correlation IDs or tracking headers\n * - Using mutual TLS (mTLS) for B2B API authentication\n * - Connecting to services with self-signed certificates\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HttpProxyDefinition\n */\nexport type HttpProxyDefinition = Message<\"mochabugapis.adapt.plugins.v1.HttpProxyDefinition\"> & {\n /**\n * REQUIRED: Allowed upstream hosts that this proxy can connect to.\n *\n * Plugin authors define which external services the plugin will communicate with.\n * Only publicly accessible hosts are allowed; private IP addresses and non-globally\n * resolvable hostnames are blocked by the platform.\n *\n * ## Transparency & User Visibility\n *\n * IMPORTANT: This list is VISIBLE to users during plugin installation and in plugin settings.\n * Users can see exactly which external endpoints your plugin will connect to.\n *\n * Plugin authors MUST be transparent about:\n * - Which services the plugin connects to\n * - Why the plugin needs to connect to these hosts\n * - What data is sent to these endpoints\n *\n * Plugins that attempt to hide their network activity or connect to undisclosed endpoints\n * will be flagged as malicious and removed from the plugin marketplace.\n *\n * ## Format\n *\n * Each entry must be a valid hostname or publicly routable IP address, optionally with a port:\n * - \"api.example.com\" - Exact hostname match\n * - \"*.example.com\" - Wildcard subdomain match (matches api.example.com, service.example.com, etc.)\n * - \"api.example.com:8443\" - Hostname with specific port\n * - \"*.example.com:8443\" - Wildcard subdomain with specific port\n *\n * ## Wildcard Rules\n *\n * - \"*\" at the start means \"any subdomain\" but NOT the root domain\n * - \"*.example.com\" matches \"api.example.com\" but NOT \"example.com\"\n * - To allow both, add both entries: [\"*.example.com\", \"example.com\"]\n *\n * - Wildcards only supported at the subdomain level\n * - Valid: \"*.example.com\", \"*.api.example.com\"\n * - Invalid: \"api.*.com\", \"*\", \"example.*\"\n *\n * ## Port Matching\n *\n * - If no port specified: matches any port on that host\n * - \"api.example.com\" matches api.example.com:80, api.example.com:443, api.example.com:8080\n *\n * - If port specified: matches only that specific port\n * - \"api.example.com:443\" matches ONLY api.example.com:443\n * - Does NOT match api.example.com:80 or api.example.com:8443\n *\n * ## Restrictions\n *\n * The following are blocked and will cause validation errors:\n * - Private IP ranges (RFC 1918): 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16\n * - Loopback addresses: 127.0.0.0/8, ::1\n * - Link-local addresses: 169.254.0.0/16, fe80::/10\n * - Non-globally resolvable hostnames: localhost, *.local, *.internal\n *\n * ## Examples\n *\n * 1. Single API endpoint:\n * allowed_hosts: [\"api.example.com\"]\n *\n * 2. Multiple environments:\n * allowed_hosts: [\"api.prod.example.com\", \"api.staging.example.com\"]\n *\n * 3. All subdomains of a service:\n * allowed_hosts: [\"*.service.example.com\", \"service.example.com\"]\n *\n * 4. Specific port (e.g., non-standard HTTPS):\n * allowed_hosts: [\"api.example.com:8443\"]\n *\n * @generated from field: repeated string allowed_hosts = 1;\n */\n allowedHosts: string[];\n\n /**\n * Optional TLS configuration for the upstream connection.\n *\n * If not specified:\n * - The protocol (HTTP/HTTPS) is forwarded from the incoming request\n * - HTTP requests are proxied as HTTP\n * - HTTPS requests are proxied as HTTPS using the system's default trust store\n * (publicly trusted Certificate Authorities like Let's Encrypt, DigiCert, etc.)\n *\n * If specified:\n * - For MODE_SERVER_ONLY: Validates the server certificate against the provided ca_bundle\n * - For MODE_MTLS: Performs mutual TLS authentication with client certificate\n *\n * Use this when:\n * - Upstream uses self-signed certificates (provide custom ca_bundle)\n * - Upstream requires mutual TLS (provide client certificate and private key)\n * - Need to pin specific CA certificates for security\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.TlsDefinition tls = 2;\n */\n tls?: TlsDefinition;\n\n /**\n * Dynamic headers to inject into every proxied request using template variables.\n *\n * This field is for headers that require DYNAMIC values resolved from template variables.\n * The caller can always submit static headers directly with each request - this field\n * is specifically for injecting headers that use variable substitution (e.g., %ACCESS_TOKEN%).\n *\n * ## When to Use inject_headers\n *\n * Use this field when you need to inject headers with:\n * - Values that change per request or per user (tokens, session IDs)\n * - Values that come from user configuration (API keys, tenant IDs)\n * - Values that need to be kept secret (credentials, tokens)\n * - Dynamic template substitution using %VARIABLE% syntax\n *\n * ## When NOT to Use inject_headers\n *\n * Do NOT use this field for:\n * - Static headers that never change (use direct headers in the request)\n * - Headers that the caller controls (they can submit these directly)\n * - Constant values like \"Content-Type: application/json\"\n *\n * The caller can always add, modify, or override headers in their individual requests.\n * This field is for headers that the plugin definition requires to be injected with\n * dynamic values before reaching the upstream service.\n *\n * ## Header Processing\n *\n * The map key is the HTTP header name (e.g., \"Authorization\", \"X-Api-Key\").\n * Header names are case-insensitive per RFC 7230 but will be sent as specified.\n *\n * If the same header name appears in both inject_headers and the caller's request:\n * - The inject_headers value takes precedence (overrides caller's value)\n * - This ensures plugin-level authentication/configuration is always applied\n *\n * ## Common Patterns\n *\n * - \"Authorization\": \"Bearer %ACCESS_TOKEN%\" - Dynamic OAuth2 token\n * - \"X-Api-Key\": \"%API_KEY%\" - User-provided API key\n * - \"X-Request-ID\": \"%CORRELATION_ID%\" - Tracing identifier\n * - \"X-Tenant-ID\": \"%TENANT_ID%\" - Multi-tenant identifier\n *\n * @generated from field: map<string, mochabugapis.adapt.plugins.v1.HeaderTemplate> inject_headers = 3;\n */\n injectHeaders: { [key: string]: HeaderTemplate };\n};\n\n/**\n * The http proxy service definition\n *\n * This service provides HTTP proxy capabilities with optional TLS configuration\n * and dynamic header injection for outgoing requests.\n *\n * An HTTP proxy configuration must do at least one of the following:\n * - Configure custom TLS settings (self-signed certs, mTLS, CA pinning)\n * - Inject dynamic headers using template variables\n *\n * If neither TLS nor header injection is configured, the proxy provides no value\n * and the plugin should use direct HTTP requests instead.\n *\n * Example use cases:\n * - Adding authentication headers to upstream services (Bearer tokens, API keys)\n * - Injecting custom correlation IDs or tracking headers\n * - Using mutual TLS (mTLS) for B2B API authentication\n * - Connecting to services with self-signed certificates\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HttpProxyDefinition\n */\nexport type HttpProxyDefinitionJson = {\n /**\n * REQUIRED: Allowed upstream hosts that this proxy can connect to.\n *\n * Plugin authors define which external services the plugin will communicate with.\n * Only publicly accessible hosts are allowed; private IP addresses and non-globally\n * resolvable hostnames are blocked by the platform.\n *\n * ## Transparency & User Visibility\n *\n * IMPORTANT: This list is VISIBLE to users during plugin installation and in plugin settings.\n * Users can see exactly which external endpoints your plugin will connect to.\n *\n * Plugin authors MUST be transparent about:\n * - Which services the plugin connects to\n * - Why the plugin needs to connect to these hosts\n * - What data is sent to these endpoints\n *\n * Plugins that attempt to hide their network activity or connect to undisclosed endpoints\n * will be flagged as malicious and removed from the plugin marketplace.\n *\n * ## Format\n *\n * Each entry must be a valid hostname or publicly routable IP address, optionally with a port:\n * - \"api.example.com\" - Exact hostname match\n * - \"*.example.com\" - Wildcard subdomain match (matches api.example.com, service.example.com, etc.)\n * - \"api.example.com:8443\" - Hostname with specific port\n * - \"*.example.com:8443\" - Wildcard subdomain with specific port\n *\n * ## Wildcard Rules\n *\n * - \"*\" at the start means \"any subdomain\" but NOT the root domain\n * - \"*.example.com\" matches \"api.example.com\" but NOT \"example.com\"\n * - To allow both, add both entries: [\"*.example.com\", \"example.com\"]\n *\n * - Wildcards only supported at the subdomain level\n * - Valid: \"*.example.com\", \"*.api.example.com\"\n * - Invalid: \"api.*.com\", \"*\", \"example.*\"\n *\n * ## Port Matching\n *\n * - If no port specified: matches any port on that host\n * - \"api.example.com\" matches api.example.com:80, api.example.com:443, api.example.com:8080\n *\n * - If port specified: matches only that specific port\n * - \"api.example.com:443\" matches ONLY api.example.com:443\n * - Does NOT match api.example.com:80 or api.example.com:8443\n *\n * ## Restrictions\n *\n * The following are blocked and will cause validation errors:\n * - Private IP ranges (RFC 1918): 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16\n * - Loopback addresses: 127.0.0.0/8, ::1\n * - Link-local addresses: 169.254.0.0/16, fe80::/10\n * - Non-globally resolvable hostnames: localhost, *.local, *.internal\n *\n * ## Examples\n *\n * 1. Single API endpoint:\n * allowed_hosts: [\"api.example.com\"]\n *\n * 2. Multiple environments:\n * allowed_hosts: [\"api.prod.example.com\", \"api.staging.example.com\"]\n *\n * 3. All subdomains of a service:\n * allowed_hosts: [\"*.service.example.com\", \"service.example.com\"]\n *\n * 4. Specific port (e.g., non-standard HTTPS):\n * allowed_hosts: [\"api.example.com:8443\"]\n *\n * @generated from field: repeated string allowed_hosts = 1;\n */\n allowedHosts?: string[];\n\n /**\n * Optional TLS configuration for the upstream connection.\n *\n * If not specified:\n * - The protocol (HTTP/HTTPS) is forwarded from the incoming request\n * - HTTP requests are proxied as HTTP\n * - HTTPS requests are proxied as HTTPS using the system's default trust store\n * (publicly trusted Certificate Authorities like Let's Encrypt, DigiCert, etc.)\n *\n * If specified:\n * - For MODE_SERVER_ONLY: Validates the server certificate against the provided ca_bundle\n * - For MODE_MTLS: Performs mutual TLS authentication with client certificate\n *\n * Use this when:\n * - Upstream uses self-signed certificates (provide custom ca_bundle)\n * - Upstream requires mutual TLS (provide client certificate and private key)\n * - Need to pin specific CA certificates for security\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.TlsDefinition tls = 2;\n */\n tls?: TlsDefinitionJson;\n\n /**\n * Dynamic headers to inject into every proxied request using template variables.\n *\n * This field is for headers that require DYNAMIC values resolved from template variables.\n * The caller can always submit static headers directly with each request - this field\n * is specifically for injecting headers that use variable substitution (e.g., %ACCESS_TOKEN%).\n *\n * ## When to Use inject_headers\n *\n * Use this field when you need to inject headers with:\n * - Values that change per request or per user (tokens, session IDs)\n * - Values that come from user configuration (API keys, tenant IDs)\n * - Values that need to be kept secret (credentials, tokens)\n * - Dynamic template substitution using %VARIABLE% syntax\n *\n * ## When NOT to Use inject_headers\n *\n * Do NOT use this field for:\n * - Static headers that never change (use direct headers in the request)\n * - Headers that the caller controls (they can submit these directly)\n * - Constant values like \"Content-Type: application/json\"\n *\n * The caller can always add, modify, or override headers in their individual requests.\n * This field is for headers that the plugin definition requires to be injected with\n * dynamic values before reaching the upstream service.\n *\n * ## Header Processing\n *\n * The map key is the HTTP header name (e.g., \"Authorization\", \"X-Api-Key\").\n * Header names are case-insensitive per RFC 7230 but will be sent as specified.\n *\n * If the same header name appears in both inject_headers and the caller's request:\n * - The inject_headers value takes precedence (overrides caller's value)\n * - This ensures plugin-level authentication/configuration is always applied\n *\n * ## Common Patterns\n *\n * - \"Authorization\": \"Bearer %ACCESS_TOKEN%\" - Dynamic OAuth2 token\n * - \"X-Api-Key\": \"%API_KEY%\" - User-provided API key\n * - \"X-Request-ID\": \"%CORRELATION_ID%\" - Tracing identifier\n * - \"X-Tenant-ID\": \"%TENANT_ID%\" - Multi-tenant identifier\n *\n * @generated from field: map<string, mochabugapis.adapt.plugins.v1.HeaderTemplate> inject_headers = 3;\n */\n injectHeaders?: { [key: string]: HeaderTemplateJson };\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.HttpProxyDefinition.\n * Use `create(HttpProxyDefinitionSchema)` to create a new message.\n */\nexport const HttpProxyDefinitionSchema: GenMessage<HttpProxyDefinition, {jsonType: HttpProxyDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 0);\n\n/**\n * HeaderTemplate defines a template string using Envoy-style %VAR% syntax\n * for dynamic header value substitution.\n *\n * ## Template Syntax\n *\n * Variables are enclosed in percent signs: %VARIABLE_NAME%\n *\n * Variable names must:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Be case-sensitive\n *\n * ## Examples\n *\n * 1. Bearer Token:\n * template: \"Bearer %ACCESS_TOKEN%\"\n * Result: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n *\n * 2. API Key:\n * template: \"ApiKey %API_KEY%\"\n * Result: \"ApiKey sk_live_51HqG8sKj...\"\n *\n * 3. Multiple Variables:\n * template: \"%TENANT_ID%:%USER_ID%\"\n * Result: \"org_123:user_456\"\n *\n * 4. Mixed Static and Dynamic:\n * template: \"v1.0/%API_VERSION%/client/%CLIENT_ID%\"\n * Result: \"v1.0/2024-01/client/client_abc123\"\n *\n * ## Escaping Literal Percent Signs\n *\n * To include a literal percent sign (%) in the header value, double it:\n *\n * - template: \"100%%\" \u2192 Result: \"100%\"\n * - template: \"Completion: 95%% done\" \u2192 Result: \"Completion: 95% done\"\n * - template: \"%%VAR%%\" \u2192 Result: \"%VAR%\"\n *\n * ## Variable Resolution\n *\n * Template variables are provided by users when they configure or use the plugin.\n * For system services, plugin authors provide the variable values.\n *\n * The resolution process is transparent:\n * - Users see which hostname will receive the request (from allowed_hosts)\n * - Users see which header is being modified\n * - Users are prompted to provide values for each variable\n *\n * This ensures users know exactly what data they are sending and where it goes.\n *\n * If a variable is not provided, the header injection will fail at runtime,\n * and the proxy request will not be sent.\n *\n * ## Security Considerations\n *\n * By default, template variables are treated as SECRETS.\n *\n * Set `plaintext: true` if the variable contains non-sensitive data like:\n * - User IDs (not passwords)\n * - Tenant/Organization IDs\n * - Request correlation IDs\n * - API version numbers\n * - Public configuration values\n *\n * DO NOT set `plaintext: true` for:\n * - Access tokens, API keys, passwords\n * - Session tokens, JWTs\n * - Private keys, certificates\n * - Any credential material\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HeaderTemplate\n */\nexport type HeaderTemplate = Message<\"mochabugapis.adapt.plugins.v1.HeaderTemplate\"> & {\n /**\n * The template string using %VAR% syntax.\n *\n * Pattern: %VARIABLE_NAME% where VARIABLE_NAME matches [A-Za-z_][A-Za-z0-9_]*\n * Escape literal %: use %%\n *\n * @generated from field: string template = 1;\n */\n template: string;\n\n /**\n * If true, variables in this template are NOT treated as secrets.\n *\n * Only set to true for non-sensitive identifiers like user IDs,\n * tenant IDs, request IDs, or public configuration values.\n *\n * Default: false (variables are secrets)\n *\n * @generated from field: bool plaintext = 2;\n */\n plaintext: boolean;\n};\n\n/**\n * HeaderTemplate defines a template string using Envoy-style %VAR% syntax\n * for dynamic header value substitution.\n *\n * ## Template Syntax\n *\n * Variables are enclosed in percent signs: %VARIABLE_NAME%\n *\n * Variable names must:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Be case-sensitive\n *\n * ## Examples\n *\n * 1. Bearer Token:\n * template: \"Bearer %ACCESS_TOKEN%\"\n * Result: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n *\n * 2. API Key:\n * template: \"ApiKey %API_KEY%\"\n * Result: \"ApiKey sk_live_51HqG8sKj...\"\n *\n * 3. Multiple Variables:\n * template: \"%TENANT_ID%:%USER_ID%\"\n * Result: \"org_123:user_456\"\n *\n * 4. Mixed Static and Dynamic:\n * template: \"v1.0/%API_VERSION%/client/%CLIENT_ID%\"\n * Result: \"v1.0/2024-01/client/client_abc123\"\n *\n * ## Escaping Literal Percent Signs\n *\n * To include a literal percent sign (%) in the header value, double it:\n *\n * - template: \"100%%\" \u2192 Result: \"100%\"\n * - template: \"Completion: 95%% done\" \u2192 Result: \"Completion: 95% done\"\n * - template: \"%%VAR%%\" \u2192 Result: \"%VAR%\"\n *\n * ## Variable Resolution\n *\n * Template variables are provided by users when they configure or use the plugin.\n * For system services, plugin authors provide the variable values.\n *\n * The resolution process is transparent:\n * - Users see which hostname will receive the request (from allowed_hosts)\n * - Users see which header is being modified\n * - Users are prompted to provide values for each variable\n *\n * This ensures users know exactly what data they are sending and where it goes.\n *\n * If a variable is not provided, the header injection will fail at runtime,\n * and the proxy request will not be sent.\n *\n * ## Security Considerations\n *\n * By default, template variables are treated as SECRETS.\n *\n * Set `plaintext: true` if the variable contains non-sensitive data like:\n * - User IDs (not passwords)\n * - Tenant/Organization IDs\n * - Request correlation IDs\n * - API version numbers\n * - Public configuration values\n *\n * DO NOT set `plaintext: true` for:\n * - Access tokens, API keys, passwords\n * - Session tokens, JWTs\n * - Private keys, certificates\n * - Any credential material\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HeaderTemplate\n */\nexport type HeaderTemplateJson = {\n /**\n * The template string using %VAR% syntax.\n *\n * Pattern: %VARIABLE_NAME% where VARIABLE_NAME matches [A-Za-z_][A-Za-z0-9_]*\n * Escape literal %: use %%\n *\n * @generated from field: string template = 1;\n */\n template?: string;\n\n /**\n * If true, variables in this template are NOT treated as secrets.\n *\n * Only set to true for non-sensitive identifiers like user IDs,\n * tenant IDs, request IDs, or public configuration values.\n *\n * Default: false (variables are secrets)\n *\n * @generated from field: bool plaintext = 2;\n */\n plaintext?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.HeaderTemplate.\n * Use `create(HeaderTemplateSchema)` to create a new message.\n */\nexport const HeaderTemplateSchema: GenMessage<HeaderTemplate, {jsonType: HeaderTemplateJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 1);\n\n/**\n * TLS configuration defining the security requirements for upstream connections.\n *\n * Supports two authentication modes with flexible CA bundle placement.\n *\n * ## Security Model\n *\n * - Public certificates (CA bundles): Can be in definition OR config\n * - Private keys and client certificates: MUST be in config (secrets)\n *\n * ## Mode Descriptions\n *\n * MODE_SERVER_ONLY: Validate server's certificate (standard HTTPS)\n * - Client verifies server identity\n * - Server does not verify client\n * - Common for public APIs\n *\n * MODE_MTLS: Mutual authentication (both parties verify each other)\n * - Client verifies server identity AND presents its own certificate\n * - Server verifies client identity\n * - Common for B2B integrations, internal services\n *\n * @generated from message mochabugapis.adapt.plugins.v1.TlsDefinition\n */\nexport type TlsDefinition = Message<\"mochabugapis.adapt.plugins.v1.TlsDefinition\"> & {\n /**\n * Select the TLS mode for the connection.\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.TlsDefinition.Mode mode = 1;\n */\n mode: TlsDefinition_Mode;\n\n /**\n * The expected hostname for certificate verification (SNI - Server Name Indication).\n *\n * If present, the client will:\n * 1. Send this hostname in the TLS SNI extension during the handshake\n * 2. Verify that the server's certificate authenticates this specific hostname\n *\n * If not provided:\n * - The hostname is derived from the target upstream address\n * - For IP addresses, certificate verification may fail unless the cert includes the IP as a SAN\n *\n * ## Use Cases\n *\n * 1. **IP-based connections with hostname certificates:**\n * - Upstream address: 192.168.1.100:443\n * - certificate_host: \"api.example.com\"\n * - Server presents cert for api.example.com\n *\n * 2. **Load balancers or proxies:**\n * - Upstream address: lb.internal:443\n * - certificate_host: \"api.example.com\"\n * - Verify against the public hostname, not internal LB name\n *\n * 3. **Shared hosting / Virtual hosting:**\n * - Multiple services on same IP, different certs via SNI\n * - Server selects correct certificate based on SNI hostname\n *\n * ## Certificate Verification\n *\n * The server certificate must contain this hostname in either:\n * - Common Name (CN) field\n * - Subject Alternative Name (SAN) extension\n *\n * ## Format\n *\n * Must be a valid hostname (DNS name), not an IP address.\n * Examples: \"api.example.com\", \"service.internal\", \"*.example.com\" (for wildcard matching)\n *\n * @generated from field: optional string certificate_host = 2;\n */\n certificateHost?: string;\n\n /**\n * Optional CA bundle for server certificate validation.\n *\n * ## Why CA Bundle in Definition?\n *\n * CA bundles contain PUBLIC certificates (not secrets), so they can be safely\n * embedded in the plugin definition. This reduces configuration burden on users\n * when the CA bundle is known ahead of time.\n *\n * ## When to Use This Field\n *\n * Set the CA bundle in the definition when:\n * - The upstream service uses a self-signed certificate\n * - The upstream uses a private/internal Certificate Authority\n * - You want to pin specific CA certificates for security\n * - The CA bundle is static and known at plugin authoring time\n *\n * ## When to Use TlsConfig.ca_bundle Instead\n *\n * Leave this empty and use TlsConfig.ca_bundle when:\n * - Different users need different CA bundles\n * - The CA bundle is dynamic or environment-specific\n * - Users want to override the plugin's default CA bundle\n *\n * ## Configuration Rules\n *\n * For MODE_SERVER_ONLY:\n * - At least one CA bundle must be provided (either here OR in TlsConfig)\n * - If set here: users don't need to provide TlsConfig.ca_bundle\n * - If NOT set here: users MUST provide TlsConfig.ca_bundle\n *\n * For MODE_MTLS:\n * - Same CA bundle rules as MODE_SERVER_ONLY\n * - Users must ALSO provide client certificate and private_key in TlsConfig\n *\n * ## Precedence\n *\n * If CA bundle is provided in both the definition AND TlsConfig:\n * - TlsConfig.ca_bundle takes precedence (config overrides definition)\n * - This allows users to override the plugin's default CA bundle if needed\n *\n * ## Format\n *\n * The CA bundle must be in PEM format (same as TlsConfig.ca_bundle).\n * If a certificate chain is presented, the root CA must be included.\n *\n * IF this points to a file on the disk, then it will be loaded from there.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File ca_bundle = 3;\n */\n caBundle?: File;\n};\n\n/**\n * TLS configuration defining the security requirements for upstream connections.\n *\n * Supports two authentication modes with flexible CA bundle placement.\n *\n * ## Security Model\n *\n * - Public certificates (CA bundles): Can be in definition OR config\n * - Private keys and client certificates: MUST be in config (secrets)\n *\n * ## Mode Descriptions\n *\n * MODE_SERVER_ONLY: Validate server's certificate (standard HTTPS)\n * - Client verifies server identity\n * - Server does not verify client\n * - Common for public APIs\n *\n * MODE_MTLS: Mutual authentication (both parties verify each other)\n * - Client verifies server identity AND presents its own certificate\n * - Server verifies client identity\n * - Common for B2B integrations, internal services\n *\n * @generated from message mochabugapis.adapt.plugins.v1.TlsDefinition\n */\nexport type TlsDefinitionJson = {\n /**\n * Select the TLS mode for the connection.\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.TlsDefinition.Mode mode = 1;\n */\n mode?: TlsDefinition_ModeJson;\n\n /**\n * The expected hostname for certificate verification (SNI - Server Name Indication).\n *\n * If present, the client will:\n * 1. Send this hostname in the TLS SNI extension during the handshake\n * 2. Verify that the server's certificate authenticates this specific hostname\n *\n * If not provided:\n * - The hostname is derived from the target upstream address\n * - For IP addresses, certificate verification may fail unless the cert includes the IP as a SAN\n *\n * ## Use Cases\n *\n * 1. **IP-based connections with hostname certificates:**\n * - Upstream address: 192.168.1.100:443\n * - certificate_host: \"api.example.com\"\n * - Server presents cert for api.example.com\n *\n * 2. **Load balancers or proxies:**\n * - Upstream address: lb.internal:443\n * - certificate_host: \"api.example.com\"\n * - Verify against the public hostname, not internal LB name\n *\n * 3. **Shared hosting / Virtual hosting:**\n * - Multiple services on same IP, different certs via SNI\n * - Server selects correct certificate based on SNI hostname\n *\n * ## Certificate Verification\n *\n * The server certificate must contain this hostname in either:\n * - Common Name (CN) field\n * - Subject Alternative Name (SAN) extension\n *\n * ## Format\n *\n * Must be a valid hostname (DNS name), not an IP address.\n * Examples: \"api.example.com\", \"service.internal\", \"*.example.com\" (for wildcard matching)\n *\n * @generated from field: optional string certificate_host = 2;\n */\n certificateHost?: string;\n\n /**\n * Optional CA bundle for server certificate validation.\n *\n * ## Why CA Bundle in Definition?\n *\n * CA bundles contain PUBLIC certificates (not secrets), so they can be safely\n * embedded in the plugin definition. This reduces configuration burden on users\n * when the CA bundle is known ahead of time.\n *\n * ## When to Use This Field\n *\n * Set the CA bundle in the definition when:\n * - The upstream service uses a self-signed certificate\n * - The upstream uses a private/internal Certificate Authority\n * - You want to pin specific CA certificates for security\n * - The CA bundle is static and known at plugin authoring time\n *\n * ## When to Use TlsConfig.ca_bundle Instead\n *\n * Leave this empty and use TlsConfig.ca_bundle when:\n * - Different users need different CA bundles\n * - The CA bundle is dynamic or environment-specific\n * - Users want to override the plugin's default CA bundle\n *\n * ## Configuration Rules\n *\n * For MODE_SERVER_ONLY:\n * - At least one CA bundle must be provided (either here OR in TlsConfig)\n * - If set here: users don't need to provide TlsConfig.ca_bundle\n * - If NOT set here: users MUST provide TlsConfig.ca_bundle\n *\n * For MODE_MTLS:\n * - Same CA bundle rules as MODE_SERVER_ONLY\n * - Users must ALSO provide client certificate and private_key in TlsConfig\n *\n * ## Precedence\n *\n * If CA bundle is provided in both the definition AND TlsConfig:\n * - TlsConfig.ca_bundle takes precedence (config overrides definition)\n * - This allows users to override the plugin's default CA bundle if needed\n *\n * ## Format\n *\n * The CA bundle must be in PEM format (same as TlsConfig.ca_bundle).\n * If a certificate chain is presented, the root CA must be included.\n *\n * IF this points to a file on the disk, then it will be loaded from there.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File ca_bundle = 3;\n */\n caBundle?: FileJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.TlsDefinition.\n * Use `create(TlsDefinitionSchema)` to create a new message.\n */\nexport const TlsDefinitionSchema: GenMessage<TlsDefinition, {jsonType: TlsDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 2);\n\n/**\n * Mode specifies which TLS configuration to use.\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.TlsDefinition.Mode\n */\nexport enum TlsDefinition_Mode {\n /**\n * Default value. Invalid.\n *\n * @generated from enum value: MODE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Mutual TLS: Both client and server authenticate each other.\n *\n * Configuration requirements:\n * - CA bundle: Set in TlsDefinition.ca_bundle OR TlsConfig.ca_bundle (at least one required)\n * - Client certificate: REQUIRED in TlsConfig.certificate\n * - Client private key: REQUIRED in TlsConfig.private_key\n *\n * Use when:\n * - Upstream service requires client certificate authentication\n * - Both parties need strong cryptographic authentication\n * - Common in B2B APIs, internal microservices, banking/financial APIs\n *\n * @generated from enum value: MODE_MTLS = 1;\n */\n MTLS = 1,\n\n /**\n * Server-only validation: Client verifies server identity.\n *\n * Configuration requirements:\n * - CA bundle: Set in TlsDefinition.ca_bundle OR TlsConfig.ca_bundle (at least one required)\n * - Client certificate: NOT used\n * - Client private key: NOT used\n *\n * Use when:\n * - Standard HTTPS with server authentication only\n * - Upstream uses self-signed or internal CA certificates\n * - Want to pin specific CA certificates for security\n * - Most common mode for external APIs\n *\n * @generated from enum value: MODE_SERVER_ONLY = 2;\n */\n SERVER_ONLY = 2,\n}\n\n/**\n * Mode specifies which TLS configuration to use.\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.TlsDefinition.Mode\n */\nexport type TlsDefinition_ModeJson = \"MODE_UNSPECIFIED\" | \"MODE_MTLS\" | \"MODE_SERVER_ONLY\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.TlsDefinition.Mode.\n */\nexport const TlsDefinition_ModeSchema: GenEnum<TlsDefinition_Mode, TlsDefinition_ModeJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 2, 0);\n\n/**\n * The actual TLS configuration containing runtime secrets.\n *\n * This provides the secret/dynamic parts of the TLS configuration that cannot\n * be embedded in the plugin definition (private keys, user-specific certificates).\n *\n * ## Relationship to TlsDefinition\n *\n * - TlsDefinition: Defines the TLS mode and optionally includes the CA bundle (public cert)\n * - TlsConfig: Provides runtime secrets (private keys, client certificates)\n *\n * ## Configuration Requirements\n *\n * For MODE_SERVER_ONLY:\n * - ca_bundle: Required if NOT provided in TlsDefinition.ca_bundle\n * - certificate: NOT used\n * - private_key: NOT used\n *\n * For MODE_MTLS:\n * - ca_bundle: Required if NOT provided in TlsDefinition.ca_bundle\n * - certificate: REQUIRED (client certificate for mutual TLS)\n * - private_key: REQUIRED (client private key for mutual TLS)\n *\n * @generated from message mochabugapis.adapt.plugins.v1.TlsConfig\n */\nexport type TlsConfig = Message<\"mochabugapis.adapt.plugins.v1.TlsConfig\"> & {\n /**\n * Optional CA bundle for server certificate validation.\n *\n * The CA bundle in PEM format containing one or more trusted Certificate Authorities.\n * The content of the file must be PEM format after decoding.\n * If a certificate chain is presented, the root CA must be included.\n *\n * ## When to Provide This\n *\n * REQUIRED if TlsDefinition.ca_bundle is NOT set.\n * OPTIONAL if TlsDefinition.ca_bundle is set (this will override the definition's CA bundle).\n *\n * ## Override Behavior\n *\n * If both TlsDefinition.ca_bundle and TlsConfig.ca_bundle are provided:\n * - This config value takes precedence\n * - Allows users to override the plugin author's default CA bundle\n *\n * ## Use Cases for Override\n *\n * - User's organization has different root CAs\n * - Testing with different certificate chains\n * - Environment-specific CA requirements\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File ca_bundle = 1;\n */\n caBundle?: File;\n\n /**\n * Optional client certificate for mutual TLS authentication.\n *\n * The certificate in PEM format used to authenticate the client to the server.\n * The content of the file must be PEM format after decoding.\n * If a certificate chain is presented, the client certificate must be the first one.\n *\n * REQUIRED if TlsDefinition.mode is MODE_MTLS.\n * MUST NOT be provided if TlsDefinition.mode is MODE_SERVER_ONLY.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File certificate = 2;\n */\n certificate?: File;\n\n /**\n * Optional client private key for mutual TLS authentication.\n *\n * The private key in PEM format corresponding to the client certificate.\n * The content of the file must be PEM format after decoding.\n * The content must contain a PRIVATE KEY block.\n *\n * REQUIRED if TlsDefinition.mode is MODE_MTLS.\n * MUST NOT be provided if TlsDefinition.mode is MODE_SERVER_ONLY.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File private_key = 3;\n */\n privateKey?: File;\n};\n\n/**\n * The actual TLS configuration containing runtime secrets.\n *\n * This provides the secret/dynamic parts of the TLS configuration that cannot\n * be embedded in the plugin definition (private keys, user-specific certificates).\n *\n * ## Relationship to TlsDefinition\n *\n * - TlsDefinition: Defines the TLS mode and optionally includes the CA bundle (public cert)\n * - TlsConfig: Provides runtime secrets (private keys, client certificates)\n *\n * ## Configuration Requirements\n *\n * For MODE_SERVER_ONLY:\n * - ca_bundle: Required if NOT provided in TlsDefinition.ca_bundle\n * - certificate: NOT used\n * - private_key: NOT used\n *\n * For MODE_MTLS:\n * - ca_bundle: Required if NOT provided in TlsDefinition.ca_bundle\n * - certificate: REQUIRED (client certificate for mutual TLS)\n * - private_key: REQUIRED (client private key for mutual TLS)\n *\n * @generated from message mochabugapis.adapt.plugins.v1.TlsConfig\n */\nexport type TlsConfigJson = {\n /**\n * Optional CA bundle for server certificate validation.\n *\n * The CA bundle in PEM format containing one or more trusted Certificate Authorities.\n * The content of the file must be PEM format after decoding.\n * If a certificate chain is presented, the root CA must be included.\n *\n * ## When to Provide This\n *\n * REQUIRED if TlsDefinition.ca_bundle is NOT set.\n * OPTIONAL if TlsDefinition.ca_bundle is set (this will override the definition's CA bundle).\n *\n * ## Override Behavior\n *\n * If both TlsDefinition.ca_bundle and TlsConfig.ca_bundle are provided:\n * - This config value takes precedence\n * - Allows users to override the plugin author's default CA bundle\n *\n * ## Use Cases for Override\n *\n * - User's organization has different root CAs\n * - Testing with different certificate chains\n * - Environment-specific CA requirements\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File ca_bundle = 1;\n */\n caBundle?: FileJson;\n\n /**\n * Optional client certificate for mutual TLS authentication.\n *\n * The certificate in PEM format used to authenticate the client to the server.\n * The content of the file must be PEM format after decoding.\n * If a certificate chain is presented, the client certificate must be the first one.\n *\n * REQUIRED if TlsDefinition.mode is MODE_MTLS.\n * MUST NOT be provided if TlsDefinition.mode is MODE_SERVER_ONLY.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File certificate = 2;\n */\n certificate?: FileJson;\n\n /**\n * Optional client private key for mutual TLS authentication.\n *\n * The private key in PEM format corresponding to the client certificate.\n * The content of the file must be PEM format after decoding.\n * The content must contain a PRIVATE KEY block.\n *\n * REQUIRED if TlsDefinition.mode is MODE_MTLS.\n * MUST NOT be provided if TlsDefinition.mode is MODE_SERVER_ONLY.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File private_key = 3;\n */\n privateKey?: FileJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.TlsConfig.\n * Use `create(TlsConfigSchema)` to create a new message.\n */\nexport const TlsConfigSchema: GenMessage<TlsConfig, {jsonType: TlsConfigJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 3);\n\n/**\n * The actual HTTP proxy configuration containing runtime values\n *\n * This message provides the actual configuration values for the HTTP proxy service,\n * including TLS certificates and template variable values for header injection.\n *\n * ## Relationship to HttpProxyDefinition\n *\n * - HttpProxyDefinition: Defines the schema (which headers to inject, template syntax, TLS mode)\n * - HttpProxyConfig: Provides the actual values (certificates, variable values)\n *\n * ## Example\n *\n * Given a definition with:\n * - inject_headers[\"Authorization\"].template.template = \"Bearer %ACCESS_TOKEN%\"\n * - tls.mode = MODE_SERVER_ONLY\n *\n * The config would provide:\n * - tls_config.ca_bundle = <actual CA certificate>\n * - template_variables[\"ACCESS_TOKEN\"] = \"eyJhbGci...\" (the actual token)\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HttpProxyConfig\n */\nexport type HttpProxyConfig = Message<\"mochabugapis.adapt.plugins.v1.HttpProxyConfig\"> & {\n /**\n * The actual TLS configuration with certificates and private keys.\n *\n * REQUIRED if HttpProxyDefinition.tls is set.\n * MUST NOT be set if HttpProxyDefinition.tls is not set.\n *\n * For MODE_SERVER_ONLY:\n * - Provide only ca_bundle\n * - Leave certificate and private_key empty\n *\n * For MODE_MTLS:\n * - Provide ca_bundle, certificate, AND private_key\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.TlsConfig tls_config = 1;\n */\n tlsConfig?: TlsConfig;\n\n /**\n * Template variable values for dynamic header injection, organized by header name.\n *\n * This provides the actual values for template variables used in HttpProxyDefinition.inject_headers.\n * Each header that uses template variables needs its variables resolved here.\n *\n * ## Structure\n *\n * Outer map key: HTTP header name (must match a key in HttpProxyDefinition.inject_headers)\n * Outer map value: Map of variable names to their actual values for that specific header\n *\n * This structure mirrors HttpProxyDefinition.inject_headers, making it clear\n * which variables belong to which header template.\n *\n * ## Variable Name Requirements\n *\n * Variable names must match the %VARIABLE% patterns used in the header's template:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Case-sensitive (e.g., %ACCESS_TOKEN% requires variable name \"ACCESS_TOKEN\")\n *\n * ## Examples\n *\n * Given a definition with:\n * - inject_headers[\"Authorization\"].template = \"Bearer %ACCESS_TOKEN%\"\n * - inject_headers[\"X-Correlation\"].template = \"%TENANT_ID%:%USER_ID%\"\n *\n * The config must provide:\n * - header_variables[\"Authorization\"][\"ACCESS_TOKEN\"] = \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n * - header_variables[\"X-Correlation\"][\"TENANT_ID\"] = \"org_123\"\n * - header_variables[\"X-Correlation\"][\"USER_ID\"] = \"user_456\"\n *\n * ## Security\n *\n * All values are stored securely and encrypted at rest.\n * The HeaderTemplate.plaintext flag (in the definition) controls whether\n * the variable value is treated as a secret or shown in logs/UI.\n *\n * ## Variable Resolution Process\n *\n * Users of the plugin are prompted to provide values for all template variables.\n * For system services, the plugin author provides the values programmatically.\n *\n * During configuration, it is fully transparent to users:\n * - Which hostname the request will be sent to (from allowed_hosts)\n * - Which headers are being injected\n * - What template variables are required\n * - Whether each variable is a secret or plaintext\n *\n * Users see exactly what data they are providing and where it will be sent.\n *\n * ## Runtime Behavior\n *\n * If a variable referenced in a header template is missing from this config,\n * the header injection will fail at runtime and the request will not be sent.\n *\n * ## Validation\n *\n * - Header names in this map MUST match headers in HttpProxyDefinition.inject_headers\n * - All variables referenced in each header's template must be provided\n * - Extra variables (not referenced in the template) are ignored\n *\n * @generated from field: map<string, mochabugapis.adapt.plugins.v1.HeaderVariables> header_variables = 2;\n */\n headerVariables: { [key: string]: HeaderVariables };\n};\n\n/**\n * The actual HTTP proxy configuration containing runtime values\n *\n * This message provides the actual configuration values for the HTTP proxy service,\n * including TLS certificates and template variable values for header injection.\n *\n * ## Relationship to HttpProxyDefinition\n *\n * - HttpProxyDefinition: Defines the schema (which headers to inject, template syntax, TLS mode)\n * - HttpProxyConfig: Provides the actual values (certificates, variable values)\n *\n * ## Example\n *\n * Given a definition with:\n * - inject_headers[\"Authorization\"].template.template = \"Bearer %ACCESS_TOKEN%\"\n * - tls.mode = MODE_SERVER_ONLY\n *\n * The config would provide:\n * - tls_config.ca_bundle = <actual CA certificate>\n * - template_variables[\"ACCESS_TOKEN\"] = \"eyJhbGci...\" (the actual token)\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HttpProxyConfig\n */\nexport type HttpProxyConfigJson = {\n /**\n * The actual TLS configuration with certificates and private keys.\n *\n * REQUIRED if HttpProxyDefinition.tls is set.\n * MUST NOT be set if HttpProxyDefinition.tls is not set.\n *\n * For MODE_SERVER_ONLY:\n * - Provide only ca_bundle\n * - Leave certificate and private_key empty\n *\n * For MODE_MTLS:\n * - Provide ca_bundle, certificate, AND private_key\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.TlsConfig tls_config = 1;\n */\n tlsConfig?: TlsConfigJson;\n\n /**\n * Template variable values for dynamic header injection, organized by header name.\n *\n * This provides the actual values for template variables used in HttpProxyDefinition.inject_headers.\n * Each header that uses template variables needs its variables resolved here.\n *\n * ## Structure\n *\n * Outer map key: HTTP header name (must match a key in HttpProxyDefinition.inject_headers)\n * Outer map value: Map of variable names to their actual values for that specific header\n *\n * This structure mirrors HttpProxyDefinition.inject_headers, making it clear\n * which variables belong to which header template.\n *\n * ## Variable Name Requirements\n *\n * Variable names must match the %VARIABLE% patterns used in the header's template:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Case-sensitive (e.g., %ACCESS_TOKEN% requires variable name \"ACCESS_TOKEN\")\n *\n * ## Examples\n *\n * Given a definition with:\n * - inject_headers[\"Authorization\"].template = \"Bearer %ACCESS_TOKEN%\"\n * - inject_headers[\"X-Correlation\"].template = \"%TENANT_ID%:%USER_ID%\"\n *\n * The config must provide:\n * - header_variables[\"Authorization\"][\"ACCESS_TOKEN\"] = \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n * - header_variables[\"X-Correlation\"][\"TENANT_ID\"] = \"org_123\"\n * - header_variables[\"X-Correlation\"][\"USER_ID\"] = \"user_456\"\n *\n * ## Security\n *\n * All values are stored securely and encrypted at rest.\n * The HeaderTemplate.plaintext flag (in the definition) controls whether\n * the variable value is treated as a secret or shown in logs/UI.\n *\n * ## Variable Resolution Process\n *\n * Users of the plugin are prompted to provide values for all template variables.\n * For system services, the plugin author provides the values programmatically.\n *\n * During configuration, it is fully transparent to users:\n * - Which hostname the request will be sent to (from allowed_hosts)\n * - Which headers are being injected\n * - What template variables are required\n * - Whether each variable is a secret or plaintext\n *\n * Users see exactly what data they are providing and where it will be sent.\n *\n * ## Runtime Behavior\n *\n * If a variable referenced in a header template is missing from this config,\n * the header injection will fail at runtime and the request will not be sent.\n *\n * ## Validation\n *\n * - Header names in this map MUST match headers in HttpProxyDefinition.inject_headers\n * - All variables referenced in each header's template must be provided\n * - Extra variables (not referenced in the template) are ignored\n *\n * @generated from field: map<string, mochabugapis.adapt.plugins.v1.HeaderVariables> header_variables = 2;\n */\n headerVariables?: { [key: string]: HeaderVariablesJson };\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.HttpProxyConfig.\n * Use `create(HttpProxyConfigSchema)` to create a new message.\n */\nexport const HttpProxyConfigSchema: GenMessage<HttpProxyConfig, {jsonType: HttpProxyConfigJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 4);\n\n/**\n * Variable values for a specific header's template substitution.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HeaderVariables\n */\nexport type HeaderVariables = Message<\"mochabugapis.adapt.plugins.v1.HeaderVariables\"> & {\n /**\n * Map of variable name to value.\n *\n * Key: Variable name matching %VAR_NAME% in the header's template\n * Value: The actual value to substitute\n *\n * @generated from field: map<string, string> variables = 1;\n */\n variables: { [key: string]: string };\n};\n\n/**\n * Variable values for a specific header's template substitution.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HeaderVariables\n */\nexport type HeaderVariablesJson = {\n /**\n * Map of variable name to value.\n *\n * Key: Variable name matching %VAR_NAME% in the header's template\n * Value: The actual value to substitute\n *\n * @generated from field: map<string, string> variables = 1;\n */\n variables?: { [key: string]: string };\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.HeaderVariables.\n * Use `create(HeaderVariablesSchema)` to create a new message.\n */\nexport const HeaderVariablesSchema: GenMessage<HeaderVariables, {jsonType: HeaderVariablesJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 5);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/oauth2_service.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenEnum, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { File, FileJson } from \"./file_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_file } from \"./file_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/oauth2_service.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_oauth2_service: GenFile = /*@__PURE__*/\n fileDesc(\"CjJtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9vYXV0aDJfc2VydmljZS5wcm90bxIdbW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEisgsKEE9hdXRoMkRlZmluaXRpb24STgoKZ3JhbnRfdHlwZRgBIAEoDjIuLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk9hdXRoMkdyYW50VHlwZUIKukgHggEEEAEgABIlCgZzY29wZXMYAiADKAlCFbpIEpIBDwgAEPQDGAEiBnIEEAEYZBJTCgthdXRoX21ldGhvZBgDIAEoDjItLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk9hdXRoMkF1dGhUeXBlQgq6SAeCAQQQASAASACIAQESSgoDYWxnGAQgASgOMiwubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuUHJpdmF0ZUtleUFsZ0IKukgHggEEEAEgAEgBiAEBEiIKCWNsaWVudF9pZBgFIAEoCUIKukgHcgUQARj6AUgCiAEBElYKDnRva2VuX2VuZHBvaW50GAYgASgJQj66SDtyORALGIAgMjJeaHR0cHM6Ly9bYS16QS1aMC05Li1dKyg/OlwuW2EtekEtWl17Mix9KSg/Oi8uKik/JBI8CgRjb2RlGAcgASgLMikubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuT2F1dGgyQ29kZUgDiAEBOpwHukiYBxrnAQoSb2F1dGgyLmF1dGhfbWV0aG9kEocBVGhlIGF1dGhfbWV0aG9kIHByb3BlcnR5IG11c3QgYmUgc2V0IGluIGNhc2Ugb2YgZ3JhbnRfdHlwZSBPQVVUSDJfR1JBTlRfVFlQRV9BVVRIT1JJWkFUSU9OX0NPREUgb3IgT0FVVEgyX0dSQU5UX1RZUEVfQ0xJRU5UX0NSRURFTlRJQUxTGkdoYXModGhpcy5hdXRoX21ldGhvZCkgPT0gKHRoaXMuZ3JhbnRfdHlwZSA9PSAxIHx8IHRoaXMuZ3JhbnRfdHlwZSA9PSAyKRrAAgoKb2F1dGgyLmFsZxK+AVRoZSBhbGcgcHJvcGVydHkgbXVzdCBiZSBzZXQgaW4gY2FzZSBvZiBncmFudF90eXBlIE9BVVRIMl9HUkFOVF9UWVBFX0pXVF9CRUFSRVIsIE9BVVRIMl9HUkFOVF9UWVBFX1NBTUwyX0JFQVJFUiBvciBhdXRoX21ldGhvZCBPQVVUSDJfQVVUSF9UWVBFX1BSSVZBVEVfS0VZX0pXVCwgT0FVVEgyX0FVVEhfVFlQRV9TQU1MMl9CRUFSRVIacWhhcyh0aGlzLmFsZykgPT0gKHRoaXMuZ3JhbnRfdHlwZSA9PSAzIHx8IHRoaXMuZ3JhbnRfdHlwZSA9PSA0IHx8IHRoaXMuYXV0aF9tZXRob2QgPT0gMyB8fCB0aGlzLmF1dGhfbWV0aG9kID09IDUpGtQBChBvYXV0aDIuY2xpZW50X2lkEl1UaGUgY2xpZW50X2lkIHByb3BlcnR5IG11c3QgYmUgc2V0IGluIGNhc2Ugb2YgZ3JhbnRfdHlwZSBPQVVUSDJfR1JBTlRfVFlQRV9BVVRIT1JJWkFUSU9OX0NPREUaYShoYXModGhpcy5jbGllbnRfaWQpID09ICh0aGlzLmdyYW50X3R5cGUgPT0gMSkpIHx8ICh0aGlzLmdyYW50X3R5cGUgIT0gMSAmJiAhaGFzKHRoaXMuY2xpZW50X2lkKSkakQEKC29hdXRoMi5jb2RlElhUaGUgY29kZSBwcm9wZXJ0eSBtdXN0IGJlIHNldCBpbiBjYXNlIG9mIGdyYW50X3R5cGUgT0FVVEgyX0dSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFGihoYXModGhpcy5jb2RlKSA9PSAodGhpcy5ncmFudF90eXBlID09IDEpQg4KDF9hdXRoX21ldGhvZEIGCgRfYWxnQgwKCl9jbGllbnRfaWRCBwoFX2NvZGUiqAIKCk9hdXRoMkNvZGUSVQoNYXV0aF9lbmRwb2ludBgBIAEoCUI+ukg7cjkQCxiAIDIyXmh0dHBzOi8vW2EtekEtWjAtOS4tXSsoPzpcLlthLXpBLVpdezIsfSkoPzovLiopPyQSeAoRYWRkaXRpb25hbF9wYXJhbXMYAiADKAsyPy5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5PYXV0aDJDb2RlLkFkZGl0aW9uYWxQYXJhbXNFbnRyeUIcukgZmgEWCAAQMiIHcgUQARj6ASoHcgUQARj6ARIQCgh1c2VfcGtjZRgDIAEoCBo3ChVBZGRpdGlvbmFsUGFyYW1zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKuAwoMT2F1dGgyQ29uZmlnEiIKCWNsaWVudF9pZBgBIAEoCUIKukgHcgUQARiAAkgBiAEBEj4KCmJhc2ljX2F1dGgYAiABKAsyKC5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5CYXNpY0F1dGhIABI8Cglmb3JtX2F1dGgYAyABKAsyJy5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5Gb3JtQXV0aEgAEkkKEHByaXZhdGVfand0X2F1dGgYBCABKAsyLS5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5Qcml2YXRlSldUQXV0aEgAEjwKCW10bHNfYXV0aBgFIAEoCzInLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk1UTFNBdXRoSAASPAoJc2FtbF9hdXRoGAYgASgLMicubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuU0FNTEF1dGhIABIRCgdjb25zZW50GAcgASgISABCFAoLYXV0aF9tZXRob2QSBbpIAggBQgwKCl9jbGllbnRfaWQiLgoJQmFzaWNBdXRoEiEKDWNsaWVudF9zZWNyZXQYASABKAlCCrpIB3IFEAUYgAIiLQoIRm9ybUF1dGgSIQoNY2xpZW50X3NlY3JldBgBIAEoCUIKukgHcgUQBRiAAiKAAQoOUHJpdmF0ZUpXVEF1dGgSQAoLcHJpdmF0ZV9rZXkYASABKAsyIy5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5GaWxlQga6SAPIAQESIAoHc3ViamVjdBgCIAEoCUIKukgHcgUQARiAAkgAiAEBQgoKCF9zdWJqZWN0IucCCghNVExTQXV0aBJACgtjZXJ0aWZpY2F0ZRgBIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVCBrpIA8gBARJACgtwcml2YXRlX2tleRgCIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVCBrpIA8gBARJDCg5jYV9jZXJ0aWZpY2F0ZRgDIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVCBrpIA8gBARJ9ChBjZXJ0aWZpY2F0ZV9ob3N0GAQgASgJQl66SFtyWRABGP0BMlJeKFwqXC4pP1thLXowLTldKFthLXowLTktXXswLDYxfVthLXowLTldKT8oXC5bYS16MC05XShbYS16MC05LV17MCw2MX1bYS16MC05XSk/KSokSACIAQFCEwoRX2NlcnRpZmljYXRlX2hvc3QijgEKCFNBTUxBdXRoEkAKC3ByaXZhdGVfa2V5GAEgASgLMiMubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuRmlsZUIGukgDyAEBEkAKC2NlcnRpZmljYXRlGAIgASgLMiMubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuRmlsZUIGukgDyAEBKksKDVByaXZhdGVLZXlBbGcSHwobUFJJVkFURV9LRVlfQUxHX1VOU1BFQ0lGSUVEEAASGQoVUFJJVkFURV9LRVlfQUxHX1JTMjU2EAEqzgEKD09hdXRoMkdyYW50VHlwZRIhCh1PQVVUSDJfR1JBTlRfVFlQRV9VTlNQRUNJRklFRBAAEigKJE9BVVRIMl9HUkFOVF9UWVBFX0FVVEhPUklaQVRJT05fQ09ERRABEigKJE9BVVRIMl9HUkFOVF9UWVBFX0NMSUVOVF9DUkVERU5USUFMUxACEiAKHE9BVVRIMl9HUkFOVF9UWVBFX0pXVF9CRUFSRVIQAxIiCh5PQVVUSDJfR1JBTlRfVFlQRV9TQU1MMl9CRUFSRVIQBCrNAQoOT2F1dGgyQXV0aFR5cGUSIAocT0FVVEgyX0FVVEhfVFlQRV9VTlNQRUNJRklFRBAAEhoKFk9BVVRIMl9BVVRIX1RZUEVfQkFTSUMQARIZChVPQVVUSDJfQVVUSF9UWVBFX0ZPUk0QAhIkCiBPQVVUSDJfQVVUSF9UWVBFX1BSSVZBVEVfS0VZX0pXVBADEhkKFU9BVVRIMl9BVVRIX1RZUEVfTVRMUxAEEiEKHU9BVVRIMl9BVVRIX1RZUEVfU0FNTDJfQkVBUkVSEAViBnByb3RvMw\", [file_buf_validate_validate, file_mochabugapis_adapt_plugins_v1_file]);\n\n/**\n * OAuth2 service configuration\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Definition\n */\nexport type Oauth2Definition = Message<\"mochabugapis.adapt.plugins.v1.Oauth2Definition\"> & {\n /**\n * The OAuth2 grant type to be used.\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.Oauth2GrantType grant_type = 1;\n */\n grantType: Oauth2GrantType;\n\n /**\n * The requested scopes (OPTIONAL per RFC 6749 Section 3.3).\n * If omitted, the authorization server will use a pre-defined default or fail.\n *\n * @generated from field: repeated string scopes = 2;\n */\n scopes: string[];\n\n /**\n * The client authentication method.\n * REQUIRED when grant_type is:\n * - OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE\n * - OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS\n *\n * MUST NOT be set when grant_type is:\n * - OAUTH2_GRANT_TYPE_JWT_BEARER\n * - OAUTH2_GRANT_TYPE_SAML2_BEARER\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.Oauth2AuthType auth_method = 3;\n */\n authMethod?: Oauth2AuthType;\n\n /**\n * Algorithm used for signing assertions.\n * REQUIRED when:\n * - grant_type is OAUTH2_GRANT_TYPE_JWT_BEARER\n * - grant_type is OAUTH2_GRANT_TYPE_SAML2_BEARER\n * - auth_method is OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT\n * - auth_method is OAUTH2_AUTH_TYPE_SAML2_BEARER\n *\n * MUST NOT be set otherwise.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.PrivateKeyAlg alg = 4;\n */\n alg?: PrivateKeyAlg;\n\n /**\n * Client ID.\n * This is required when used as plugin_oauth2, but not onto a vertex => oauth2\n *\n * @generated from field: optional string client_id = 5;\n */\n clientId?: string;\n\n /**\n * The token endpoint URL.\n *\n * @generated from field: string token_endpoint = 6;\n */\n tokenEndpoint: string;\n\n /**\n * Configuration specific to the Authorization Code grant type.\n * REQUIRED when grant_type is OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE.\n * MUST NOT be set otherwise.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.Oauth2Code code = 7;\n */\n code?: Oauth2Code;\n};\n\n/**\n * OAuth2 service configuration\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Definition\n */\nexport type Oauth2DefinitionJson = {\n /**\n * The OAuth2 grant type to be used.\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.Oauth2GrantType grant_type = 1;\n */\n grantType?: Oauth2GrantTypeJson;\n\n /**\n * The requested scopes (OPTIONAL per RFC 6749 Section 3.3).\n * If omitted, the authorization server will use a pre-defined default or fail.\n *\n * @generated from field: repeated string scopes = 2;\n */\n scopes?: string[];\n\n /**\n * The client authentication method.\n * REQUIRED when grant_type is:\n * - OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE\n * - OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS\n *\n * MUST NOT be set when grant_type is:\n * - OAUTH2_GRANT_TYPE_JWT_BEARER\n * - OAUTH2_GRANT_TYPE_SAML2_BEARER\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.Oauth2AuthType auth_method = 3;\n */\n authMethod?: Oauth2AuthTypeJson;\n\n /**\n * Algorithm used for signing assertions.\n * REQUIRED when:\n * - grant_type is OAUTH2_GRANT_TYPE_JWT_BEARER\n * - grant_type is OAUTH2_GRANT_TYPE_SAML2_BEARER\n * - auth_method is OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT\n * - auth_method is OAUTH2_AUTH_TYPE_SAML2_BEARER\n *\n * MUST NOT be set otherwise.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.PrivateKeyAlg alg = 4;\n */\n alg?: PrivateKeyAlgJson;\n\n /**\n * Client ID.\n * This is required when used as plugin_oauth2, but not onto a vertex => oauth2\n *\n * @generated from field: optional string client_id = 5;\n */\n clientId?: string;\n\n /**\n * The token endpoint URL.\n *\n * @generated from field: string token_endpoint = 6;\n */\n tokenEndpoint?: string;\n\n /**\n * Configuration specific to the Authorization Code grant type.\n * REQUIRED when grant_type is OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE.\n * MUST NOT be set otherwise.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.Oauth2Code code = 7;\n */\n code?: Oauth2CodeJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Oauth2Definition.\n * Use `create(Oauth2DefinitionSchema)` to create a new message.\n */\nexport const Oauth2DefinitionSchema: GenMessage<Oauth2Definition, {jsonType: Oauth2DefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 0);\n\n/**\n * The code grant type\n * IMPORTANT: it has to be configured with refresh token in order to work correctly\n * this is not needed for client credentials of course since we are owning the client\n * WE ONLY SUPPORT OIDC since we need the sub claim to distinguish between different users\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Code\n */\nexport type Oauth2Code = Message<\"mochabugapis.adapt.plugins.v1.Oauth2Code\"> & {\n /**\n * The auth endpoint (i.e. where it gets redirected for login)\n *\n * @generated from field: string auth_endpoint = 1;\n */\n authEndpoint: string;\n\n /**\n * Additional parameters used for the oauth2 login endpoint\n * Do not include state or nonce here since we're generating them\n * in the backend. All params will be encoded in the URL\n *\n * @generated from field: map<string, string> additional_params = 2;\n */\n additionalParams: { [key: string]: string };\n\n /**\n * Whether or not to use the PKCE extension\n *\n * @generated from field: bool use_pkce = 3;\n */\n usePkce: boolean;\n};\n\n/**\n * The code grant type\n * IMPORTANT: it has to be configured with refresh token in order to work correctly\n * this is not needed for client credentials of course since we are owning the client\n * WE ONLY SUPPORT OIDC since we need the sub claim to distinguish between different users\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Code\n */\nexport type Oauth2CodeJson = {\n /**\n * The auth endpoint (i.e. where it gets redirected for login)\n *\n * @generated from field: string auth_endpoint = 1;\n */\n authEndpoint?: string;\n\n /**\n * Additional parameters used for the oauth2 login endpoint\n * Do not include state or nonce here since we're generating them\n * in the backend. All params will be encoded in the URL\n *\n * @generated from field: map<string, string> additional_params = 2;\n */\n additionalParams?: { [key: string]: string };\n\n /**\n * Whether or not to use the PKCE extension\n *\n * @generated from field: bool use_pkce = 3;\n */\n usePkce?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Oauth2Code.\n * Use `create(Oauth2CodeSchema)` to create a new message.\n */\nexport const Oauth2CodeSchema: GenMessage<Oauth2Code, {jsonType: Oauth2CodeJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 1);\n\n/**\n * The actual oauth2 config\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Config\n */\nexport type Oauth2Config = Message<\"mochabugapis.adapt.plugins.v1.Oauth2Config\"> & {\n /**\n * The client id, required for client credentials on vertices only\n *\n * @generated from field: optional string client_id = 1;\n */\n clientId?: string;\n\n /**\n * The auth method is required to be set\n *\n * @generated from oneof mochabugapis.adapt.plugins.v1.Oauth2Config.auth_method\n */\n authMethod: {\n /**\n * Use basic authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.BasicAuth basic_auth = 2;\n */\n value: BasicAuth;\n case: \"basicAuth\";\n } | {\n /**\n * Use form authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.FormAuth form_auth = 3;\n */\n value: FormAuth;\n case: \"formAuth\";\n } | {\n /**\n * Use private JWT authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.PrivateJWTAuth private_jwt_auth = 4;\n */\n value: PrivateJWTAuth;\n case: \"privateJwtAuth\";\n } | {\n /**\n * Use mTLS authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.MTLSAuth mtls_auth = 5;\n */\n value: MTLSAuth;\n case: \"mtlsAuth\";\n } | {\n /**\n * Use SAML bearer authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.SAMLAuth saml_auth = 6;\n */\n value: SAMLAuth;\n case: \"samlAuth\";\n } | {\n /**\n * In case we have code flow with consent\n *\n * @generated from field: bool consent = 7;\n */\n value: boolean;\n case: \"consent\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * The actual oauth2 config\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Config\n */\nexport type Oauth2ConfigJson = {\n /**\n * The client id, required for client credentials on vertices only\n *\n * @generated from field: optional string client_id = 1;\n */\n clientId?: string;\n\n /**\n * Use basic authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.BasicAuth basic_auth = 2;\n */\n basicAuth?: BasicAuthJson;\n\n /**\n * Use form authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.FormAuth form_auth = 3;\n */\n formAuth?: FormAuthJson;\n\n /**\n * Use private JWT authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.PrivateJWTAuth private_jwt_auth = 4;\n */\n privateJwtAuth?: PrivateJWTAuthJson;\n\n /**\n * Use mTLS authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.MTLSAuth mtls_auth = 5;\n */\n mtlsAuth?: MTLSAuthJson;\n\n /**\n * Use SAML bearer authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.SAMLAuth saml_auth = 6;\n */\n samlAuth?: SAMLAuthJson;\n\n /**\n * In case we have code flow with consent\n *\n * @generated from field: bool consent = 7;\n */\n consent?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Oauth2Config.\n * Use `create(Oauth2ConfigSchema)` to create a new message.\n */\nexport const Oauth2ConfigSchema: GenMessage<Oauth2Config, {jsonType: Oauth2ConfigJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 2);\n\n/**\n * Basic auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.BasicAuth\n */\nexport type BasicAuth = Message<\"mochabugapis.adapt.plugins.v1.BasicAuth\"> & {\n /**\n * The password\n *\n * @generated from field: string client_secret = 1;\n */\n clientSecret: string;\n};\n\n/**\n * Basic auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.BasicAuth\n */\nexport type BasicAuthJson = {\n /**\n * The password\n *\n * @generated from field: string client_secret = 1;\n */\n clientSecret?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.BasicAuth.\n * Use `create(BasicAuthSchema)` to create a new message.\n */\nexport const BasicAuthSchema: GenMessage<BasicAuth, {jsonType: BasicAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 3);\n\n/**\n * Form auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.FormAuth\n */\nexport type FormAuth = Message<\"mochabugapis.adapt.plugins.v1.FormAuth\"> & {\n /**\n * The password\n *\n * @generated from field: string client_secret = 1;\n */\n clientSecret: string;\n};\n\n/**\n * Form auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.FormAuth\n */\nexport type FormAuthJson = {\n /**\n * The password\n *\n * @generated from field: string client_secret = 1;\n */\n clientSecret?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.FormAuth.\n * Use `create(FormAuthSchema)` to create a new message.\n */\nexport const FormAuthSchema: GenMessage<FormAuth, {jsonType: FormAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 4);\n\n/**\n * Private JWT auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.PrivateJWTAuth\n */\nexport type PrivateJWTAuth = Message<\"mochabugapis.adapt.plugins.v1.PrivateJWTAuth\"> & {\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 1;\n */\n privateKey?: File;\n\n /**\n * Optional subject for impersonation\n * If not provided, the client_id will be used as the subject\n *\n * @generated from field: optional string subject = 2;\n */\n subject?: string;\n};\n\n/**\n * Private JWT auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.PrivateJWTAuth\n */\nexport type PrivateJWTAuthJson = {\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 1;\n */\n privateKey?: FileJson;\n\n /**\n * Optional subject for impersonation\n * If not provided, the client_id will be used as the subject\n *\n * @generated from field: optional string subject = 2;\n */\n subject?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.PrivateJWTAuth.\n * Use `create(PrivateJWTAuthSchema)` to create a new message.\n */\nexport const PrivateJWTAuthSchema: GenMessage<PrivateJWTAuth, {jsonType: PrivateJWTAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 5);\n\n/**\n * mTLS auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.MTLSAuth\n */\nexport type MTLSAuth = Message<\"mochabugapis.adapt.plugins.v1.MTLSAuth\"> & {\n /**\n * The certificate in PEM format\n * The content of the file must be PEM format after decoding\n * If a certificate chain is presented. The server certificate must be the first one\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File certificate = 1;\n */\n certificate?: File;\n\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 2;\n */\n privateKey?: File;\n\n /**\n * The CA certificate in PEM format. Trusted server authority file\n * The content of the file must be PEM format after decoding\n * The content must contain a CERTIFICATE block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File ca_certificate = 3;\n */\n caCertificate?: File;\n\n /**\n * The expected hostname for certificate verification (SNI - Server Name Indication).\n *\n * If present, the client will:\n * 1. Send this hostname in the TLS SNI extension during the handshake\n * 2. Verify that the server's certificate authenticates this specific hostname\n *\n * If not provided:\n * - The hostname is derived from the target upstream address\n * - For IP addresses, certificate verification may fail unless the cert includes the IP as a SAN\n *\n * ## Use Cases\n *\n * 1. **IP-based connections with hostname certificates:**\n * - Upstream address: 192.168.1.100:443\n * - certificate_host: \"api.example.com\"\n * - Server presents cert for api.example.com\n *\n * 2. **Load balancers or proxies:**\n * - Upstream address: lb.internal:443\n * - certificate_host: \"api.example.com\"\n * - Verify against the public hostname, not internal LB name\n *\n * 3. **Shared hosting / Virtual hosting:**\n * - Multiple services on same IP, different certs via SNI\n * - Server selects correct certificate based on SNI hostname\n *\n * ## Certificate Verification\n *\n * The server certificate must contain this hostname in either:\n * - Common Name (CN) field\n * - Subject Alternative Name (SAN) extension\n *\n * ## Format\n *\n * Must be a valid hostname (DNS name), not an IP address.\n * Examples: \"api.example.com\", \"service.internal\", \"*.example.com\" (for wildcard matching)\n *\n * @generated from field: optional string certificate_host = 4;\n */\n certificateHost?: string;\n};\n\n/**\n * mTLS auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.MTLSAuth\n */\nexport type MTLSAuthJson = {\n /**\n * The certificate in PEM format\n * The content of the file must be PEM format after decoding\n * If a certificate chain is presented. The server certificate must be the first one\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File certificate = 1;\n */\n certificate?: FileJson;\n\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 2;\n */\n privateKey?: FileJson;\n\n /**\n * The CA certificate in PEM format. Trusted server authority file\n * The content of the file must be PEM format after decoding\n * The content must contain a CERTIFICATE block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File ca_certificate = 3;\n */\n caCertificate?: FileJson;\n\n /**\n * The expected hostname for certificate verification (SNI - Server Name Indication).\n *\n * If present, the client will:\n * 1. Send this hostname in the TLS SNI extension during the handshake\n * 2. Verify that the server's certificate authenticates this specific hostname\n *\n * If not provided:\n * - The hostname is derived from the target upstream address\n * - For IP addresses, certificate verification may fail unless the cert includes the IP as a SAN\n *\n * ## Use Cases\n *\n * 1. **IP-based connections with hostname certificates:**\n * - Upstream address: 192.168.1.100:443\n * - certificate_host: \"api.example.com\"\n * - Server presents cert for api.example.com\n *\n * 2. **Load balancers or proxies:**\n * - Upstream address: lb.internal:443\n * - certificate_host: \"api.example.com\"\n * - Verify against the public hostname, not internal LB name\n *\n * 3. **Shared hosting / Virtual hosting:**\n * - Multiple services on same IP, different certs via SNI\n * - Server selects correct certificate based on SNI hostname\n *\n * ## Certificate Verification\n *\n * The server certificate must contain this hostname in either:\n * - Common Name (CN) field\n * - Subject Alternative Name (SAN) extension\n *\n * ## Format\n *\n * Must be a valid hostname (DNS name), not an IP address.\n * Examples: \"api.example.com\", \"service.internal\", \"*.example.com\" (for wildcard matching)\n *\n * @generated from field: optional string certificate_host = 4;\n */\n certificateHost?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.MTLSAuth.\n * Use `create(MTLSAuthSchema)` to create a new message.\n */\nexport const MTLSAuthSchema: GenMessage<MTLSAuth, {jsonType: MTLSAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 6);\n\n/**\n * SAML bearer auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.SAMLAuth\n */\nexport type SAMLAuth = Message<\"mochabugapis.adapt.plugins.v1.SAMLAuth\"> & {\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 1;\n */\n privateKey?: File;\n\n /**\n * The certificate in PEM format\n * The content of the file must be PEM format after decoding\n * If a certificate chain is presented. The server certificate must be the first one\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File certificate = 2;\n */\n certificate?: File;\n};\n\n/**\n * SAML bearer auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.SAMLAuth\n */\nexport type SAMLAuthJson = {\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 1;\n */\n privateKey?: FileJson;\n\n /**\n * The certificate in PEM format\n * The content of the file must be PEM format after decoding\n * If a certificate chain is presented. The server certificate must be the first one\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File certificate = 2;\n */\n certificate?: FileJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.SAMLAuth.\n * Use `create(SAMLAuthSchema)` to create a new message.\n */\nexport const SAMLAuthSchema: GenMessage<SAMLAuth, {jsonType: SAMLAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 7);\n\n/**\n * The algorithm used for signing JWT or SAML assertions\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.PrivateKeyAlg\n */\nexport enum PrivateKeyAlg {\n /**\n * Unknown algorithm (invalid)\n *\n * @generated from enum value: PRIVATE_KEY_ALG_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * RS256 algorithm\n *\n * @generated from enum value: PRIVATE_KEY_ALG_RS256 = 1;\n */\n RS256 = 1,\n}\n\n/**\n * The algorithm used for signing JWT or SAML assertions\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.PrivateKeyAlg\n */\nexport type PrivateKeyAlgJson = \"PRIVATE_KEY_ALG_UNSPECIFIED\" | \"PRIVATE_KEY_ALG_RS256\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.PrivateKeyAlg.\n */\nexport const PrivateKeyAlgSchema: GenEnum<PrivateKeyAlg, PrivateKeyAlgJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 0);\n\n/**\n * The OAuth2 grant type\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Oauth2GrantType\n */\nexport enum Oauth2GrantType {\n /**\n * Not specified (invalid)\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Authorization Code Grant\n * grant_type=authorization_code\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE = 1;\n */\n AUTHORIZATION_CODE = 1,\n\n /**\n * Client Credentials Grant\n * grant_type=client_credentials\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS = 2;\n */\n CLIENT_CREDENTIALS = 2,\n\n /**\n * JWT Bearer Assertion Grant\n * grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_JWT_BEARER = 3;\n */\n JWT_BEARER = 3,\n\n /**\n * SAML 2.0 Bearer Assertion Grant\n * grant_type=urn:ietf:params:oauth:grant-type:saml2-bearer\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_SAML2_BEARER = 4;\n */\n SAML2_BEARER = 4,\n}\n\n/**\n * The OAuth2 grant type\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Oauth2GrantType\n */\nexport type Oauth2GrantTypeJson = \"OAUTH2_GRANT_TYPE_UNSPECIFIED\" | \"OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE\" | \"OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS\" | \"OAUTH2_GRANT_TYPE_JWT_BEARER\" | \"OAUTH2_GRANT_TYPE_SAML2_BEARER\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.Oauth2GrantType.\n */\nexport const Oauth2GrantTypeSchema: GenEnum<Oauth2GrantType, Oauth2GrantTypeJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 1);\n\n/**\n * The OAuth2 client authentication method\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Oauth2AuthType\n */\nexport enum Oauth2AuthType {\n /**\n * Not specified (invalid)\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Basic Authentication (client ID and secret in Authorization header)\n * client_secret_basic\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_BASIC = 1;\n */\n BASIC = 1,\n\n /**\n * Form Authentication (client ID and secret in form body)\n * client_secret_post\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_FORM = 2;\n */\n FORM = 2,\n\n /**\n * Private Key JWT Authentication\n * client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT = 3;\n */\n PRIVATE_KEY_JWT = 3,\n\n /**\n * Mutual TLS Authentication\n * tls_client_auth / self_signed_tls_client_auth\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_MTLS = 4;\n */\n MTLS = 4,\n\n /**\n * SAML 2.0 Bearer Assertion for Client Authentication\n * client_assertion_type=urn:ietf:params:oauth:client-assertion-type:saml2-bearer\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_SAML2_BEARER = 5;\n */\n SAML2_BEARER = 5,\n}\n\n/**\n * The OAuth2 client authentication method\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Oauth2AuthType\n */\nexport type Oauth2AuthTypeJson = \"OAUTH2_AUTH_TYPE_UNSPECIFIED\" | \"OAUTH2_AUTH_TYPE_BASIC\" | \"OAUTH2_AUTH_TYPE_FORM\" | \"OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT\" | \"OAUTH2_AUTH_TYPE_MTLS\" | \"OAUTH2_AUTH_TYPE_SAML2_BEARER\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.Oauth2AuthType.\n */\nexport const Oauth2AuthTypeSchema: GenEnum<Oauth2AuthType, Oauth2AuthTypeJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 2);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/variable_service.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { Value, ValueJson } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_struct } from \"@bufbuild/protobuf/wkt\";\nimport type { JTDSchema, JTDSchemaJson } from \"../../graph/jtd_schema_pb\";\nimport { file_mochabugapis_adapt_graph_jtd_schema } from \"../../graph/jtd_schema_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/variable_service.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_variable_service: GenFile = /*@__PURE__*/\n fileDesc(\"CjRtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS92YXJpYWJsZV9zZXJ2aWNlLnByb3RvEh1tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MSKeAQoSVmFyaWFibGVEZWZpbml0aW9uEjsKBnNjaGVtYRgBIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5ncmFwaC5KVERTY2hlbWFCBrpIA8gBARIsCgdkZWZhdWx0GAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlSACIAQESEQoJcGxhaW50ZXh0GAMgASgIQgoKCF9kZWZhdWx0YgZwcm90bzM\", [file_buf_validate_validate, file_google_protobuf_struct, file_mochabugapis_adapt_graph_jtd_schema]);\n\n/**\n * A definition of a JSON variable\n *\n * This message represents a variable used within the hosting platform.\n * Variables are essential for configuring applications and services hosted on the platform.\n * They store values that can be accessed by the application or service during runtime.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.VariableDefinition\n */\nexport type VariableDefinition = Message<\"mochabugapis.adapt.plugins.v1.VariableDefinition\"> & {\n /**\n * The schema that the variable must adhere to\n *\n * @generated from field: mochabugapis.adapt.graph.JTDSchema schema = 1;\n */\n schema?: JTDSchema;\n\n /**\n * The optional default value.\n *\n * ## Default Behavior: System Settings vs User Settings\n *\n * **System Settings** (Manifest.system_services):\n * - Defaults are automatically applied when the plugin is installed\n * - The service is marked as \"configured\" if all required bindings have defaults\n * - Plugin creators define and approve these defaults\n *\n * **User Settings** (Vertex.user_services):\n * - Defaults are UI hints only and NOT automatically applied\n * - The service is NOT marked as \"configured\" until the user explicitly submits settings\n * - Users must review and approve all settings, even with defaults present\n * - This ensures users actively consent to configuration values\n *\n * ## Rationale\n *\n * System settings use automatic defaults because the plugin creator (who defines\n * the defaults) is also the one approving them during plugin development.\n *\n * User settings require explicit submission because end users need to review and\n * consciously approve configuration values, even if reasonable defaults exist.\n *\n * IF the default value is pointing to a file with .json ending it's content will be\n * loaded and parsed as JSON.\n *\n * @generated from field: optional google.protobuf.Value default = 2;\n */\n default?: Value;\n\n /**\n * If true, the variable value is NOT treated as a secret.\n *\n * ## When plaintext = false (default):\n * - Values are encrypted at rest\n * - Values are treated as sensitive secrets\n *\n * ## When plaintext = true:\n * - Values are stored normally (not encrypted)\n * - Values are treated as non-sensitive data\n *\n * ## Use Cases for plaintext = false (default):\n * - API keys, access tokens, passwords\n * - Database connection strings with credentials\n * - Encryption keys, signing secrets\n * - OAuth client secrets\n * - Any credential material\n *\n * ## Use Cases for plaintext = true:\n * - Public configuration values\n * - Feature flags\n * - API endpoints (URLs without credentials)\n * - User IDs, tenant IDs, organization IDs\n * - Public identifiers\n *\n * ## Security Best Practices\n *\n * ALWAYS leave plaintext = false (default) for:\n * - Anything that grants access or authorization\n * - Anything that could be used to impersonate a user or service\n * - Any sensitive user-provided data\n *\n * Only set plaintext = true when the value contains non-sensitive\n * user-provided information.\n *\n * Default: false (variables are secrets by default)\n *\n * @generated from field: bool plaintext = 3;\n */\n plaintext: boolean;\n};\n\n/**\n * A definition of a JSON variable\n *\n * This message represents a variable used within the hosting platform.\n * Variables are essential for configuring applications and services hosted on the platform.\n * They store values that can be accessed by the application or service during runtime.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.VariableDefinition\n */\nexport type VariableDefinitionJson = {\n /**\n * The schema that the variable must adhere to\n *\n * @generated from field: mochabugapis.adapt.graph.JTDSchema schema = 1;\n */\n schema?: JTDSchemaJson;\n\n /**\n * The optional default value.\n *\n * ## Default Behavior: System Settings vs User Settings\n *\n * **System Settings** (Manifest.system_services):\n * - Defaults are automatically applied when the plugin is installed\n * - The service is marked as \"configured\" if all required bindings have defaults\n * - Plugin creators define and approve these defaults\n *\n * **User Settings** (Vertex.user_services):\n * - Defaults are UI hints only and NOT automatically applied\n * - The service is NOT marked as \"configured\" until the user explicitly submits settings\n * - Users must review and approve all settings, even with defaults present\n * - This ensures users actively consent to configuration values\n *\n * ## Rationale\n *\n * System settings use automatic defaults because the plugin creator (who defines\n * the defaults) is also the one approving them during plugin development.\n *\n * User settings require explicit submission because end users need to review and\n * consciously approve configuration values, even if reasonable defaults exist.\n *\n * IF the default value is pointing to a file with .json ending it's content will be\n * loaded and parsed as JSON.\n *\n * @generated from field: optional google.protobuf.Value default = 2;\n */\n default?: ValueJson;\n\n /**\n * If true, the variable value is NOT treated as a secret.\n *\n * ## When plaintext = false (default):\n * - Values are encrypted at rest\n * - Values are treated as sensitive secrets\n *\n * ## When plaintext = true:\n * - Values are stored normally (not encrypted)\n * - Values are treated as non-sensitive data\n *\n * ## Use Cases for plaintext = false (default):\n * - API keys, access tokens, passwords\n * - Database connection strings with credentials\n * - Encryption keys, signing secrets\n * - OAuth client secrets\n * - Any credential material\n *\n * ## Use Cases for plaintext = true:\n * - Public configuration values\n * - Feature flags\n * - API endpoints (URLs without credentials)\n * - User IDs, tenant IDs, organization IDs\n * - Public identifiers\n *\n * ## Security Best Practices\n *\n * ALWAYS leave plaintext = false (default) for:\n * - Anything that grants access or authorization\n * - Anything that could be used to impersonate a user or service\n * - Any sensitive user-provided data\n *\n * Only set plaintext = true when the value contains non-sensitive\n * user-provided information.\n *\n * Default: false (variables are secrets by default)\n *\n * @generated from field: bool plaintext = 3;\n */\n plaintext?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.VariableDefinition.\n * Use `create(VariableDefinitionSchema)` to create a new message.\n */\nexport const VariableDefinitionSchema: GenMessage<VariableDefinition, {jsonType: VariableDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_variable_service, 0);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/vertex.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenEnum, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/vertex.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_vertex: GenFile = /*@__PURE__*/\n fileDesc(\"Ciptb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS92ZXJ0ZXgucHJvdG8SHW1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxIpMECgZWZXJ0ZXgSMwoEbmFtZRgBIAEoCUIlukgiciAQARhkMhpeW18kYS16QS1aXVtfJGEtekEtWjAtOV0qJBIYCgVsYWJlbBgCIAEoCUIJukgGcgQQARhkEiQKC2Rlc2NyaXB0aW9uGAMgASgJQgq6SAdyBRABGPoBSACIAQESYgoEbG9nbxgEIAEoCUJPukhMckoQAhiAIDJDXihbXi9dKygvW14vXSspKilcLihnaWZ8anBnfGpwZWd8amZpZnxwanBlZ3xwanB8cG5nfHN2Z3x3ZWJwfGF2aWYpJEgBiAEBElIKDGNhcGFiaWxpdGllcxgFIAMoDjIpLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkNhcGFiaWxpdHlCEbpIDpIBCxgBIgeCAQQQASAAEjIKBmNvbmZpZxgGIAEoCUIdukgachgQBRiAIDIRXihbXi9dKygvW14vXSspKilIAogBARI2CghtZXRhZGF0YRgHIAEoCUIkukghch8QBRiAIDIYXihbXi9dKygvW14vXSspKilcLmpzb24kEiQKDXVzZXJfc2VydmljZXMYCCADKAlCDbpICpIBBwgAEPQDGAESFwoKZGVwcmVjYXRlZBgJIAEoCEgDiAEBQg4KDF9kZXNjcmlwdGlvbkIHCgVfbG9nb0IJCgdfY29uZmlnQg0KC19kZXByZWNhdGVkKosBCgpDYXBhYmlsaXR5EhoKFkNBUEFCSUxJVFlfVU5TUEVDSUZJRUQQABITCg9DQVBBQklMSVRZX0NST04QARIXChNDQVBBQklMSVRZX0VYVEVSTkFMEAISGwoXQ0FQQUJJTElUWV9DT05GSUdVUkFUT1IQAxIWChJDQVBBQklMSVRZX0JST1dTRVIQBGIGcHJvdG8z\", [file_buf_validate_validate]);\n\n/**\n * Vertex represents a graph vertex that defines a plugin.\n * Note: Be aware of potential security implications when dealing with\n * user-provided data, such as file paths, and ensure proper input validation\n * and sanitization.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Vertex\n */\nexport type Vertex = Message<\"mochabugapis.adapt.plugins.v1.Vertex\"> & {\n /**\n * 'name' represents the vertex name.\n *\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * 'label' is a human-friendly label displayed in the UI.\n *\n * @generated from field: string label = 2;\n */\n label: string;\n\n /**\n * 'description' is a human-friendly short description of the vertex displayed\n * in UI.\n *\n * @generated from field: optional string description = 3;\n */\n description?: string;\n\n /**\n * 'logo' is the file path to the vertex logo, which will be resized to a\n * maximum of 40x40 pixels. Ensure that the logo files are from trusted\n * sources to avoid security risks.\n * - Supported file formats:\n * - GIF: .gif\n * - JPEG: .jpg, .jpeg, .jfif, .pjpeg, .pjp\n * - PNG: .png\n * - SVG: .svg\n * - WEBP: .webp\n * - AVIF: .avif\n *\n * @generated from field: optional string logo = 4;\n */\n logo?: string;\n\n /**\n * 'capabilities' specifies the capabilities of the vertex\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.Capability capabilities = 5;\n */\n capabilities: Capability[];\n\n /**\n * 'config' is an field that contains a Unix file path.\n * This can be any type of file, this is only intepreted for the vertex itself\n * Restrictions:\n *\n *\n * @generated from field: optional string config = 6;\n */\n config?: string;\n\n /**\n * 'metadata' is an field that contains a Unix file path.\n * This determines which receivers, transmitters etc... the vertex has to begin with\n * Restrictions:\n *\n *\n * @generated from field: string metadata = 7;\n */\n metadata: string;\n\n /**\n * 'user_services' are vertex-level services configured per vertex instance.\n *\n * This is a string array where each string directly references a ServiceDefinition by its name\n * from Manifest.service_definitions. These services are configured by end users for each\n * specific vertex instance in their workflow.\n *\n * The `optional` field in the ServiceDefinition controls whether configuration is required:\n * - If ServiceDefinition.optional = false (default): User MUST configure this service\n * - If ServiceDefinition.optional = true: User MAY skip configuring this service\n *\n * Example:\n * service_definitions: [\n * { name: \"api_key\", variable: {...} },\n * { name: \"webhook_url\", variable: {...}, optional: true }\n * ]\n * user_services: [\"api_key\", \"webhook_url\"]\n *\n * @generated from field: repeated string user_services = 8;\n */\n userServices: string[];\n\n /**\n * 'deprecated' is a boolean that indicates if the vertex is deprecated\n * this means that it will be removed in the next major version\n * and should be migrated asap\n *\n * @generated from field: optional bool deprecated = 9;\n */\n deprecated?: boolean;\n};\n\n/**\n * Vertex represents a graph vertex that defines a plugin.\n * Note: Be aware of potential security implications when dealing with\n * user-provided data, such as file paths, and ensure proper input validation\n * and sanitization.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Vertex\n */\nexport type VertexJson = {\n /**\n * 'name' represents the vertex name.\n *\n * @generated from field: string name = 1;\n */\n name?: string;\n\n /**\n * 'label' is a human-friendly label displayed in the UI.\n *\n * @generated from field: string label = 2;\n */\n label?: string;\n\n /**\n * 'description' is a human-friendly short description of the vertex displayed\n * in UI.\n *\n * @generated from field: optional string description = 3;\n */\n description?: string;\n\n /**\n * 'logo' is the file path to the vertex logo, which will be resized to a\n * maximum of 40x40 pixels. Ensure that the logo files are from trusted\n * sources to avoid security risks.\n * - Supported file formats:\n * - GIF: .gif\n * - JPEG: .jpg, .jpeg, .jfif, .pjpeg, .pjp\n * - PNG: .png\n * - SVG: .svg\n * - WEBP: .webp\n * - AVIF: .avif\n *\n * @generated from field: optional string logo = 4;\n */\n logo?: string;\n\n /**\n * 'capabilities' specifies the capabilities of the vertex\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.Capability capabilities = 5;\n */\n capabilities?: CapabilityJson[];\n\n /**\n * 'config' is an field that contains a Unix file path.\n * This can be any type of file, this is only intepreted for the vertex itself\n * Restrictions:\n *\n *\n * @generated from field: optional string config = 6;\n */\n config?: string;\n\n /**\n * 'metadata' is an field that contains a Unix file path.\n * This determines which receivers, transmitters etc... the vertex has to begin with\n * Restrictions:\n *\n *\n * @generated from field: string metadata = 7;\n */\n metadata?: string;\n\n /**\n * 'user_services' are vertex-level services configured per vertex instance.\n *\n * This is a string array where each string directly references a ServiceDefinition by its name\n * from Manifest.service_definitions. These services are configured by end users for each\n * specific vertex instance in their workflow.\n *\n * The `optional` field in the ServiceDefinition controls whether configuration is required:\n * - If ServiceDefinition.optional = false (default): User MUST configure this service\n * - If ServiceDefinition.optional = true: User MAY skip configuring this service\n *\n * Example:\n * service_definitions: [\n * { name: \"api_key\", variable: {...} },\n * { name: \"webhook_url\", variable: {...}, optional: true }\n * ]\n * user_services: [\"api_key\", \"webhook_url\"]\n *\n * @generated from field: repeated string user_services = 8;\n */\n userServices?: string[];\n\n /**\n * 'deprecated' is a boolean that indicates if the vertex is deprecated\n * this means that it will be removed in the next major version\n * and should be migrated asap\n *\n * @generated from field: optional bool deprecated = 9;\n */\n deprecated?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Vertex.\n * Use `create(VertexSchema)` to create a new message.\n */\nexport const VertexSchema: GenMessage<Vertex, {jsonType: VertexJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_vertex, 0);\n\n/**\n * The capabilities of a vertex defines how the vertex is interracted with\n * If the vertex has the cron capabilitiy, then a cron-scheduler will call the\n * cron endpoint periodically until the vertex has finished or stopped\n * If the vertex has external browser capabiltity, there will be an external endpoint\n * where a third-party can communicate with the vertex\n * If the vertex has a configurator, then the vertex will be able to be configured dynamically\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Capability\n */\nexport enum Capability {\n /**\n * Unspecified capability (default value, should not be used).\n *\n * @generated from enum value: CAPABILITY_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Cron capability, indicating that the vertex can be triggered at specific\n * intervals.\n *\n * @generated from enum value: CAPABILITY_CRON = 1;\n */\n CRON = 1,\n\n /**\n * The external capability, indicating that the vertex can be accessed via a\n * publicly routable address.\n *\n * @generated from enum value: CAPABILITY_EXTERNAL = 2;\n */\n EXTERNAL = 2,\n\n /**\n * Configurator capability, indicating that the vertex can be configured\n * dynamically by a vertex-defined interface.\n *\n * @generated from enum value: CAPABILITY_CONFIGURATOR = 3;\n */\n CONFIGURATOR = 3,\n\n /**\n * Browser capability, indicating that the vertex can be accessed via a\n * browser context.\n *\n * @generated from enum value: CAPABILITY_BROWSER = 4;\n */\n BROWSER = 4,\n}\n\n/**\n * The capabilities of a vertex defines how the vertex is interracted with\n * If the vertex has the cron capabilitiy, then a cron-scheduler will call the\n * cron endpoint periodically until the vertex has finished or stopped\n * If the vertex has external browser capabiltity, there will be an external endpoint\n * where a third-party can communicate with the vertex\n * If the vertex has a configurator, then the vertex will be able to be configured dynamically\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Capability\n */\nexport type CapabilityJson = \"CAPABILITY_UNSPECIFIED\" | \"CAPABILITY_CRON\" | \"CAPABILITY_EXTERNAL\" | \"CAPABILITY_CONFIGURATOR\" | \"CAPABILITY_BROWSER\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.Capability.\n */\nexport const CapabilitySchema: GenEnum<Capability, CapabilityJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_vertex, 0);\n\n"],
5
- "mappings": ";AAAA,SAAS,QAAQ,UAAU,gBAAgB,cAAc;AACzD,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC;AAAA,EAEE;AAAA,OACK;AACP,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,SAAuB,SAAS,eAAe;AAC/C,SAAS,QAAQ,YAAY;AAC7B,OAAOA,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,SAAS;;;ACZhB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;;;ACH9B,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AACjB,OAAO,QAAQ;;;ACKR,SAAS,mBAAmB,UAA0C;AAC3E,QAAM,UAAU,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,GAAG,WAAW;AAAA,IAC1E,aAAa;AAAA,IACb,aAAa,KAAK,KAAK;AAAA;AAAA,IACvB;AAAA,EACF,EAAE;AAGF,QAAM,mBAAmB,QACtB;AAAA,IACC,CAAC,EAAE,aAAa,WAAW,MACzB,UAAU,WAAW,UAAU,UAAU;AAAA,EAC7C,EACC,KAAK,IAAI;AAIZ,QAAM,iBAAiB,QACpB,IAAI,CAAC,EAAE,aAAa,YAAY,MAAM,IAAI,WAAW,MAAM,WAAW,EAAE,EACxE,KAAK,IAAI;AAIZ,QAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BjC,SAAO;AAAA,IACL,gBAAgB;AAAA;AAAA,IAEhB,yBAAyB,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,mDAIgB,cAAc;AAAA;AAAA;AAAA;AAIjE;;;AD5DO,SAAS,qBACd,YACA,WACQ;AACR,QAAM,SAAS,IAAI,OAAO,IAAI,UAAU,EAAE;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAMC,QAAO;AACX,MAAAA,OAAM,UAAU,EAAE,QAAQ,OAAO,GAAG,CAAC,SAAS;AAC5C,eAAO,EAAE,MAAM,KAAK,MAAM,WAAW,UAAU;AAAA,MACjD,CAAC;AAGD,MAAAA,OAAM,OAAO,EAAE,QAAQ,QAAQ,WAAW,UAAU,GAAG,MAAM;AAC3D,cAAM,WAAW,mBAAmB,SAAS;AAC7C,eAAO,EAAE,UAAU,QAAQ,MAAM,YAAY,QAAQ,IAAI,EAAE;AAAA,MAC7D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,UAAU,KAAK,QAAQA,SAAQ,QAAQ,mBAAmB,CAAC;AAC1D,SAAS,iBAAiB,OAAuC;AACtE,QAAM,eAAe,OAAO,QAAQ,KAAK,EAAE;AAAA,IACzC,CAAC,CAAC,EAAE,KAAK,MACP,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW,0BAA0B;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAMD,QAAO;AACX,iBAAW,CAAC,UAAU,UAAU,KAAK,cAAc;AACjD,QAAAA,OAAM,UAAU,EAAE,QAAQ,IAAI,OAAO,IAAI,QAAQ,GAAG,EAAE,GAAG,MAAM;AAC7D,gBAAM,WAAWC,SAAQ,QAAQ,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AACjE,iBAAO,EAAE,MAAM,SAAS;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,mBAAmB,SAAoC;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAMD,QAAO;AACX,YAAM,YAAY,oBAAI,IAAoB;AAC1C,YAAMC,WAAU,cAAc,YAAY,GAAG;AAE7C,MAAAD,OAAM,UAAU,EAAE,QAAQ,kBAAkB,GAAG,CAAC,SAAS;AACvD,YAAI;AACF,cAAI;AAEJ,cAAI,KAAK,KAAK,WAAW,GAAG,GAAG;AAC7B,2BAAe,KAAK,QAAQ,KAAK,YAAY,KAAK,IAAI;AAAA,UACxD,OAAO;AACL,2BAAeC,SAAQ,QAAQ,KAAK,MAAM;AAAA,cACxC,OAAO,CAAC,KAAK,UAAU;AAAA,YACzB,CAAC;AAAA,UACH;AAGA,cAAI,CAAC,aAAa,SAAS,OAAO,GAAG;AACnC,mBAAO;AAAA,UACT;AAEA,cAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,kBAAM,IAAI,MAAM,wBAAwB,YAAY,EAAE;AAAA,UACxD;AAEA,gBAAM,eAAe,KAAK,SAAS,YAAY;AAC/C,oBAAU,IAAI,cAAc,YAAY;AAExC,kBAAQ,IAAI,eAAe,KAAK,IAAI,OAAO,YAAY,EAAE;AAEzD,iBAAO;AAAA,YACL,MAAM,KAAK,YAAY;AAAA,YACvB,UAAU;AAAA,UACZ;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,2BAA2B,KAAK,IAAI,IAAI,KAAK;AAC3D,gBAAM;AAAA,QACR;AAAA,MACF,CAAC;AAED,MAAAD,OAAM,MAAM,MAAM;AAChB,kBAAU,QAAQ,CAAC,YAAY,aAAa;AAC1C,gBAAM,WAAW,KAAK,KAAK,QAAQ,QAAQ,QAAQ;AACnD,gBAAM,WAAW,GAAG,aAAa,UAAU;AAG3C,cAAI,SAAS,SAAS,GAAG;AACvB,kBAAM,IAAI;AAAA,cACR,GAAG,QAAQ,0CAA0C,SAAS,MAAM;AAAA,YACtE;AAAA,UACF;AAEA,gBAAM,YAAY,OAAO,KAAK,CAAC,GAAM,IAAM,KAAM,GAAI,CAAC;AACtD,cAAI,CAAC,SAAS,SAAS,GAAG,CAAC,EAAE,OAAO,SAAS,GAAG;AAC9C,kBAAM,cAAc,SAAS,SAAS,GAAG,CAAC,EAAE,SAAS,KAAK;AAC1D,kBAAM,IAAI;AAAA,cACR,GAAG,QAAQ,uCAAuC,WAAW;AAAA,YAC/D;AAAA,UACF;AAEA,aAAG,cAAc,UAAU,QAAQ;AACnC,kBAAQ;AAAA,YACN,gBAAgB,QAAQ,MAAM,SAAS,SAAS,MAAM;AAAA,cACpD;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AD1HA,SAAS,2BAA2B;AAE7B,IAAM,eAAe,KAAK;AAAA,EAC/BE,IAAG,aAAa,gBAAgB,OAAO;AACzC;AACO,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAC1B,IAAM,eAAe;AACrB,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAC1B,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB,CAAC,OAAO,MAAM,MAAM,KAAK;AAGxD,IAAM,gBAA8B;AAAA,EAClC,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAGO,IAAM,0BAAwC;AAAA,EACnD,GAAG;AAAA,EACH,QAAQC,MAAK,KAAK,aAAa,SAAS;AAAA,EACxC,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,IACN,GAAG,cAAc;AAAA,IACjB,SAAS;AAAA,EACX;AACF;AAGO,IAAM,sBAAoC;AAAA,EAC/C,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,KAAK;AAAA,EACrC,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,cAAc;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,GAAG,cAAc;AAAA,IACjB,SAAS;AAAA,EACX;AACF;AAEA,IAAM,EAAE,KAAK,UAAU,IAAI,UAAU;AAAA,EACnC,YAAY;AAAA,EACZ,SAAS;AAAA,IACP,oBAAoB;AAAA,MAClB,mBAAmB;AAAA,MACnB,oBAAoB,CAAC,eAAe;AAAA,IACtC,CAAC;AAAA,EACH;AACF,CAAC;AAGD,IAAM,sBAAoC;AAAA,EACxC,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU,CAAC,GAAG,UAAU,QAAQ;AAAA,EAChC,SAAS,CAAC,iBAAiB,UAAU,KAAK,CAAC;AAAA,EAC3C,OAAO,UAAU;AACnB;AAGO,IAAM,sCAAoD;AAAA,EAC/D,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,WAAW;AAAA,EAC3C,QAAQ;AAAA,EACR,QAAQ;AAAA,IACNA,MAAK;AAAA,MACHA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,CAAC,UAAU,MAAM;AAC/B;AAGO,IAAM,sCAAoD;AAAA,EAC/D,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,WAAW;AAAA,EAC3C,QAAQ;AAAA,EACR,QAAQ;AAAA,IACNA,MAAK;AAAA,MACHA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,CAAC,QAAQ,QAAQ;AAAA,EAC7B,cAAc;AAAA,IACZ,OAAO;AAAA,EACT;AACF;AAGO,IAAM,0CAAwD;AAAA,EACnE,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,eAAe;AAAA,EAC/C,QAAQ;AAAA,EACR,QAAQ;AAAA,IACNA,MAAK;AAAA,MACHA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,CAAC,UAAU,MAAM;AAC/B;AAGO,IAAM,0CAAwD;AAAA,EACnE,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,eAAe;AAAA,EAC/C,QAAQ;AAAA,EACR,QAAQ;AAAA,IACNA,MAAK;AAAA,MACHA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,CAAC,QAAQ,QAAQ;AAAA,EAC7B,cAAc;AAAA,IACZ,OAAO;AAAA,EACT;AACF;;;AGnKA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAWV,SAAS,sBAAsB,OAKlC;AACF,QAAM,SAKA,CAAC;AACP,aAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC7C,QAAI;AACJ,eAAW,OAAO,iBAAiB;AACjC,YAAM,WAAWC,MAAK,KAAK,GAAG,MAAM,GAAG,iBAAiB,IAAI,GAAG,EAAE;AACjE,UAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AACA,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AACA,UAAM,OAAOD,MAAK,KAAK,GAAG,MAAM,iBAAiB;AACjD,QAAI,CAACC,IAAG,WAAW,IAAI,GAAG;AACxB,YAAM,IAAI;AAAA,QACR,OAAO,OAAO,2CAA2C,iBAAiB;AAAA,MAC5E;AAAA,IACF;AAEA,QAAI,MAAM;AACV,eAAW,OAAO,iBAAiB;AACjC,YAAM,WAAWD,MAAK,KAAK,GAAG,MAAM,GAAG,gBAAgB,IAAI,GAAG,EAAE;AAChE,UAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,cAAM;AACN;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,QAAW;AACrB,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,OAKnC;AACF,QAAM,SAKA,CAAC;AACP,aAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC7C,QAAI;AACJ,eAAW,OAAO,iBAAiB;AACjC,YAAM,WAAWD,MAAK,KAAK,GAAG,MAAM,GAAG,aAAa,IAAI,GAAG,EAAE;AAC7D,UAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AACA,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AACA,UAAM,OAAOD,MAAK,KAAK,GAAG,MAAM,aAAa;AAC7C,QAAI,CAACC,IAAG,WAAW,IAAI,GAAG;AACxB,YAAM,IAAI;AAAA,QACR,OAAO,OAAO,2CAA2C,aAAa;AAAA,MACxE;AAAA,IACF;AAEA,QAAI,MAAM;AACV,eAAW,OAAO,iBAAiB;AACjC,YAAM,WAAWD,MAAK,KAAK,GAAG,MAAM,GAAG,YAAY,IAAI,GAAG,EAAE;AAC5D,UAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,cAAM;AACN;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,QAAW;AACrB,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AC1GA,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;;;ACAtC,SAAS,UAAU,SAAS,UAAU,mBAAmB;AAEzD,SAAS,iCAAiC,+BAA+B,sCAAsC;AAMxG,IAAM,6BACX,yBAAS,orqEAAorqE,CAAC,iCAAiC,+BAA+B,8BAA8B,CAAC;;;ADN/xqE,SAAS,mCAAmC;AAMrC,IAAM,2CACX,gBAAAC,UAAS,g3JAAg3J,CAAC,4BAA4B,2BAA2B,CAAC;AAkZ76J,IAAM,kBACX,gBAAAC,aAAY,0CAA0C,CAAC;;;AE7ZzD,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;AAO/B,IAAM,0CACX,gBAAAC,UAAS,2RAA2R,CAAC,0BAA0B,CAAC;AA8D3T,IAAM,aACX,gBAAAC,aAAY,yCAAyC,CAAC;;;ACvExD,SAAS,YAAAC,YAAU,eAAAC,qBAAmB;;;ACAtC,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;;;ACAtC,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;AAO/B,IAAM,uDACX,gBAAAC,UAAS,gtBAAgtB,CAAC,0BAA0B,CAAC;;;ACRvvB,SAAS,YAAAC,WAAU,YAAAC,WAAU,eAAAC,oBAAmB;AASzC,IAAM,wDACX,gBAAAC,UAAS,4sFAA4sF,CAAC,4BAA4B,uCAAuC,CAAC;;;ACV5xF,SAAS,YAAAC,WAAU,YAAAC,WAAU,eAAAC,oBAAmB;AASzC,IAAM,oDACX,gBAAAC,UAAS,8kJAA8kJ,CAAC,4BAA4B,uCAAuC,CAAC;;;ACV9pJ,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;AAGtC,SAAS,+BAAAC,oCAAmC;AAQrC,IAAM,sDACX,gBAAAC,UAAS,uVAAuV,CAAC,4BAA4BC,8BAA6B,wCAAwC,CAAC;;;AJG9b,IAAM,wDACX,gBAAAC,UAAS,g2BAAg2B,CAAC,4BAA4B,sDAAsD,uDAAuD,mDAAmD,mDAAmD,CAAC;;;AKhB5lC,SAAS,YAAAC,WAAU,YAAAC,WAAU,eAAAC,oBAAmB;AAOzC,IAAM,4CACX,gBAAAC,UAAS,w/BAAw/B,CAAC,0BAA0B,CAAC;AA0NxhC,IAAM,eACX,gBAAAC,aAAY,2CAA2C,CAAC;;;ANxNnD,IAAM,8CACX,gBAAAC,WAAS,g5DAAg5D,CAAC,4BAA4B,uDAAuD,yCAAyC,CAAC;AAoZlhE,IAAM,iBACX,gBAAAC,cAAY,6CAA6C,CAAC;;;ARnW5D,IAAM,MAAM,IAAI,IAAI;AACpB,IAAM,YAAY,gBAAgB;AAElC,eAAsB,MAAM,MAAmC;AAC7D,UAAQ,IAAI,MAAM,KAAK,KAAK,sQAA+C,CAAC;AAC5E,UAAQ,IAAI,MAAM,KAAK,KAAK,6DAA4C,CAAC;AACzE,UAAQ,IAAI,MAAM,KAAK,KAAK,sQAA+C,CAAC;AAG5E,QAAM,kBAAkB,IAAI;AAAA,IAC1B,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,WAAW;AAAA,IACf;AAAA,IACAC,IAAG,aAAa,eAAe,MAAM;AAAA,EACvC;AAEA,kBAAgB;AAAA,IACd,aAAa,MAAM;AAAA,MACjB,GAAG,SAAS,YAAY,IAAI,SAAS,IAAI;AAAA,IAC3C,CAAC,IAAI,MAAM,IAAI,IAAI,SAAS,OAAO,EAAE,CAAC;AAAA,EACxC;AAEA,QAAM,UAAU,GAAG,MAAM,WAAW,eAAe,IACjD,SAAS,YACX,IAAI,SAAS,IAAI,IAAI,SAAS,OAAO;AACrC,UAAQ,IAAI,MAAM,IAAI,SAAI,IAAI,MAAM,KAAK,QAAQ,OAAO;AAAA,CAAI,CAAC;AAE7D,QAAM,WAAW,iBAAiB,SAAS,IAAI;AAG/C,QAAM,gBAAgB,IAAI;AAAA,IACxB,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,aAAqC,CAAC;AAC5C,WAAS,WAAW,KAAKC,MAAK,KAAK,SAAS,KAAK,gBAAgB,CAAC,EAAE;AAAA,IAClE,CAAC,SAAS;AACR,YAAM,MAAM,eAAe,cAAcD,IAAG,aAAa,MAAM,MAAM,CAAC;AACtE,iBAAW,IAAI,IAAI,IAAIC,MAAK,QAAQ,IAAI;AACxC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,WAAW,GAAG;AAClC,kBAAc,KAAK,mBAAmB;AACtC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,aAAW,OAAO,SAAS,oBAAoB;AAC7C,UAAM,8BAA8B,KAAK,GAAG;AAAA,EAC9C;AAEA,gBAAc;AAAA,IACZ,SAAS,MAAM,KAAK,SAAS,SAAS,MAAM,CAAC,IAC3C,SAAS,SAAS,WAAW,IAAI,WAAW,UAC9C,KAAK,SAAS,SAAS,IAAI,CAAC,MAAM,MAAM,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EAClE;AACA,UAAQ,IAAI,EAAE;AAEd,QAAM,SAAS,UAAU,SAAS,gBAAgB,QAAQ;AAC1D,MAAI,OAAO,SAAS,SAAS;AAC3B,YAAQ,MAAM,MAAM,KAAK,IAAI,sCAAiC,CAAC;AAC/D,YAAQ,MAAM,OAAO,KAAK;AAC1B,YAAQ,MAAM,OAAO,UAAU;AAC/B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,UAAU,YAAY,QAAQ;AACjD,QAAM,YAAY,UAAU,YAAY,QAAQ;AAEhD,UAAQ,IAAI,MAAM,KAAK,MAAM,0CAAqC,CAAC;AACrE;AAGA,eAAsB,8BACpB,UACA,KACA;AACA,UAAQ,IAAI,KAAK,MAAM;AAAA,IACrB,KAAK,YAAY;AAEf,UAAI;AACF,cAAM,SAAS,OAAO,iBAAiB,IAAI,KAAK,MAAM,MAAO;AAC7D,cAAM,IAAI,eAAe,QAAQ,IAAI;AACrC,YAAI,IAAI,KAAK,MAAM,SAAS;AAC1B,cAAI,eAAe,OAAO,aAAa,IAAI,KAAK,MAAM,OAAO;AAI7D,cACE,OAAO,iBAAiB,YACxB,aAAa,SAAS,OAAO,GAC7B;AACA,kBAAM,WAAWA,MAAK,KAAK,UAAU,YAAY;AACjD,gBAAID,IAAG,WAAW,QAAQ,GAAG;AAC3B,oBAAM,cAAcA,IAAG,aAAa,UAAU,OAAO;AACrD,6BAAe,KAAK,MAAM,WAAW;AACrC,kBAAI,KAAK,MAAM,UAAU,SAAS,aAAa,YAAY;AAAA,YAC7D,OAAO;AACL,oBAAM,IAAI,MAAM,mCAAmC,QAAQ,EAAE;AAAA,YAC/D;AAAA,UACF;AAEA,cAAI,CAAC,IAAI,SAAS,QAAQ,YAAY,GAAG;AACvC,kBAAM,IAAI;AAAA,cACR,+BAA+B,IAAI,WAAW,IAAI,MAAM,CAAC;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAY;AACnB,cAAM,IAAI;AAAA,UACR,6CAA6C,IAAI,IAAI,MAAM,MAAM,OAAO;AAAA,QAC1E;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,UAAI;AACF,YAAI,IAAI,KAAK,MAAM,KAAK,UAAU;AAChC,gBAAM,eAAeC,MAAK;AAAA,YACxB;AAAA,YACA,IAAI,KAAK,MAAM,IAAI,SAAS;AAAA,UAC9B;AACA,cAAID,IAAG,WAAW,YAAY,GAAG;AAC/B,gBAAI,KAAK,MAAM,IAAI,WAAW,OAAO,YAAY;AAAA,cAC/C,MAAM,IAAI,KAAK,MAAM,IAAI,SAAS;AAAA,cAClC,MAAMA,IAAG,aAAa,YAAY;AAAA,YACpC,CAAC;AAAA,UACH,OAAO;AACL,kBAAM,IAAI,MAAM,+BAA+B,YAAY,EAAE;AAAA,UAC/D;AAAA,QACF;AAAA,MACF,SAAS,OAAY;AACnB,cAAM,IAAI;AAAA,UACR,6CAA6C,IAAI,IAAI,MAAM,MAAM,OAAO;AAAA,QAC1E;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,YACpB,UACA,aACA,MACA;AACA,UAAQ,IAAI,MAAM,KAAK,QAAQ,wBAAiB,CAAC;AACjD,UAAQ,IAAI,MAAM,IAAI,gQAA8C,CAAC;AAGrE,QAAM,cAAc,IAAI;AAAA,IACtB,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,cAAc,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AACzE,UAAM,MAAM,iBAAiB,YAAY,UAAU;AACnD,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,uDAAuD;AACzE,WAAO,CAAC,KAAK,GAAG;AAAA,EAClB,CAAC;AAED,MAAI,YAAY,WAAW,GAAG;AAC5B,gBAAY,KAAK,yBAAyB;AAC1C,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,OAAK,OAAO,SAAS,UAAU;AAAA,IAC7B,GAAI,KAAK,OAAO,SAAS,WAAW,CAAC;AAAA,IACrC;AAAA,MACE;AAAA,MACA,OAAO,YAAY,WAAW;AAAA,IAChC;AAAA,IACA,mBAAmB,EAAE,QAAQ,KAAK,OAAO,SAAS,OAAQ,CAAC;AAAA,EAC7D;AACA,OAAK,OAAO,SAAS,cAAc;AAAA,IACjC;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,IACP;AAAA,EACF;AAEA,cAAY,OAAO,YAAY,YAAY,MAAM,YAC/C,YAAY,WAAW,IAAI,KAAK,GAClC;AACA,QAAM,QAAQ,KAAK,OAAO,QAAQ;AAClC,cAAY;AAAA,IACV,mBAAmB,MAAM;AAAA,MACvB,IAAI,YAAY,MAAM,IAAI,YAAY,WAAW,IAAI,SAAS,OAAO;AAAA,IACvE,CAAC;AAAA,EACH;AAGA,QAAM,gBAAgB,IAAI;AAAA,IACxB,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,gBAAgB,SAAS,SAC5B;AAAA,IAAO,CAAC,MACP,QAAQ,EAAE,aAAa,KAAK,CAAC,MAAM,0BAA6B,CAAC;AAAA,EACnE,EACC,IAAI,CAAC,MAAM;AACV,UAAM,cAAc,YAAY,EAAE,IAAI;AACtC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,4BAA4B,EAAE,IAAI,EAAE;AAAA,IACtD;AACA,UAAM,MAAM,iBAAiB,aAAa,cAAc;AACxD,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,WAAO,CAAC,EAAE,MAAM,GAAG;AAAA,EACrB,CAAC;AAEH,OAAK,OAAO,aAAa,UAAU;AAAA,IACjC,GAAI,KAAK,OAAO,aAAa,WAAW,CAAC;AAAA,IACzC;AAAA,MACE;AAAA,MACA,OAAO,YAAY,aAAa;AAAA,IAClC;AAAA,IACA,mBAAmB,EAAE,QAAQ,KAAK,OAAO,aAAa,OAAQ,CAAC;AAAA,EACjE;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,SAAK,OAAO,aAAa,cAAc;AAAA,MACrC;AAAA,QACE,IAAI;AAAA,QACJ,KAAK;AAAA,MACP;AAAA,IACF;AACA,kBAAc,OAAO,YAAY,cAAc,MAAM,gBACnD,cAAc,WAAW,IAAI,KAAK,GACpC;AACA,UAAM,QAAQ,KAAK,OAAO,YAAY;AACtC,kBAAc;AAAA,MACZ,uBAAuB,MAAM;AAAA,QAC3B,IAAI,cAAc,MAAM,IACtB,cAAc,WAAW,IAAI,SAAS,OACxC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,kBAAc,KAAK,gCAAgC;AAAA,EACrD;AAEA,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAe,aACb,UACA,aACA,MACA;AACA,UAAQ,IAAI,MAAM,KAAK,KAAK,yBAAkB,CAAC;AAC/C,UAAQ,IAAI,MAAM,IAAI,gQAA8C,CAAC;AAErE,QAAM,mBAAmB,IAAI;AAAA,IAC3B,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,QAAQ,CAAC,MACbA,IAAG,WAAWC,MAAK,KAAK,YAAY,EAAE,IAAI,GAAI,IAAI,CAAC;AACrD,QAAM,iBAAiB,SAAS,SAAS;AAAA,IACvC,CAAC,MACC,QAAQ,EAAE,aAAa,KAAK,CAAC,MAAM,0BAA6B,CAAC,KACjE,MAAM,CAAC;AAAA,EACX;AACA,QAAM,kBAAkB,SAAS,SAAS;AAAA,IACxC,CAAC,MACC,QAAQ,EAAE,aAAa,KAAK,CAAC,MAAM,qBAAwB,CAAC,KAAK,MAAM,CAAC;AAAA,EAC5E;AAEA,QAAM,UAAU,eAAe,SAAS,gBAAgB;AACxD,mBAAiB;AAAA,IACf,SAAS,MAAM,KAAK,OAAO,CAAC,gBAC1B,YAAY,IAAI,KAAK,GACvB,IAAI,MAAM;AAAA,MACR,IAAI,gBAAgB,MAAM,aAAa,eAAe,MAAM;AAAA,IAC9D,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,OAAO;AAAA,IACrB,eAAe,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,YAAY,EAAE,IAAI,CAAE,CAAC;AAAA,EAC1D;AACA,QAAM,WAAW,OAAO;AAAA,IACtB,gBAAgB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,YAAY,EAAE,IAAI,CAAE,CAAC;AAAA,EAC3D;AAEA,QAAM,oBAAoB,sBAAsB,OAAO;AACvD,QAAM,qBAAqB,uBAAuB,QAAQ;AAE1D,QAAM,gBAAqE,CAAC;AAC5E,OAAK,IAAI,cAAc,CAAC,GAAG,mBAAmB,GAAG,kBAAkB,EAChE,OAAO,CAAC,OAAO,GAAG,QAAQ,MAAS,EACnC,IAAI,CAAC,OAAO;AACX,kBAAc,GAAG,GAAI,IAAI;AAAA,MACvB,QAAQ,GAAG;AAAA,MACX,QAAQ,kBAAkB,SAAS,EAAE;AAAA,IACvC;AACA,WAAO,GAAG;AAAA,EACZ,CAAC;AAGH,QAAM,cAAsC,CAAC;AAC7C,QAAM,gBAAwC,CAAC;AAE/C,MAAI,KAAK,IAAI,YAAY,SAAS,GAAG;AACnC,UAAM,aAAa,IAAI;AAAA,MACrB,MAAM,mBAAmB,KAAK,IAAI,YAAY,MAAM,aAClD,KAAK,IAAI,YAAY,WAAW,IAAI,KAAK,GAC3C;AAAA,MACA,YAAY,MAAM,IAAI,QAAG;AAAA,IAC3B,CAAC,EAAE,MAAM;AAET,UAAM,YAAY,MAAM,QAAQ,KAAK,GAAG;AACxC,eAAW,CAAC,YAAY,UAAU,KAAK,OAAO;AAAA,MAC5C,UAAU,SAAU;AAAA,IACtB,GAAG;AACD,UAAI,CAAC,WAAW,WAAY;AAE5B,YAAM,WAAW,WAAW;AAC5B,YAAM,UAAU,cAAc,QAAQ;AACtC,UAAI,CAAC,QAAS;AAEd,YAAM,EAAE,SAAS,OAAO,IAAI,MAAM,OAChC,UAAUA,MAAK,QAAQ,UAAU,CAAC;AAEpC,UAAI,QAAQ,QAAQ;AAClB,sBAAc,QAAQ,MAAM,IAAI,OAAO,QAAQ;AAAA,MACjD,OAAO;AACL,oBAAY,QAAQ,MAAM,IAAI,OAAO,QAAQ;AAAA,MAC/C;AAAA,IACF;AACA,eAAW;AAAA,MACT,iBAAiB,MAAM;AAAA,QACrB,IAAI,KAAK,IAAI,YAAY,MAAM,IAC7B,KAAK,IAAI,YAAY,WAAW,IAAI,SAAS,OAC/C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,QAAI;AAAA,MACF,MAAM;AAAA,MACN,YAAY,MAAM,IAAI,QAAG;AAAA,IAC3B,CAAC,EAAE,KAAK;AAAA,EACV;AAGA,QAAM,gBAAgB,IAAI;AAAA,IACxB,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,OAAK,QAAQ,MAAM,cAAc;AAAA,IAC/B,GAAG,kBAAkB,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,IACzC,GAAG,mBAAmB,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,EAC5C;AAEA,QAAM,YAAqC;AAAA,IACzC,GAAG,mBAAmB,IAA2B,CAAC,OAAO;AAAA,MACvD,aAAa,CAAC,EAAE,OAAO;AAAA,MACvB,UAAUA,MAAK,KAAK,EAAE,MAAM,aAAa;AAAA,MACzC,cAAcD,IAAG,aAAa,EAAE,MAAM,MAAM;AAAA,MAC5C,eAAe;AAAA,MACf,QAAQ;AAAA,QACN,GAAI,YAAY,EAAE,IAAI,IAAI,EAAE,SAAS,YAAY,EAAE,IAAI,EAAG,IAAI,CAAC;AAAA,QAC/D,SAAS,KAAK,QAAQ,MAAM,cAAc;AAAA,MAC5C;AAAA,IACF,EAAE;AAAA,IACF,GAAG,kBAAkB,IAA2B,CAAC,OAAO;AAAA,MACtD,aAAa,CAAC,EAAE,OAAO;AAAA,MACvB,UAAUC,MAAK,KAAK,EAAE,MAAM,iBAAiB;AAAA,MAC7C,cAAcD,IAAG,aAAa,EAAE,MAAM,MAAM;AAAA,MAC5C,eAAe;AAAA,MACf,QAAQ;AAAA,QACN,GAAI,cAAc,EAAE,IAAI,IAAI,EAAE,SAAS,cAAc,EAAE,IAAI,EAAG,IAAI,CAAC;AAAA,QACnE,SAAS,KAAK,QAAQ,MAAM,cAAc;AAAA,MAC5C;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,OAAK,QAAQ,MAAM,UAAU;AAAA,IAC3B,GAAI,KAAK,QAAQ,MAAM,WAAW,CAAC;AAAA,IACnC,WAAW,EAAE,OAAO,UAAU,CAAC;AAAA,EACjC;AAEA,QAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,gBAAc;AAAA,IACZ,wBAAwB,MAAM;AAAA,MAC5B,IAAI,KAAK,QAAQ,MAAM,YAAY,MAAM,cACvC,KAAK,QAAQ,MAAM,YAAY,WAAW,IAAI,KAAK,GACrD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,KAAK,QAAQ,kBAAkB;AACjC,UAAM,cAAc,IAAI;AAAA,MACtB,MAAM;AAAA,MACN,YAAY,MAAM,IAAI,QAAG;AAAA,IAC3B,CAAC,EAAE,MAAM;AAET,eAAW,QAAQ,WAAW;AAC5B,YAAM,UAAUC,MAAK,KAAK,KAAK,QAAQ,MAAM,QAAS,KAAK,QAAQ;AACnE,YAAM,WAAWA,MAAK,KAAK,KAAK,QAAQ,QAAQ,KAAK,QAAQ;AAC7D,MAAAD,IAAG,UAAUC,MAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,MAAAD,IAAG,aAAa,SAAS,QAAQ;AACjC,MAAAA,IAAG,OAAO,OAAO;AAAA,IACnB;AACA,gBAAY;AAAA,MACV,oBAAoB,MAAM;AAAA,QACxB,IAAI,UAAU,MAAM,IAAI,UAAU,WAAW,IAAI,SAAS,OAAO;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,kBAAkB,KAAa;AACtC,MAAIA,IAAG,WAAW,GAAG,GAAG;AACtB,IAAAA,IAAG,OAAO,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACF;AAEA,SAAS,iBAAiB,KAAa,UAAsC;AAC3E,aAAW,OAAO,iBAAiB;AACjC,UAAM,WAAW,OAAOC,MAAK,KAAK,KAAK,GAAG,QAAQ,IAAI,GAAG,EAAE;AAC3D,QAAID,IAAG,WAAW,QAAQ,EAAG,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,iBACP,SACA,MACoB;AACpB,QAAM,aAAa,MAAM,OAAO;AAChC,WAAS,qBACP,SACA,WAAW,OACG;AACd,sBAAkB,QAAQ,MAAO;AACjC,QAAI,YAAY;AACd,cAAQ,SAAS;AACjB,UAAI,CAAC,UAAU;AACb,gBAAQ,YAAY;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,wBACP,aACA,YACc;AACd,UAAM,SAAuB,EAAE,GAAG,aAAa,GAAG,WAAW;AAC7D,QAAI,YAAY,OAAO;AACrB,aAAO,QAAQ,EAAE,GAAG,WAAW,OAAO,GAAG,YAAY,MAAM;AAAA,IAC7D;AACA,QAAI,YAAY,QAAQ;AACtB,aAAO,SAAS,CAAC,GAAG,WAAW,QAAQ,GAAI,YAAY,UAAU,CAAC,CAAE;AAAA,IACtE;AACA,QAAI,YAAY,UAAU;AACxB,aAAO,WAAW;AAAA,QAChB,GAAG,WAAW;AAAA,QACd,GAAI,YAAY,YAAY,CAAC;AAAA,MAC/B;AAAA,IACF;AACA,QAAI,YAAY,SAAS;AACvB,aAAO,UAAU,CAAC,GAAG,WAAW,SAAS,GAAI,YAAY,WAAW,CAAC,CAAE;AAAA,IACzE;AACA,WAAO,eAAe;AAAA,MACpB,GAAI,OAAO,gBAAgB,CAAC;AAAA,MAC5B,OAAO,OAAO,WAAW,QAAQ,SAAS;AAAA,IAC5C;AACA,WAAO,qBAAqB,QAAQ,IAAI;AAAA,EAC1C;AAEA,WAAS,oBACPE,iBACAC,UACqB;AACrB,IAAAD,gBAAe,MAAM,SAASD,MAAK;AAAA,MACjCC,gBAAe;AAAA,MACfA,gBAAe;AAAA,IACjB;AACA,IAAAA,gBAAe,MAAM,aAAa,IAAI;AAAA,MACpCA,gBAAe;AAAA,MACfC;AAAA,IACF,EAAE;AACF,yBAAqBD,gBAAe,OAAO,KAAK;AAChD,WAAOA;AAAA,EACT;AAGA,QAAM,iBAAiB;AAAA,IACrB;AAAA,MACE,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG,MAAM,SAAS;AAAA;AAAA,QAElB,QAAQ;AAAA,UACN,GAAG,wBAAwB;AAAA,UAC3B,GAAG,MAAM,SAAS,OAAO;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,QAAQD,MAAK,KAAK,MAAM,SAAS,UAAU,gBAAgB,SAAS;AAAA,MACpE,KAAK,MAAM,SAAS,OAAO;AAAA,MAC3B,WAAW,MAAM,SAAS,aAAa;AAAA,MACvC,kBAAkB,MAAM,SAAS,oBAAoB;AAAA,IACvD;AAAA,IACA;AAAA,EACF;AAGA,QAAM,aAAa;AAAA,IACjB;AAAA,MACE,GAAG;AAAA,MACH,GAAG,MAAM;AAAA,MACT,YAAY,eAAe,MAAM;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AAGA,QAAM,gBAAgB;AAAA,IACpB,MAAM,QAAQ,cAAc,WAAW,QACnC,0CACA;AAAA,IACJ,MAAM,QAAQ;AAAA,EAChB;AACA,QAAM,cAAc;AAAA,IAClB,MAAM,QAAQ,UAAU,WAAW,QAC/B,sCACA;AAAA,IACJ,MAAM,QAAQ;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,KAAK,MAAM,OAAO;AAAA,IAClB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,QAAQ;AAAA,MACN,cAAc;AAAA,MACd,UAAU;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,IACL;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { create, fromJson, fromJsonString, toJson } from \"@bufbuild/protobuf\";\nimport { ValueSchema } from \"@bufbuild/protobuf/wkt\";\nimport { createValidator } from \"@bufbuild/protovalidate\";\nimport {\n HtmlFileConfiguration,\n htmlPlugin,\n} from \"@craftamap/esbuild-plugin-html\";\nimport Ajv from \"ajv/dist/jtd.js\";\nimport chalk from \"chalk\";\nimport { BuildOptions, context, build as esbuild } from \"esbuild\";\nimport { sync as glob } from \"glob\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport ora from \"ora\";\nimport {\n CDN_URL_DEFAULT,\n CONFIGURATOR_HTML,\n DEFAULT_ASSETS,\n DEFAULT_BROWSER_OPTIONS,\n DEFAULT_CDN,\n DEFAULT_SERVER_CONFIGURATOR_CJS_OPTIONS,\n DEFAULT_SERVER_CONFIGURATOR_ESM_OPTIONS,\n DEFAULT_SERVER_EXECUTOR_CJS_OPTIONS,\n DEFAULT_SERVER_EXECUTOR_ESM_OPTIONS,\n DEFAULT_SRC,\n DEFAULT_SSG_OPTIONS,\n EXECUTOR_HTML,\n FILE_EXTENSIONS,\n MANIFEST_PATH,\n} from \"./defaults\";\nimport { findBrowserEntrypoints, findConfigEntrypoints } from \"./entrypoints\";\nimport { JTDSchemaSchema } from \"./genproto/mochabugapis/adapt/graph/jtd_schema_pb\";\nimport { FileSchema } from \"./genproto/mochabugapis/adapt/plugins/v1/file_pb\";\nimport {\n Manifest,\n ManifestSchema,\n} from \"./genproto/mochabugapis/adapt/plugins/v1/manifest_pb\";\nimport { ServiceDefinition } from \"./genproto/mochabugapis/adapt/plugins/v1/service_definition_pb\";\nimport {\n Capability,\n Vertex,\n VertexSchema,\n} from \"./genproto/mochabugapis/adapt/plugins/v1/vertex_pb\";\nimport { virtualModulesPlugin, wasmExternalPlugin } from \"./plugins\";\n\ntype DeepPartialExcept<T, Excluded> = T extends Excluded\n ? T\n : T extends Function\n ? T\n : T extends Array<infer U>\n ? Array<DeepPartialExcept<U, Excluded>>\n : T extends object\n ? { [K in keyof T]?: DeepPartialExcept<T[K], Excluded> }\n : T;\n\nexport interface ServerBuildOptions {\n configurator: BuildOptions; // The esbuild options for the configurator build\n executor: BuildOptions; // The esbuild options for the executor build\n}\n\nexport interface BrowserBuildOptions {\n build: BuildOptions; // The esbuild options for the browser build\n assets: string; // The path where to place the assets\n cdn: string; // The path to the CDN folder\n cdnPrefix: string; // The prefix on the plugins CDN folder (both locally and on the CDN)\n moveHtmlToAssets: boolean; // Set this to true if you would like to place generated index.html files into the assets folder\n}\n\nexport interface PluginBuildOptions {\n src: string; // The path to the source folder\n browser: BrowserBuildOptions; // The browser build options\n ssg: BuildOptions; // The esbuild options for the static site generation build\n server: ServerBuildOptions; // The server build options\n dev: boolean; // Set this to true if you would like to build the debug version of the plugin\n cdnBase: string; // The URL to the CDN where the plugin will be hosted\n}\n\ntype OptionalPluginBuildOptions = DeepPartialExcept<\n PluginBuildOptions,\n BuildOptions\n>;\n\nconst ajv = new Ajv();\nconst validator = createValidator();\n\nexport async function build(opts?: OptionalPluginBuildOptions) {\n console.log(chalk.bold.cyan(\"\\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\"));\n console.log(chalk.bold.cyan(\"\u2502 \uD83D\uDE80 Adapt Plugin Build Process \u2502\"));\n console.log(chalk.bold.cyan(\"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\\n\"));\n\n // Read and parse manifest\n const manifestSpinner = ora({\n text: \"Reading manifest...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const manifest = fromJsonString(\n ManifestSchema,\n fs.readFileSync(MANIFEST_PATH, \"utf8\")\n );\n\n manifestSpinner.succeed(\n `Manifest: ${chalk.bold(\n `${manifest.organization}/${manifest.name}`\n )} ${chalk.dim(`v${manifest.version}`)}`\n );\n\n const cdnBase = `${opts?.cdnBase || CDN_URL_DEFAULT}/${\n manifest.organization\n }/${manifest.name}/${manifest.version}/`;\n console.log(chalk.dim(`\u2502 `) + chalk.gray(`CDN: ${cdnBase}\\n`));\n\n const initOpts = initBuildOptions(cdnBase, opts);\n\n // Discover vertices\n const vertexSpinner = ora({\n text: \"Discovering vertices...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const pathLookup: Record<string, string> = {};\n manifest.vertices = glob(path.join(initOpts.src, \"**/vertex.json\")).map(\n (file) => {\n const res = fromJsonString(VertexSchema, fs.readFileSync(file, \"utf8\"));\n pathLookup[res.name] = path.dirname(file);\n return res;\n }\n );\n\n if (manifest.vertices.length === 0) {\n vertexSpinner.fail(\"No vertices found\");\n throw new Error(\"No vertices are defined\");\n }\n\n for (const srv of manifest.serviceDefinitions) {\n await validateLoadServiceDefinition(\".\", srv);\n }\n\n vertexSpinner.succeed(\n `Found ${chalk.bold(manifest.vertices.length)} ${\n manifest.vertices.length === 1 ? \"vertex\" : \"vertices\"\n }: ${manifest.vertices.map((v) => chalk.cyan(v.name)).join(\", \")}`\n );\n console.log(\"\");\n\n const result = validator.validate(ManifestSchema, manifest);\n if (result.kind !== \"valid\") {\n console.error(chalk.bold.red(\"\u274C Manifest validation failed:\\n\"));\n console.error(result.error);\n console.error(result.violations);\n process.exit(1);\n }\n\n await buildBrowser(manifest, pathLookup, initOpts);\n await buildServer(manifest, pathLookup, initOpts);\n\n console.log(chalk.bold.green(\"\\n\u2728 Build completed successfully!\\n\"));\n}\n\nexport interface DevOptions {\n port?: number;\n src?: string;\n browser?: {\n build?: {\n define?: Record<string, string>;\n };\n };\n}\n\nexport async function dev(opts?: DevOptions) {\n const port = opts?.port || 3000;\n const src = opts?.src || DEFAULT_SRC;\n\n console.log(chalk.bold.cyan(\"\\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\"));\n console.log(chalk.bold.cyan(\"\u2502 \uD83D\uDD25 Adapt Plugin Dev Server \u2502\"));\n console.log(chalk.bold.cyan(\"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\\n\"));\n\n // Read manifest\n const manifest = fromJsonString(\n ManifestSchema,\n fs.readFileSync(MANIFEST_PATH, \"utf8\")\n );\n console.log(\n chalk.dim(\"\u2502 \") +\n `Plugin: ${chalk.bold(\n `${manifest.organization}/${manifest.name}`\n )} ${chalk.dim(`v${manifest.version}`)}`\n );\n\n // Discover vertices\n const pathLookup: Record<string, string> = {};\n manifest.vertices = glob(path.join(src, \"**/vertex.json\")).map((file) => {\n const res = fromJsonString(VertexSchema, fs.readFileSync(file, \"utf8\"));\n pathLookup[res.name] = path.dirname(file);\n return res;\n });\n\n if (manifest.vertices.length === 0) {\n console.log(chalk.yellow(\"\\n\u26A0 No vertices found. Nothing to serve.\\n\"));\n return;\n }\n\n // Find UI components\n const hasUI = (v: Vertex) =>\n fs.existsSync(path.join(pathLookup[v.name]!, \"ui\"));\n const configVertices = manifest.vertices.filter(\n (v) =>\n Boolean(v.capabilities.find((c) => c === Capability.CONFIGURATOR)) &&\n hasUI(v)\n );\n const browserVertices = manifest.vertices.filter(\n (v) =>\n Boolean(v.capabilities.find((c) => c === Capability.BROWSER)) && hasUI(v)\n );\n\n const totalUI = configVertices.length + browserVertices.length;\n if (totalUI === 0) {\n console.log(\n chalk.yellow(\"\\n\u26A0 No UI components found. Nothing to serve.\\n\")\n );\n return;\n }\n\n console.log(\n chalk.dim(\"\u2502 \") +\n `Found ${chalk.bold(totalUI)} UI component${totalUI === 1 ? \"\" : \"s\"}\\n`\n );\n\n const configs = Object.fromEntries(\n configVertices.map((v) => [v.name, pathLookup[v.name]!])\n );\n const browsers = Object.fromEntries(\n browserVertices.map((v) => [v.name, pathLookup[v.name]!])\n );\n\n const configEntrypoints = findConfigEntrypoints(configs);\n const browserEntrypoints = findBrowserEntrypoints(browsers);\n\n // Run SSG once for initial content\n const entrypointMap: Record<string, { vertex: string; config: boolean }> = {};\n const ssgEntryPoints = [...configEntrypoints, ...browserEntrypoints]\n .filter((ep) => ep.ssg !== undefined)\n .map((ep) => {\n entrypointMap[ep.ssg!] = {\n vertex: ep.name,\n config: configEntrypoints.includes(ep),\n };\n return ep.ssg!;\n });\n\n const execDefines: Record<string, string> = {};\n const configDefines: Record<string, string> = {};\n\n if (ssgEntryPoints.length > 0) {\n const ssgSpinner = ora({\n text: \"Running SSG...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const ssgOutdir = path.join(\"dist\", \"ssg-dev\");\n removeDirIfExists(ssgOutdir);\n\n try {\n const ssgResult = await esbuild({\n ...DEFAULT_SSG_OPTIONS,\n outdir: ssgOutdir,\n entryPoints: ssgEntryPoints,\n });\n\n for (const [outputPath, outputMeta] of Object.entries(\n ssgResult.metafile!.outputs\n )) {\n if (!outputMeta.entryPoint) continue;\n const mapInfo = entrypointMap[outputMeta.entryPoint];\n if (!mapInfo) continue;\n\n const { default: render } = await import(\n `file://${path.resolve(outputPath)}`\n );\n if (mapInfo.config) {\n configDefines[mapInfo.vertex] = render.default();\n } else {\n execDefines[mapInfo.vertex] = render.default();\n }\n }\n ssgSpinner.succeed(\"SSG completed\");\n } catch (err) {\n ssgSpinner.warn(\"SSG failed, continuing without static content\");\n }\n }\n\n // Prepare browser build\n const outdir = path.join(DEFAULT_CDN, \"browser\");\n removeDirIfExists(outdir);\n\n const publicPath = `http://localhost:${port}/`;\n\n const htmlFiles: HtmlFileConfiguration[] = [\n ...browserEntrypoints.map<HtmlFileConfiguration>((b) => ({\n entryPoints: [b.browser],\n filename: path.join(b.name, EXECUTOR_HTML),\n htmlTemplate: fs.readFileSync(b.html, \"utf8\"),\n scriptLoading: \"module\",\n define: {\n ...(execDefines[b.name] ? { content: execDefines[b.name]! } : {}),\n baseCdn: publicPath,\n },\n })),\n ...configEntrypoints.map<HtmlFileConfiguration>((c) => ({\n entryPoints: [c.browser],\n filename: path.join(c.name, CONFIGURATOR_HTML),\n htmlTemplate: fs.readFileSync(c.html, \"utf8\"),\n scriptLoading: \"module\",\n define: {\n ...(configDefines[c.name] ? { content: configDefines[c.name]! } : {}),\n baseCdn: publicPath,\n },\n })),\n ];\n\n const buildSpinner = ora({\n text: \"Starting dev server...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const ctx = await context({\n ...DEFAULT_BROWSER_OPTIONS,\n outdir,\n publicPath,\n minify: false,\n sourcemap: true,\n entryPoints: [\n ...configEntrypoints.map((c) => c.browser),\n ...browserEntrypoints.map((b) => b.browser),\n ],\n define: {\n ...DEFAULT_BROWSER_OPTIONS.define,\n ...opts?.browser?.build?.define,\n },\n banner: {\n js: `new EventSource('/esbuild').addEventListener('change', () => location.reload());`,\n },\n plugins: [htmlPlugin({ files: htmlFiles })],\n });\n\n await ctx.watch();\n const { port: servePort } = await ctx.serve({\n servedir: outdir,\n port,\n });\n\n buildSpinner.succeed(\"Dev server started\");\n\n console.log(chalk.bold.green(\"\\n\u2728 Dev server running!\\n\"));\n console.log(\n chalk.dim(\"\u2502 \") + `Server: ${chalk.cyan(`http://localhost:${servePort}/`)}`\n );\n console.log(chalk.dim(\"\u2502\"));\n console.log(chalk.dim(\"\u2502 \") + chalk.bold(\"Available pages:\"));\n for (const b of browserEntrypoints) {\n console.log(\n chalk.dim(\"\u2502 \") +\n `${chalk.cyan(b.name)}: http://localhost:${servePort}/${\n b.name\n }/${EXECUTOR_HTML}`\n );\n }\n for (const c of configEntrypoints) {\n console.log(\n chalk.dim(\"\u2502 \") +\n `${chalk.magenta(c.name)} (config): http://localhost:${servePort}/${\n c.name\n }/${CONFIGURATOR_HTML}`\n );\n }\n console.log(chalk.dim(\"\u2502\"));\n console.log(chalk.dim(\"\u2502 \") + chalk.gray(\"Press Ctrl+C to stop\\n\"));\n}\n\n// Service definitions can have files, these needs to be loaded and validated\nexport async function validateLoadServiceDefinition(\n basePath: string,\n srv: ServiceDefinition\n) {\n switch (srv.type.case) {\n case \"variable\": {\n // Validate the JTD schema as well as the default value\n try {\n const schema = toJson(JTDSchemaSchema, srv.type.value.schema!);\n await ajv.validateSchema(schema, true);\n if (srv.type.value.default) {\n let defaultValue = toJson(ValueSchema, srv.type.value.default);\n\n // Check if the default value is a string that looks like a JSON file path\n // Parse and load it to the definition here!\n if (\n typeof defaultValue === \"string\" &&\n defaultValue.endsWith(\".json\")\n ) {\n const filePath = path.join(basePath, defaultValue);\n if (fs.existsSync(filePath)) {\n const fileContent = fs.readFileSync(filePath, \"utf-8\");\n defaultValue = JSON.parse(fileContent);\n srv.type.value.default = fromJson(ValueSchema, defaultValue);\n } else {\n throw new Error(`Default value file not found at ${filePath}`);\n }\n }\n\n if (!ajv.validate(schema, defaultValue)) {\n throw new Error(\n `Default value is incorrect: ${ajv.errorsText(ajv.errors)}`\n );\n }\n }\n } catch (error: any) {\n throw new Error(\n `Validation failed for service definition '${srv.name}': ${error.message}`\n );\n }\n break;\n }\n case \"httpProxy\": {\n try {\n if (srv.type.value.tls?.caBundle) {\n const caBundlePath = path.join(\n basePath,\n srv.type.value.tls.caBundle.name\n );\n if (fs.existsSync(caBundlePath)) {\n srv.type.value.tls.caBundle = create(FileSchema, {\n name: srv.type.value.tls.caBundle.name,\n data: fs.readFileSync(caBundlePath),\n });\n } else {\n throw new Error(`CA Bundle file not found at ${caBundlePath}`);\n }\n }\n } catch (error: any) {\n throw new Error(\n `Validation failed for service definition '${srv.name}': ${error.message}`\n );\n }\n break;\n }\n }\n}\n\nexport async function buildServer(\n manifest: Manifest,\n vpathLookup: Record<string, string>,\n opts: PluginBuildOptions\n) {\n console.log(chalk.bold.magenta(\"\uD83D\uDD27 Server Build\"));\n console.log(chalk.dim(\"\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\"));\n\n // Build Executor Files\n const execSpinner = ora({\n text: \"Preparing executor files...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const execRecords = Object.entries(vpathLookup).map(([key, importPath]) => {\n const res = createImportPath(importPath, \"executor\");\n if (!res)\n throw new Error(\"No executor file found. This is required for a vertex\");\n return [key, res];\n });\n\n if (execRecords.length === 0) {\n execSpinner.fail(\"No executor files found\");\n throw new Error(\"No executor files found. This is required for a vertex\");\n }\n\n opts.server.executor.plugins = [\n ...(opts.server.executor.plugins || []),\n virtualModulesPlugin(\n \"mb-adapt-plugin-virtual:executors\",\n Object.fromEntries(execRecords)\n ),\n wasmExternalPlugin({ outdir: opts.server.executor.outdir! }),\n ];\n opts.server.executor.entryPoints = [\n {\n in: \"mb-adapt-plugin-virtual:executors\",\n out: \"executors\",\n },\n ];\n\n execSpinner.text = `Building ${execRecords.length} executor${\n execRecords.length === 1 ? \"\" : \"s\"\n }...`;\n await esbuild(opts.server.executor);\n execSpinner.succeed(\n `Executors built ${chalk.dim(\n `(${execRecords.length} ${execRecords.length === 1 ? \"file\" : \"files\"})`\n )}`\n );\n\n // Build Configurator Files\n const configSpinner = ora({\n text: \"Preparing configurator files...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const configRecords = manifest.vertices\n .filter((v) =>\n Boolean(v.capabilities.find((c) => c === Capability.CONFIGURATOR))\n )\n .map((v) => {\n const currentPath = vpathLookup[v.name];\n if (!currentPath) {\n throw new Error(`No path found for vertex ${v.name}`);\n }\n const res = createImportPath(currentPath, \"configurator\");\n if (!res)\n throw new Error(\n \"No configurator file found. This is required for a vertex\"\n );\n return [v.name, res];\n });\n\n opts.server.configurator.plugins = [\n ...(opts.server.configurator.plugins || []),\n virtualModulesPlugin(\n \"mb-adapt-plugin-virtual:configurators\",\n Object.fromEntries(configRecords)\n ),\n wasmExternalPlugin({ outdir: opts.server.configurator.outdir! }),\n ];\n\n if (configRecords.length > 0) {\n opts.server.configurator.entryPoints = [\n {\n in: \"mb-adapt-plugin-virtual:configurators\",\n out: \"configurators\",\n },\n ];\n configSpinner.text = `Building ${configRecords.length} configurator${\n configRecords.length === 1 ? \"\" : \"s\"\n }...`;\n await esbuild(opts.server.configurator);\n configSpinner.succeed(\n `Configurators built ${chalk.dim(\n `(${configRecords.length} ${\n configRecords.length === 1 ? \"file\" : \"files\"\n })`\n )}`\n );\n } else {\n configSpinner.info(\"No configurator files to build\");\n }\n\n console.log(\"\");\n}\n\nasync function buildBrowser(\n manifest: Manifest,\n vpathLookup: Record<string, string>,\n opts: PluginBuildOptions\n) {\n console.log(chalk.bold.blue(\"\uD83C\uDF10 Browser Build\"));\n console.log(chalk.dim(\"\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n\"));\n\n const discoverySpinner = ora({\n text: \"Discovering UI components...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const hasUI = (v: Vertex) =>\n fs.existsSync(path.join(vpathLookup[v.name]!, \"ui\"));\n const configVertices = manifest.vertices.filter(\n (v) =>\n Boolean(v.capabilities.find((c) => c === Capability.CONFIGURATOR)) &&\n hasUI(v)\n );\n const browserVertices = manifest.vertices.filter(\n (v) =>\n Boolean(v.capabilities.find((c) => c === Capability.BROWSER)) && hasUI(v)\n );\n\n const totalUI = configVertices.length + browserVertices.length;\n discoverySpinner.succeed(\n `Found ${chalk.bold(totalUI)} UI component${\n totalUI === 1 ? \"\" : \"s\"\n } ${chalk.dim(\n `(${browserVertices.length} browser, ${configVertices.length} configurator)`\n )}`\n );\n\n const configs = Object.fromEntries(\n configVertices.map((v) => [v.name, vpathLookup[v.name]!])\n );\n const browsers = Object.fromEntries(\n browserVertices.map((v) => [v.name, vpathLookup[v.name]!])\n );\n\n const configEntrypoints = findConfigEntrypoints(configs);\n const browserEntrypoints = findBrowserEntrypoints(browsers);\n\n const entrypointMap: Record<string, { vertex: string; config: boolean }> = {};\n opts.ssg.entryPoints = [...configEntrypoints, ...browserEntrypoints]\n .filter((ep) => ep.ssg !== undefined)\n .map((ep) => {\n entrypointMap[ep.ssg!] = {\n vertex: ep.name,\n config: configEntrypoints.includes(ep),\n };\n return ep.ssg!;\n });\n\n // SSG Build\n const execDefines: Record<string, string> = {};\n const configDefines: Record<string, string> = {};\n\n if (opts.ssg.entryPoints.length > 0) {\n const ssgSpinner = ora({\n text: `Running SSG for ${opts.ssg.entryPoints.length} component${\n opts.ssg.entryPoints.length === 1 ? \"\" : \"s\"\n }...`,\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n const ssgResult = await esbuild(opts.ssg);\n for (const [outputPath, outputMeta] of Object.entries(\n ssgResult.metafile!.outputs\n )) {\n if (!outputMeta.entryPoint) continue;\n\n const entryKey = outputMeta.entryPoint;\n const mapInfo = entrypointMap[entryKey];\n if (!mapInfo) continue;\n\n const { default: render } = await import(\n `file://${path.resolve(outputPath)}`\n );\n if (mapInfo.config) {\n configDefines[mapInfo.vertex] = render.default();\n } else {\n execDefines[mapInfo.vertex] = render.default();\n }\n }\n ssgSpinner.succeed(\n `SSG completed ${chalk.dim(\n `(${opts.ssg.entryPoints.length} ${\n opts.ssg.entryPoints.length === 1 ? \"file\" : \"files\"\n })`\n )}`\n );\n } else {\n ora({\n text: \"No SSG entry points\",\n prefixText: chalk.dim(\"\u2502\"),\n }).info();\n }\n\n // Build Browser JavaScript & HTML\n const bundleSpinner = ora({\n text: \"Building browser bundle...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n opts.browser.build.entryPoints = [\n ...configEntrypoints.map((c) => c.browser),\n ...browserEntrypoints.map((b) => b.browser),\n ];\n\n const htmlFiles: HtmlFileConfiguration[] = [\n ...browserEntrypoints.map<HtmlFileConfiguration>((b) => ({\n entryPoints: [b.browser],\n filename: path.join(b.name, EXECUTOR_HTML),\n htmlTemplate: fs.readFileSync(b.html, \"utf8\"),\n scriptLoading: \"module\",\n define: {\n ...(execDefines[b.name] ? { content: execDefines[b.name]! } : {}),\n baseCdn: opts.browser.build.publicPath || \"\",\n },\n })),\n ...configEntrypoints.map<HtmlFileConfiguration>((c) => ({\n entryPoints: [c.browser],\n filename: path.join(c.name, CONFIGURATOR_HTML),\n htmlTemplate: fs.readFileSync(c.html, \"utf8\"),\n scriptLoading: \"module\",\n define: {\n ...(configDefines[c.name] ? { content: configDefines[c.name]! } : {}),\n baseCdn: opts.browser.build.publicPath || \"\",\n },\n })),\n ];\n\n opts.browser.build.plugins = [\n ...(opts.browser.build.plugins || []),\n htmlPlugin({ files: htmlFiles }),\n ];\n\n await esbuild(opts.browser.build);\n bundleSpinner.succeed(\n `Browser bundle built ${chalk.dim(\n `(${opts.browser.build.entryPoints.length} entrypoint${\n opts.browser.build.entryPoints.length === 1 ? \"\" : \"s\"\n })`\n )}`\n );\n\n if (opts.browser.moveHtmlToAssets) {\n const moveSpinner = ora({\n text: \"Moving HTML files to assets...\",\n prefixText: chalk.dim(\"\u2502\"),\n }).start();\n\n for (const file of htmlFiles) {\n const srcFile = path.join(opts.browser.build.outdir!, file.filename);\n const destFile = path.join(opts.browser.assets, file.filename);\n fs.mkdirSync(path.dirname(destFile), { recursive: true });\n fs.copyFileSync(srcFile, destFile);\n fs.rmSync(srcFile);\n }\n moveSpinner.succeed(\n `HTML files moved ${chalk.dim(\n `(${htmlFiles.length} ${htmlFiles.length === 1 ? \"file\" : \"files\"})`\n )}`\n );\n }\n\n console.log(\"\");\n}\n\nfunction removeDirIfExists(dir: string) {\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true });\n }\n}\n\nfunction createImportPath(src: string, baseName: string): string | undefined {\n for (const ext of FILE_EXTENSIONS) {\n const filePath = \"./\" + path.join(src, `${baseName}.${ext}`);\n if (fs.existsSync(filePath)) return filePath;\n }\n return undefined;\n}\n\nfunction initBuildOptions(\n cdnBase: string,\n opts?: OptionalPluginBuildOptions\n): PluginBuildOptions {\n const isDevBuild = opts?.dev || false;\n function finalizeBuildOptions(\n options: BuildOptions,\n isServer = false\n ): BuildOptions {\n removeDirIfExists(options.outdir!);\n if (isDevBuild) {\n options.minify = false;\n if (!isServer) {\n options.sourcemap = true;\n }\n }\n return options;\n }\n\n function mergeServerBuildOptions(\n defaultOpts: BuildOptions,\n customOpts?: BuildOptions\n ): BuildOptions {\n const result: BuildOptions = { ...defaultOpts, ...customOpts };\n if (customOpts?.alias) {\n result.alias = { ...customOpts.alias, ...defaultOpts.alias };\n }\n if (customOpts?.inject) {\n result.inject = [...customOpts.inject, ...(defaultOpts.inject || [])];\n }\n if (customOpts?.external) {\n result.external = [\n ...customOpts.external,\n ...(defaultOpts.external || []),\n ];\n }\n if (customOpts?.plugins) {\n result.plugins = [...customOpts.plugins, ...(defaultOpts.plugins || [])];\n }\n result.outExtension = {\n ...(result.outExtension || {}),\n \".js\": result.format === \"cjs\" ? \".cjs\" : \".js\",\n };\n return finalizeBuildOptions(result, true);\n }\n\n function setupBrowserOptions(\n browserOptions: BrowserBuildOptions,\n cdnBase: string\n ): BrowserBuildOptions {\n browserOptions.build.outdir = path.join(\n browserOptions.cdn,\n browserOptions.cdnPrefix\n );\n browserOptions.build.publicPath = new URL(\n browserOptions.cdnPrefix,\n cdnBase\n ).href;\n finalizeBuildOptions(browserOptions.build, false);\n return browserOptions;\n }\n\n // --- Browser options ---\n const browserOptions = setupBrowserOptions(\n {\n build: {\n ...DEFAULT_BROWSER_OPTIONS,\n ...opts?.browser?.build,\n // Merge define properties if they exist\n define: {\n ...DEFAULT_BROWSER_OPTIONS.define,\n ...opts?.browser?.build?.define,\n },\n },\n assets: path.join(opts?.browser?.assets || DEFAULT_ASSETS, \"browser\"),\n cdn: opts?.browser?.cdn || DEFAULT_CDN,\n cdnPrefix: opts?.browser?.cdnPrefix || \"browser\",\n moveHtmlToAssets: opts?.browser?.moveHtmlToAssets || true,\n },\n cdnBase\n );\n\n // --- SSG options ---\n const ssgOptions = finalizeBuildOptions(\n {\n ...DEFAULT_SSG_OPTIONS,\n ...opts?.ssg,\n publicPath: browserOptions.build.publicPath,\n },\n false\n );\n\n // --- Server options ---\n const configOptions = mergeServerBuildOptions(\n opts?.server?.configurator?.format === \"esm\"\n ? DEFAULT_SERVER_CONFIGURATOR_ESM_OPTIONS\n : DEFAULT_SERVER_CONFIGURATOR_CJS_OPTIONS,\n opts?.server?.configurator\n );\n const execOptions = mergeServerBuildOptions(\n opts?.server?.executor?.format === \"esm\"\n ? DEFAULT_SERVER_EXECUTOR_ESM_OPTIONS\n : DEFAULT_SERVER_EXECUTOR_CJS_OPTIONS,\n opts?.server?.executor\n );\n\n return {\n src: opts?.src || DEFAULT_SRC,\n browser: browserOptions,\n ssg: ssgOptions,\n server: {\n configurator: configOptions,\n executor: execOptions,\n },\n dev: isDevBuild,\n cdnBase: cdnBase,\n };\n}\n\nexport { CDN_URL_DEFAULT };\n", "import { BuildOptions } from \"esbuild\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { defineEnv } from \"unenv\";\nimport { fileURLToPath } from \"url\";\nimport { unenvAliasPlugin } from \"./plugins\";\nimport { getCloudflarePreset } from \"@cloudflare/unenv-preset\";\n\nexport const PACKAGE_JSON = JSON.parse(\n fs.readFileSync(\"package.json\", \"utf-8\")\n);\nexport const EXECUTOR_MAIN = \"executor.main\";\nexport const CONFIGURATOR_MAIN = \"configurator.main\";\nexport const EXECUTOR_SSG = \"executor.ssg\";\nexport const CONFIGURATOR_SSG = \"configurator.ssg\";\nexport const CDN_URL_DEFAULT = \"https://cdn.mochabug.com/adapt/plugins\";\nexport const EXECUTOR_HTML = \"executor.html\";\nexport const CONFIGURATOR_HTML = \"configurator.html\";\nexport const DEFAULT_DIST = \"dist\";\nexport const DEFAULT_CDN = \"cdn\";\nexport const DEFAULT_ASSETS = \"assets\";\nexport const DEFAULT_SRC = \"src\";\nexport const MANIFEST_PATH = \"manifest.json\";\nexport const FILE_EXTENSIONS = [\"tsx\", \"ts\", \"js\", \"cjs\"];\n\n// A base configuration for all builds that share common settings\nconst commonOptions: BuildOptions = {\n bundle: true,\n treeShaking: true,\n sourcemap: false,\n loader: {\n \".css\": \"css\",\n \".woff\": \"file\",\n \".woff2\": \"file\",\n \".png\": \"file\",\n \".jpg\": \"file\",\n \".jpeg\": \"file\",\n \".gif\": \"file\",\n \".svg\": \"file\",\n \".ttf\": \"file\",\n \".otf\": \"file\",\n },\n};\n\n// Browser build options\nexport const DEFAULT_BROWSER_OPTIONS: BuildOptions = {\n ...commonOptions,\n outdir: path.join(DEFAULT_CDN, \"browser\"),\n minify: true,\n splitting: true,\n platform: \"browser\",\n format: \"esm\",\n loader: {\n ...commonOptions.loader,\n \".wasm\": \"file\",\n },\n};\n\n// SSG build options\nexport const DEFAULT_SSG_OPTIONS: BuildOptions = {\n ...commonOptions,\n outdir: path.join(DEFAULT_DIST, \"ssg\"),\n minify: false,\n splitting: false,\n metafile: true,\n platform: \"node\",\n format: \"cjs\",\n target: \"esnext\",\n outExtension: {\n \".js\": \".cjs\",\n },\n loader: {\n ...commonOptions.loader,\n \".wasm\": \"file\",\n },\n};\n\nconst { env: serverEnv } = defineEnv({\n nodeCompat: true,\n presets: [\n getCloudflarePreset({\n compatibilityDate: \"2025-08-29\",\n compatibilityFlags: [\"nodejs_compat\"],\n }),\n ],\n});\n\n// Common configuration for server builds (without outdir, set per-build type)\nconst commonServerOptions: BuildOptions = {\n ...commonOptions,\n minify: true,\n splitting: false,\n platform: \"node\",\n target: \"esnext\",\n external: [...serverEnv.external],\n plugins: [unenvAliasPlugin(serverEnv.alias)],\n alias: serverEnv.alias,\n};\n\n// Server ESM build options for executors\nexport const DEFAULT_SERVER_EXECUTOR_ESM_OPTIONS: BuildOptions = {\n ...commonServerOptions,\n outdir: path.join(DEFAULT_DIST, \"executors\"),\n format: \"esm\",\n inject: [\n path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n \"assets\",\n \"inject.mjs\"\n ),\n ],\n mainFields: [\"module\", \"main\"],\n};\n\n// Server CJS build options for executors\nexport const DEFAULT_SERVER_EXECUTOR_CJS_OPTIONS: BuildOptions = {\n ...commonServerOptions,\n outdir: path.join(DEFAULT_DIST, \"executors\"),\n format: \"cjs\",\n inject: [\n path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n \"assets\",\n \"inject.cjs\"\n ),\n ],\n mainFields: [\"main\", \"module\"],\n outExtension: {\n \".js\": \".cjs\",\n },\n};\n\n// Server ESM build options for configurators\nexport const DEFAULT_SERVER_CONFIGURATOR_ESM_OPTIONS: BuildOptions = {\n ...commonServerOptions,\n outdir: path.join(DEFAULT_DIST, \"configurators\"),\n format: \"esm\",\n inject: [\n path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n \"assets\",\n \"inject.mjs\"\n ),\n ],\n mainFields: [\"module\", \"main\"],\n};\n\n// Server CJS build options for configurators\nexport const DEFAULT_SERVER_CONFIGURATOR_CJS_OPTIONS: BuildOptions = {\n ...commonServerOptions,\n outdir: path.join(DEFAULT_DIST, \"configurators\"),\n format: \"cjs\",\n inject: [\n path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n \"assets\",\n \"inject.cjs\"\n ),\n ],\n mainFields: [\"main\", \"module\"],\n outExtension: {\n \".js\": \".cjs\",\n },\n};\n", "import { Plugin } from \"esbuild\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { generateEntrypoint } from \"./codegen\";\n\n/**\n * A plugin that generates a virtual module containing the vertex map.\n */\nexport function virtualModulesPlugin(\n moduleName: string,\n vertexMap: Record<string, string>\n): Plugin {\n const regexp = new RegExp(`^${moduleName}`);\n return {\n name: \"mb-adapt-plugin-virtual-modules\",\n setup(build) {\n build.onResolve({ filter: regexp }, (args) => {\n return { path: args.path, namespace: \"virtual\" };\n });\n\n // Load the module code dynamically.\n build.onLoad({ filter: regexp, namespace: \"virtual\" }, () => {\n const contents = generateEntrypoint(vertexMap);\n return { contents, loader: \"ts\", resolveDir: process.cwd() };\n });\n },\n };\n}\n\nconst require = createRequire(import.meta.url);\nconst pkgRoot = path.dirname(require.resolve(\"./../package.json\"));\nexport function unenvAliasPlugin(alias: Record<string, string>): Plugin {\n const aliasEntries = Object.entries(alias).filter(\n ([, value]) =>\n value.startsWith(\"unenv\") || value.startsWith(\"@cloudflare/unenv-preset\")\n );\n\n return {\n name: \"unenv-alias\",\n setup(build) {\n for (const [aliasKey, aliasValue] of aliasEntries) {\n build.onResolve({ filter: new RegExp(`^${aliasKey}$`) }, () => {\n const resolved = require.resolve(aliasValue, { paths: [pkgRoot] });\n return { path: resolved };\n });\n }\n },\n };\n}\n\ninterface WasmPluginOptions {\n outdir: string;\n}\n\nexport function wasmExternalPlugin(options: WasmPluginOptions): Plugin {\n return {\n name: \"wasm-external\",\n setup(build) {\n const wasmFiles = new Map<string, string>();\n const require = createRequire(import.meta.url);\n\n build.onResolve({ filter: /\\.wasm$|\\/wasm$/ }, (args) => {\n try {\n let resolvedPath: string;\n\n if (args.path.startsWith(\".\")) {\n resolvedPath = path.resolve(args.resolveDir, args.path);\n } else {\n resolvedPath = require.resolve(args.path, {\n paths: [args.resolveDir],\n });\n }\n\n // Check if resolved path actually ends with .wasm\n if (!resolvedPath.endsWith(\".wasm\")) {\n return null;\n }\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`WASM file not found: ${resolvedPath}`);\n }\n\n const wasmFileName = path.basename(resolvedPath);\n wasmFiles.set(wasmFileName, resolvedPath);\n\n console.log(`Found WASM: ${args.path} -> ${wasmFileName}`);\n\n return {\n path: `./${wasmFileName}`,\n external: true,\n };\n } catch (error) {\n console.error(`Failed to resolve WASM: ${args.path}`, error);\n throw error;\n }\n });\n\n build.onEnd(() => {\n wasmFiles.forEach((sourcePath, fileName) => {\n const destPath = path.join(options.outdir, fileName);\n const fileData = fs.readFileSync(sourcePath);\n\n // Validate WASM magic bytes\n if (fileData.length < 4) {\n throw new Error(\n `${fileName} is too small to be a valid WASM file (${fileData.length} bytes)`\n );\n }\n\n const wasmMagic = Buffer.from([0x00, 0x61, 0x73, 0x6d]);\n if (!fileData.subarray(0, 4).equals(wasmMagic)) {\n const actualMagic = fileData.subarray(0, 4).toString(\"hex\");\n throw new Error(\n `${fileName} is not a valid WASM file (magic: 0x${actualMagic})`\n );\n }\n\n fs.writeFileSync(destPath, fileData);\n console.log(\n `Copied WASM: ${fileName} (${(fileData.length / 1024).toFixed(\n 2\n )} KB)`\n );\n });\n });\n },\n };\n}\n", "/**\n * Generates a virtual entrypoint module as a string.\n *\n * @param vertices A mapping where each key is the desired property name for the vertex in the selectVertex call,\n * and the value is the module path to import the executor.\n * Example: { \"sign\": \"./sign/executor\", \"auth\": \"./auth/executor\" }\n * @returns The generated module code.\n */\nexport function generateEntrypoint(vertices: Record<string, string>): string {\n const entries = Object.entries(vertices).map(([key, importPath], index) => ({\n originalKey: key,\n safeVarName: `_v${index}`, // A guaranteed valid identifier\n importPath,\n }));\n\n // Generate the import statements using the safe variable names.\n const importStatements = entries\n .map(\n ({ safeVarName, importPath }) =>\n `import ${safeVarName} from '${importPath}';`\n )\n .join(\"\\n\");\n\n // Build the object literal mapping the original vertex keys to the safe variable names.\n // We quote the keys to ensure validity even if they contain special characters.\n const verticesObject = entries\n .map(({ originalKey, safeVarName }) => `\"${originalKey}\": ${safeVarName}`)\n .join(\", \");\n\n // Embed the selectVertex function definition.\n // This function is included in the generated code so that it is always available.\n const selectVertexFunctionCode = `\n function selectVertex(req, env, ctx, vertices) {\n // The target should be of the format \"<vertex>:<internal|external>\"\n const vtarget = req.headers.get('X-Mochabug-Adapt-Plugin-Vertex-Target');\n if (!vtarget) {\n console.error('No vertex target when selecting vertex');\n console.error(req.headers);\n throw new Error('No vertex target');\n }\n const split = vtarget.split(':');\n if (split.length !== 2) {\n console.error('Invalid vertex target when selecting vertex');\n console.error(req.headers);\n throw new Error('Invalid vertex target');\n }\n const vertex = split[0];\n const visibility = split[1]; // Expected to be 'internal' or 'external'\n if (!vertices[vertex] || !vertices[vertex][visibility]) {\n console.error('Invalid vertex target when selecting vertex');\n console.error(req.headers);\n throw new Error('Invalid vertex target');\n }\n return vertices[vertex][visibility].entrypoint(req, env, ctx);\n }\n `;\n\n // Construct the final module code.\n return ` \n ${importStatements}\n\n ${selectVertexFunctionCode.trim()}\n \n export default {\n async fetch(req, env, ctx): Promise<Response> {\n return await selectVertex(req, env, ctx, { ${verticesObject} });\n },\n };\n `;\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n CONFIGURATOR_HTML,\n CONFIGURATOR_MAIN,\n CONFIGURATOR_SSG,\n EXECUTOR_HTML,\n EXECUTOR_MAIN,\n EXECUTOR_SSG,\n FILE_EXTENSIONS,\n} from \"./defaults\";\n\nexport function findConfigEntrypoints(paths: Record<string, string>): {\n name: string;\n browser: string;\n html: string;\n ssg?: string;\n}[] {\n const result: {\n name: string;\n browser: string;\n html: string;\n ssg?: string;\n }[] = [];\n for (const [name, p] of Object.entries(paths)) {\n let browser;\n for (const ext of FILE_EXTENSIONS) {\n const filePath = path.join(p, \"ui\", `${CONFIGURATOR_MAIN}.${ext}`);\n if (fs.existsSync(filePath)) {\n browser = filePath;\n break;\n }\n }\n if (browser === undefined) {\n continue;\n }\n const html = path.join(p, \"ui\", CONFIGURATOR_HTML);\n if (!fs.existsSync(html)) {\n throw new Error(\n `The ${browser} cannot exist without the corresponding ${CONFIGURATOR_HTML}`\n );\n }\n // Check whether or not we have a corresponding ssg file as well\n let ssg = undefined;\n for (const ext of FILE_EXTENSIONS) {\n const filePath = path.join(p, \"ui\", `${CONFIGURATOR_SSG}.${ext}`);\n if (fs.existsSync(filePath)) {\n ssg = filePath;\n break;\n }\n }\n if (ssg === undefined) {\n result.push({\n name,\n browser,\n html,\n });\n continue;\n }\n result.push({\n name,\n browser,\n html,\n ssg,\n });\n }\n\n return result;\n}\n\nexport function findBrowserEntrypoints(paths: Record<string, string>): {\n name: string;\n browser: string;\n html: string;\n ssg?: string;\n}[] {\n const result: {\n name: string;\n browser: string;\n html: string;\n ssg?: string;\n }[] = [];\n for (const [name, p] of Object.entries(paths)) {\n let browser;\n for (const ext of FILE_EXTENSIONS) {\n const filePath = path.join(p, \"ui\", `${EXECUTOR_MAIN}.${ext}`);\n if (fs.existsSync(filePath)) {\n browser = filePath;\n break;\n }\n }\n if (browser === undefined) {\n continue;\n }\n const html = path.join(p, \"ui\", EXECUTOR_HTML);\n if (!fs.existsSync(html)) {\n throw new Error(\n `The ${browser} cannot exist without the corresponding ${EXECUTOR_HTML}`\n );\n }\n // Check whether or not we have a corresponding ssg file as well\n let ssg = undefined;\n for (const ext of FILE_EXTENSIONS) {\n const filePath = path.join(p, \"ui\", `${EXECUTOR_SSG}.${ext}`);\n if (fs.existsSync(filePath)) {\n ssg = filePath;\n break;\n }\n }\n if (ssg === undefined) {\n result.push({\n name,\n browser,\n html,\n });\n continue;\n }\n result.push({\n name,\n browser,\n html,\n ssg,\n });\n }\n\n return result;\n}\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/graph/jtd_schema.proto (package mochabugapis.adapt.graph, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../buf/validate/validate_pb\";\nimport type { StructJson } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_struct } from \"@bufbuild/protobuf/wkt\";\nimport type { JsonObject, Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/graph/jtd_schema.proto.\n */\nexport const file_mochabugapis_adapt_graph_jtd_schema: GenFile = /*@__PURE__*/\n fileDesc(\"Ciltb2NoYWJ1Z2FwaXMvYWRhcHQvZ3JhcGgvanRkX3NjaGVtYS5wcm90bxIYbW9jaGFidWdhcGlzLmFkYXB0LmdyYXBoIsEcCglKVERTY2hlbWESegoLZGVmaW5pdGlvbnMYASADKAsyNC5tb2NoYWJ1Z2FwaXMuYWRhcHQuZ3JhcGguSlREU2NoZW1hLkRlZmluaXRpb25zRW50cnlCL7pILJoBKQgAEOgHIiJyIBABGGQyGl5bXyRhLXpBLVpdW18kYS16QS1aMC05XSokEi4KCG1ldGFkYXRhGAIgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdEgAiAEBEhUKCG51bGxhYmxlGAMgASgISAGIAQESNwoDcmVmGAQgASgJQiW6SCJyIBABGGQyGl5bXyRhLXpBLVpdW18kYS16QS1aMC05XSokSAKIAQEScQoEdHlwZRgFIAEoCUJeukhbcllSB2Jvb2xlYW5SB2Zsb2F0MzJSB2Zsb2F0NjRSBGludDhSBXVpbnQ4UgVpbnQxNlIGdWludDE2UgVpbnQzMlIGdWludDMyUgZzdHJpbmdSCXRpbWVzdGFtcEgDiAEBEiQKBGVudW0YBiADKAlCFrpIE5IBEAgAEOgHGAEiB3IFEAEY6AcSOgoIZWxlbWVudHMYByABKAsyIy5tb2NoYWJ1Z2FwaXMuYWRhcHQuZ3JhcGguSlREU2NoZW1hSASIAQESXAoKcHJvcGVydGllcxgIIAMoCzIzLm1vY2hhYnVnYXBpcy5hZGFwdC5ncmFwaC5KVERTY2hlbWEuUHJvcGVydGllc0VudHJ5QhO6SBCaAQ0IABDoByIGcgQQARhkEm0KE29wdGlvbmFsX3Byb3BlcnRpZXMYCSADKAsyOy5tb2NoYWJ1Z2FwaXMuYWRhcHQuZ3JhcGguSlREU2NoZW1hLk9wdGlvbmFsUHJvcGVydGllc0VudHJ5QhO6SBCaAQ0IABDoByIGcgQQARhkEiIKFWFkZGl0aW9uYWxfcHJvcGVydGllcxgKIAEoCEgFiAEBEjgKBnZhbHVlcxgLIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5ncmFwaC5KVERTY2hlbWFIBogBARIlCg1kaXNjcmltaW5hdG9yGAwgASgJQgm6SAZyBBABGGRIB4gBARJWCgdtYXBwaW5nGA0gAygLMjAubW9jaGFidWdhcGlzLmFkYXB0LmdyYXBoLkpURFNjaGVtYS5NYXBwaW5nRW50cnlCE7pIEJoBDQgAEOgHIgZyBBABGGQaVwoQRGVmaW5pdGlvbnNFbnRyeRILCgNrZXkYASABKAkSMgoFdmFsdWUYAiABKAsyIy5tb2NoYWJ1Z2FwaXMuYWRhcHQuZ3JhcGguSlREU2NoZW1hOgI4ARpWCg9Qcm9wZXJ0aWVzRW50cnkSCwoDa2V5GAEgASgJEjIKBXZhbHVlGAIgASgLMiMubW9jaGFidWdhcGlzLmFkYXB0LmdyYXBoLkpURFNjaGVtYToCOAEaXgoXT3B0aW9uYWxQcm9wZXJ0aWVzRW50cnkSCwoDa2V5GAEgASgJEjIKBXZhbHVlGAIgASgLMiMubW9jaGFidWdhcGlzLmFkYXB0LmdyYXBoLkpURFNjaGVtYToCOAEaUwoMTWFwcGluZ0VudHJ5EgsKA2tleRgBIAEoCRIyCgV2YWx1ZRgCIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5ncmFwaC5KVERTY2hlbWE6AjgBOuMRukjfERqTAwocanRkLm11dHVhbGx5X2V4Y2x1c2l2ZV9mb3JtcxKIAVNjaGVtYSBtdXN0IHVzZSBleGFjdGx5IG9uZSBmb3JtIChlbXB0eSwgcmVmLCB0eXBlLCBlbnVtLCBlbGVtZW50cywgcHJvcGVydGllcywgdmFsdWVzLCBvciBkaXNjcmltaW5hdG9yKS4gTXVsdGlwbGUgZm9ybSBrZXl3b3JkcyBmb3VuZC4a5wFbaGFzKHRoaXMucmVmKSwgaGFzKHRoaXMudHlwZSksIHNpemUodGhpcy5lbnVtKSA+IDAsIGhhcyh0aGlzLmVsZW1lbnRzKSwgc2l6ZSh0aGlzLnByb3BlcnRpZXMpID4gMCB8fCBzaXplKHRoaXMub3B0aW9uYWxfcHJvcGVydGllcykgPiAwLCBoYXModGhpcy52YWx1ZXMpLCBoYXModGhpcy5kaXNjcmltaW5hdG9yKSAmJiBzaXplKHRoaXMubWFwcGluZykgPiAwXS5maWx0ZXIoeCwgeCkuc2l6ZSgpIDw9IDEa+AEKGWp0ZC5wcm9wZXJ0aWVzX25vX292ZXJsYXASWFByb3BlcnRpZXMgYW5kIG9wdGlvbmFsX3Byb3BlcnRpZXMgY2Fubm90IGhhdmUgb3ZlcmxhcHBpbmcga2V5cyAoUkZDIDg5MjcgU2VjdGlvbiAyLjIuNikagAEhKHNpemUodGhpcy5wcm9wZXJ0aWVzKSA+IDAgJiYgc2l6ZSh0aGlzLm9wdGlvbmFsX3Byb3BlcnRpZXMpID4gMCkgfHwgdGhpcy5wcm9wZXJ0aWVzLmFsbChwaywgIShwayBpbiB0aGlzLm9wdGlvbmFsX3Byb3BlcnRpZXMpKRqQAgoxanRkLmFkZGl0aW9uYWxfcHJvcGVydGllc19vbmx5X29uX3Byb3BlcnRpZXNfZm9ybRJ2YWRkaXRpb25hbF9wcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHNldCB3aGVuIHVzaW5nIHRoZSBwcm9wZXJ0aWVzIGZvcm0gKGhhcyBub24tZW1wdHkgcHJvcGVydGllcyBvciBvcHRpb25hbF9wcm9wZXJ0aWVzKRpjIWhhcyh0aGlzLmFkZGl0aW9uYWxfcHJvcGVydGllcykgfHwgc2l6ZSh0aGlzLnByb3BlcnRpZXMpID4gMCB8fCBzaXplKHRoaXMub3B0aW9uYWxfcHJvcGVydGllcykgPiAwGsIBCiJqdGQuZGlzY3JpbWluYXRvcl9yZXF1aXJlc19tYXBwaW5nEmdkaXNjcmltaW5hdG9yIGFuZCBtYXBwaW5nIG11c3QgYXBwZWFyIHRvZ2V0aGVyIHdpdGggYXQgbGVhc3Qgb25lIG1hcHBpbmcgZW50cnkgKFJGQyA4OTI3IFNlY3Rpb24gMi4yLjgpGjNoYXModGhpcy5kaXNjcmltaW5hdG9yKSA9PSAoc2l6ZSh0aGlzLm1hcHBpbmcpID4gMCka/QEKI2p0ZC5tYXBwaW5nX211c3RfYmVfcHJvcGVydGllc19mb3JtEk5BbGwgc2NoZW1hcyBpbiBtYXBwaW5nIG11c3QgYmUgb2YgdGhlIHByb3BlcnRpZXMgZm9ybSAoUkZDIDg5MjcgU2VjdGlvbiAyLjIuOCkahQFzaXplKHRoaXMubWFwcGluZykgPT0gMCB8fCB0aGlzLm1hcHBpbmcuYWxsKG0sIHNpemUodGhpcy5tYXBwaW5nW21dLnByb3BlcnRpZXMpID4gMCB8fCBzaXplKHRoaXMubWFwcGluZ1ttXS5vcHRpb25hbF9wcm9wZXJ0aWVzKSA+IDApGuIBCh5qdGQubWFwcGluZ19jYW5ub3RfYmVfbnVsbGFibGUSU1NjaGVtYXMgaW4gZGlzY3JpbWluYXRvciBtYXBwaW5nIGNhbm5vdCBoYXZlIG51bGxhYmxlPXRydWUgKFJGQyA4OTI3IFNlY3Rpb24gMi4yLjgpGmtzaXplKHRoaXMubWFwcGluZykgPT0gMCB8fCB0aGlzLm1hcHBpbmcuYWxsKG0sICFoYXModGhpcy5tYXBwaW5nW21dLm51bGxhYmxlKSB8fCAhdGhpcy5tYXBwaW5nW21dLm51bGxhYmxlKRrGAgoranRkLmRpc2NyaW1pbmF0b3Jfbm90X2luX21hcHBpbmdfcHJvcGVydGllcxJwRGlzY3JpbWluYXRvciB0YWcgY2Fubm90IGFwcGVhciBpbiBwcm9wZXJ0aWVzIG9yIG9wdGlvbmFsX3Byb3BlcnRpZXMgb2YgbWFwcGluZyBzY2hlbWFzIChSRkMgODkyNyBTZWN0aW9uIDIuMi44KRqkASFoYXModGhpcy5kaXNjcmltaW5hdG9yKSB8fCB0aGlzLm1hcHBpbmcuYWxsKG0sICEodGhpcy5kaXNjcmltaW5hdG9yIGluIHRoaXMubWFwcGluZ1ttXS5wcm9wZXJ0aWVzKSAmJiAhKHRoaXMuZGlzY3JpbWluYXRvciBpbiB0aGlzLm1hcHBpbmdbbV0ub3B0aW9uYWxfcHJvcGVydGllcykpGsUCChJqdGQuZW51bV9ub25fZW1wdHkSSmVudW0gYXJyYXkgbXVzdCBiZSBub24tZW1wdHkgd2hlbiB1c2luZyBlbnVtIGZvcm0gKFJGQyA4OTI3IFNlY3Rpb24gMi4yLjQpGuIBc2l6ZSh0aGlzLmVudW0pID4gMCAmJiAhaGFzKHRoaXMudHlwZSkgJiYgIWhhcyh0aGlzLnJlZikgJiYgIWhhcyh0aGlzLmVsZW1lbnRzKSAmJiAhaGFzKHRoaXMudmFsdWVzKSAmJiAhaGFzKHRoaXMuZGlzY3JpbWluYXRvcikgJiYgc2l6ZSh0aGlzLnByb3BlcnRpZXMpID09IDAgJiYgc2l6ZSh0aGlzLm9wdGlvbmFsX3Byb3BlcnRpZXMpID09IDAgPyBzaXplKHRoaXMuZW51bSkgPiAwIDogdHJ1ZUILCglfbWV0YWRhdGFCCwoJX251bGxhYmxlQgYKBF9yZWZCBwoFX3R5cGVCCwoJX2VsZW1lbnRzQhgKFl9hZGRpdGlvbmFsX3Byb3BlcnRpZXNCCQoHX3ZhbHVlc0IQCg5fZGlzY3JpbWluYXRvcmIGcHJvdG8z\", [file_buf_validate_validate, file_google_protobuf_struct]);\n\n/**\n * Schema represents a JSON Typedef Schema (RFC 8927).\n *\n * ## Eight Mutually Exclusive Forms\n *\n * A JTD schema must take exactly ONE of these forms:\n * 1. **Empty**: No form-specific keywords (accepts anything)\n * 2. **Ref**: Has `ref` keyword\n * 3. **Type**: Has `type` keyword\n * 4. **Enum**: Has `enum` keyword (non-empty array)\n * 5. **Elements**: Has `elements` keyword\n * 6. **Properties**: Has `properties` and/or `optional_properties`\n * 7. **Values**: Has `values` keyword\n * 8. **Discriminator**: Has `discriminator` and `mapping` keywords\n *\n * ## Shared Keywords\n *\n * These can appear on ANY form:\n * - `nullable`: Allows null values in addition to the schema's type\n * - `metadata`: Arbitrary information (ignored during validation)\n *\n * ## Root-Level Keyword\n *\n * - `definitions`: Per RFC 8927 Section 2.1, this should only appear on root schemas.\n * While this cannot be enforced at the protobuf schema level, application code should\n * only populate this field on root schemas, not on nested schemas within definitions,\n * elements, properties, etc.\n *\n * @generated from message mochabugapis.adapt.graph.JTDSchema\n */\nexport type JTDSchema = Message<\"mochabugapis.adapt.graph.JTDSchema\"> & {\n /**\n * The definitions keyword MUST be an object where each value is a schema.\n * This object defines a collection of schema definitions that can be referenced via the ref keyword.\n *\n * RFC 8927 Section 2.1: definitions should only appear on root schemas, not on nested schemas.\n * Application code is responsible for enforcing this constraint.\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> definitions = 1;\n */\n definitions: { [key: string]: JTDSchema };\n\n /**\n * The metadata keyword MUST be an object.\n * This object is ignored during validation and can store custom information about the schema.\n * Examples: descriptions, UI hints, code generation directives.\n *\n * @generated from field: optional google.protobuf.Struct metadata = 2;\n */\n metadata?: JsonObject;\n\n /**\n * The nullable keyword MUST be a boolean.\n * If true, the schema matches the value null as well as any value matched by the rest of the schema.\n *\n * RFC 8927: nullable can appear on any schema form.\n * Exception: Cannot be true on schemas within discriminator mappings (validated via CEL).\n *\n * @generated from field: optional bool nullable = 3;\n */\n nullable?: boolean;\n\n /**\n * The ref keyword MUST be a string.\n * It is a reference to a schema defined in the definitions object of the root schema.\n *\n * RFC 8927 Section 2.2.2: The value must refer to a definition in the root schema's definitions.\n * The referenced definition must exist (validated at runtime, not enforceable in protobuf schema).\n *\n * @generated from field: optional string ref = 4;\n */\n ref?: string;\n\n /**\n * The type keyword MUST be one of the predefined strings specifying the type of the value.\n * Valid values per RFC 8927 Section 2.2.3:\n * - \"boolean\": JSON true or false\n * - \"float32\", \"float64\": JSON numbers (IEEE 754 single/double precision intent)\n * - \"int8\": -128 to 127\n * - \"uint8\": 0 to 255\n * - \"int16\": -32,768 to 32,767\n * - \"uint16\": 0 to 65,535\n * - \"int32\": -2,147,483,648 to 2,147,483,647\n * - \"uint32\": 0 to 4,294,967,295\n * - \"string\": JSON string\n * - \"timestamp\": RFC 3339 timestamp string\n *\n * Note: RFC 8927 intentionally omits int64/uint64 due to JSON interoperability concerns.\n *\n * @generated from field: optional string type = 5;\n */\n type?: string;\n\n /**\n * The enum keyword MUST be a non-empty array of strings.\n * The schema matches any value that is equal to one of the elements in the array.\n *\n * RFC 8927 Section 2.2.4:\n * - When using enum form, this array MUST be non-empty\n * - The array MUST NOT contain duplicate values (enforced via unique constraint)\n * - Only string enums are supported (no numeric enums)\n *\n * @generated from field: repeated string enum = 6;\n */\n enum: string[];\n\n /**\n * The elements keyword MUST be a schema.\n * It is used to validate elements in an array.\n *\n * RFC 8927 Section 2.2.5: Describes homogeneous arrays where all elements match the same schema.\n * Empty arrays are valid. Each element is validated against this schema.\n *\n * @generated from field: optional mochabugapis.adapt.graph.JTDSchema elements = 7;\n */\n elements?: JTDSchema;\n\n /**\n * The properties keyword MUST be an object where each value is a schema.\n * Each key is a required property that must match the corresponding schema.\n *\n * RFC 8927 Section 2.2.6: Properties form describes JSON objects used as structs.\n * - All properties listed here are REQUIRED\n * - For optional properties, use optional_properties\n * - Keys cannot overlap between properties and optional_properties (validated via CEL)\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> properties = 8;\n */\n properties: { [key: string]: JTDSchema };\n\n /**\n * The optional_properties keyword MUST be an object where each value is a schema.\n * Each key is an optional property that, if present, must match the corresponding schema.\n *\n * RFC 8927 Section 2.2.6: Properties form describes JSON objects used as structs.\n * - All properties listed here are OPTIONAL\n * - For required properties, use properties\n * - Keys cannot overlap between properties and optional_properties (validated via CEL)\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> optional_properties = 9;\n */\n optionalProperties: { [key: string]: JTDSchema };\n\n /**\n * The additional_properties keyword MUST be a boolean.\n * If true, the object may have properties other than those specified in properties and optional_properties.\n *\n * RFC 8927 Section 3.1:\n * - Only valid on schemas of the \"properties\" form\n * - Controls \"allow additional properties\" mode during validation\n * - Does not get inherited by subschemas\n * - If false or absent, unknown properties cause validation errors\n *\n * @generated from field: optional bool additional_properties = 10;\n */\n additionalProperties?: boolean;\n\n /**\n * The values keyword MUST be a schema.\n * It is used to validate the values in an object (dictionary/map/associative array pattern).\n *\n * RFC 8927 Section 2.2.7: Values form describes JSON objects used as dictionaries.\n * - Keys can be any string\n * - All values must match this schema\n * - Empty objects are valid\n *\n * @generated from field: optional mochabugapis.adapt.graph.JTDSchema values = 11;\n */\n values?: JTDSchema;\n\n /**\n * The discriminator keyword MUST be a string.\n * It is used with mapping to represent tagged unions (discriminated unions, sum types).\n *\n * RFC 8927 Section 2.2.8: Discriminator form describes tagged unions.\n * - The discriminator is a property name that acts as the \"tag\"\n * - The tag value determines which schema from mapping is used\n * - Must be used together with mapping (validated via CEL)\n *\n * @generated from field: optional string discriminator = 12;\n */\n discriminator?: string;\n\n /**\n * The mapping keyword MUST be an object where each value is a schema.\n * Used with discriminator for tagged unions, mapping discriminator tag values to schemas.\n *\n * RFC 8927 Section 2.2.8: Each schema in mapping:\n * - MUST be of the \"properties\" form (have properties and/or optional_properties)\n * - MUST NOT have nullable=true\n * - MUST NOT include the discriminator tag in properties or optional_properties\n * These constraints are validated via CEL rules below.\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> mapping = 13;\n */\n mapping: { [key: string]: JTDSchema };\n};\n\n/**\n * Schema represents a JSON Typedef Schema (RFC 8927).\n *\n * ## Eight Mutually Exclusive Forms\n *\n * A JTD schema must take exactly ONE of these forms:\n * 1. **Empty**: No form-specific keywords (accepts anything)\n * 2. **Ref**: Has `ref` keyword\n * 3. **Type**: Has `type` keyword\n * 4. **Enum**: Has `enum` keyword (non-empty array)\n * 5. **Elements**: Has `elements` keyword\n * 6. **Properties**: Has `properties` and/or `optional_properties`\n * 7. **Values**: Has `values` keyword\n * 8. **Discriminator**: Has `discriminator` and `mapping` keywords\n *\n * ## Shared Keywords\n *\n * These can appear on ANY form:\n * - `nullable`: Allows null values in addition to the schema's type\n * - `metadata`: Arbitrary information (ignored during validation)\n *\n * ## Root-Level Keyword\n *\n * - `definitions`: Per RFC 8927 Section 2.1, this should only appear on root schemas.\n * While this cannot be enforced at the protobuf schema level, application code should\n * only populate this field on root schemas, not on nested schemas within definitions,\n * elements, properties, etc.\n *\n * @generated from message mochabugapis.adapt.graph.JTDSchema\n */\nexport type JTDSchemaJson = {\n /**\n * The definitions keyword MUST be an object where each value is a schema.\n * This object defines a collection of schema definitions that can be referenced via the ref keyword.\n *\n * RFC 8927 Section 2.1: definitions should only appear on root schemas, not on nested schemas.\n * Application code is responsible for enforcing this constraint.\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> definitions = 1;\n */\n definitions?: { [key: string]: JTDSchemaJson };\n\n /**\n * The metadata keyword MUST be an object.\n * This object is ignored during validation and can store custom information about the schema.\n * Examples: descriptions, UI hints, code generation directives.\n *\n * @generated from field: optional google.protobuf.Struct metadata = 2;\n */\n metadata?: StructJson;\n\n /**\n * The nullable keyword MUST be a boolean.\n * If true, the schema matches the value null as well as any value matched by the rest of the schema.\n *\n * RFC 8927: nullable can appear on any schema form.\n * Exception: Cannot be true on schemas within discriminator mappings (validated via CEL).\n *\n * @generated from field: optional bool nullable = 3;\n */\n nullable?: boolean;\n\n /**\n * The ref keyword MUST be a string.\n * It is a reference to a schema defined in the definitions object of the root schema.\n *\n * RFC 8927 Section 2.2.2: The value must refer to a definition in the root schema's definitions.\n * The referenced definition must exist (validated at runtime, not enforceable in protobuf schema).\n *\n * @generated from field: optional string ref = 4;\n */\n ref?: string;\n\n /**\n * The type keyword MUST be one of the predefined strings specifying the type of the value.\n * Valid values per RFC 8927 Section 2.2.3:\n * - \"boolean\": JSON true or false\n * - \"float32\", \"float64\": JSON numbers (IEEE 754 single/double precision intent)\n * - \"int8\": -128 to 127\n * - \"uint8\": 0 to 255\n * - \"int16\": -32,768 to 32,767\n * - \"uint16\": 0 to 65,535\n * - \"int32\": -2,147,483,648 to 2,147,483,647\n * - \"uint32\": 0 to 4,294,967,295\n * - \"string\": JSON string\n * - \"timestamp\": RFC 3339 timestamp string\n *\n * Note: RFC 8927 intentionally omits int64/uint64 due to JSON interoperability concerns.\n *\n * @generated from field: optional string type = 5;\n */\n type?: string;\n\n /**\n * The enum keyword MUST be a non-empty array of strings.\n * The schema matches any value that is equal to one of the elements in the array.\n *\n * RFC 8927 Section 2.2.4:\n * - When using enum form, this array MUST be non-empty\n * - The array MUST NOT contain duplicate values (enforced via unique constraint)\n * - Only string enums are supported (no numeric enums)\n *\n * @generated from field: repeated string enum = 6;\n */\n enum?: string[];\n\n /**\n * The elements keyword MUST be a schema.\n * It is used to validate elements in an array.\n *\n * RFC 8927 Section 2.2.5: Describes homogeneous arrays where all elements match the same schema.\n * Empty arrays are valid. Each element is validated against this schema.\n *\n * @generated from field: optional mochabugapis.adapt.graph.JTDSchema elements = 7;\n */\n elements?: JTDSchemaJson;\n\n /**\n * The properties keyword MUST be an object where each value is a schema.\n * Each key is a required property that must match the corresponding schema.\n *\n * RFC 8927 Section 2.2.6: Properties form describes JSON objects used as structs.\n * - All properties listed here are REQUIRED\n * - For optional properties, use optional_properties\n * - Keys cannot overlap between properties and optional_properties (validated via CEL)\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> properties = 8;\n */\n properties?: { [key: string]: JTDSchemaJson };\n\n /**\n * The optional_properties keyword MUST be an object where each value is a schema.\n * Each key is an optional property that, if present, must match the corresponding schema.\n *\n * RFC 8927 Section 2.2.6: Properties form describes JSON objects used as structs.\n * - All properties listed here are OPTIONAL\n * - For required properties, use properties\n * - Keys cannot overlap between properties and optional_properties (validated via CEL)\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> optional_properties = 9;\n */\n optionalProperties?: { [key: string]: JTDSchemaJson };\n\n /**\n * The additional_properties keyword MUST be a boolean.\n * If true, the object may have properties other than those specified in properties and optional_properties.\n *\n * RFC 8927 Section 3.1:\n * - Only valid on schemas of the \"properties\" form\n * - Controls \"allow additional properties\" mode during validation\n * - Does not get inherited by subschemas\n * - If false or absent, unknown properties cause validation errors\n *\n * @generated from field: optional bool additional_properties = 10;\n */\n additionalProperties?: boolean;\n\n /**\n * The values keyword MUST be a schema.\n * It is used to validate the values in an object (dictionary/map/associative array pattern).\n *\n * RFC 8927 Section 2.2.7: Values form describes JSON objects used as dictionaries.\n * - Keys can be any string\n * - All values must match this schema\n * - Empty objects are valid\n *\n * @generated from field: optional mochabugapis.adapt.graph.JTDSchema values = 11;\n */\n values?: JTDSchemaJson;\n\n /**\n * The discriminator keyword MUST be a string.\n * It is used with mapping to represent tagged unions (discriminated unions, sum types).\n *\n * RFC 8927 Section 2.2.8: Discriminator form describes tagged unions.\n * - The discriminator is a property name that acts as the \"tag\"\n * - The tag value determines which schema from mapping is used\n * - Must be used together with mapping (validated via CEL)\n *\n * @generated from field: optional string discriminator = 12;\n */\n discriminator?: string;\n\n /**\n * The mapping keyword MUST be an object where each value is a schema.\n * Used with discriminator for tagged unions, mapping discriminator tag values to schemas.\n *\n * RFC 8927 Section 2.2.8: Each schema in mapping:\n * - MUST be of the \"properties\" form (have properties and/or optional_properties)\n * - MUST NOT have nullable=true\n * - MUST NOT include the discriminator tag in properties or optional_properties\n * These constraints are validated via CEL rules below.\n *\n * @generated from field: map<string, mochabugapis.adapt.graph.JTDSchema> mapping = 13;\n */\n mapping?: { [key: string]: JTDSchemaJson };\n};\n\n/**\n * Describes the message mochabugapis.adapt.graph.JTDSchema.\n * Use `create(JTDSchemaSchema)` to create a new message.\n */\nexport const JTDSchemaSchema: GenMessage<JTDSchema, {jsonType: JTDSchemaJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_graph_jtd_schema, 0);\n\n", "// Copyright 2023-2025 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file buf/validate/validate.proto (package buf.validate, syntax proto2)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenEnum, GenExtension, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, extDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Duration, DurationJson, FieldDescriptorProto_Type, FieldDescriptorProto_TypeJson, FieldOptions, MessageOptions, OneofOptions, Timestamp, TimestampJson } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file buf/validate/validate.proto.\n */\nexport const file_buf_validate_validate: GenFile = /*@__PURE__*/\n fileDesc(\"ChtidWYvdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8SDGJ1Zi52YWxpZGF0ZSI3CgRSdWxlEgoKAmlkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEgoKZXhwcmVzc2lvbhgDIAEoCSJuCgxNZXNzYWdlUnVsZXMSHwoDY2VsGAMgAygLMhIuYnVmLnZhbGlkYXRlLlJ1bGUSLQoFb25lb2YYBCADKAsyHi5idWYudmFsaWRhdGUuTWVzc2FnZU9uZW9mUnVsZUoECAEQAlIIZGlzYWJsZWQiNAoQTWVzc2FnZU9uZW9mUnVsZRIOCgZmaWVsZHMYASADKAkSEAoIcmVxdWlyZWQYAiABKAgiHgoKT25lb2ZSdWxlcxIQCghyZXF1aXJlZBgBIAEoCCK/CAoKRmllbGRSdWxlcxIfCgNjZWwYFyADKAsyEi5idWYudmFsaWRhdGUuUnVsZRIQCghyZXF1aXJlZBgZIAEoCBIkCgZpZ25vcmUYGyABKA4yFC5idWYudmFsaWRhdGUuSWdub3JlEikKBWZsb2F0GAEgASgLMhguYnVmLnZhbGlkYXRlLkZsb2F0UnVsZXNIABIrCgZkb3VibGUYAiABKAsyGS5idWYudmFsaWRhdGUuRG91YmxlUnVsZXNIABIpCgVpbnQzMhgDIAEoCzIYLmJ1Zi52YWxpZGF0ZS5JbnQzMlJ1bGVzSAASKQoFaW50NjQYBCABKAsyGC5idWYudmFsaWRhdGUuSW50NjRSdWxlc0gAEisKBnVpbnQzMhgFIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50MzJSdWxlc0gAEisKBnVpbnQ2NBgGIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50NjRSdWxlc0gAEisKBnNpbnQzMhgHIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50MzJSdWxlc0gAEisKBnNpbnQ2NBgIIAEoCzIZLmJ1Zi52YWxpZGF0ZS5TSW50NjRSdWxlc0gAEi0KB2ZpeGVkMzIYCSABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQzMlJ1bGVzSAASLQoHZml4ZWQ2NBgKIAEoCzIaLmJ1Zi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIABIvCghzZml4ZWQzMhgLIAEoCzIbLmJ1Zi52YWxpZGF0ZS5TRml4ZWQzMlJ1bGVzSAASLwoIc2ZpeGVkNjQYDCABKAsyGy5idWYudmFsaWRhdGUuU0ZpeGVkNjRSdWxlc0gAEicKBGJvb2wYDSABKAsyFy5idWYudmFsaWRhdGUuQm9vbFJ1bGVzSAASKwoGc3RyaW5nGA4gASgLMhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzSAASKQoFYnl0ZXMYDyABKAsyGC5idWYudmFsaWRhdGUuQnl0ZXNSdWxlc0gAEicKBGVudW0YECABKAsyFy5idWYudmFsaWRhdGUuRW51bVJ1bGVzSAASLwoIcmVwZWF0ZWQYEiABKAsyGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlc0gAEiUKA21hcBgTIAEoCzIWLmJ1Zi52YWxpZGF0ZS5NYXBSdWxlc0gAEiUKA2FueRgUIAEoCzIWLmJ1Zi52YWxpZGF0ZS5BbnlSdWxlc0gAEi8KCGR1cmF0aW9uGBUgASgLMhsuYnVmLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIABIxCgl0aW1lc3RhbXAYFiABKAsyHC5idWYudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAEIGCgR0eXBlSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHkiVQoPUHJlZGVmaW5lZFJ1bGVzEh8KA2NlbBgBIAMoCzISLmJ1Zi52YWxpZGF0ZS5SdWxlSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHki2hcKCkZsb2F0UnVsZXMSgwEKBWNvbnN0GAEgASgCQnTCSHEKbwoLZmxvYXQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKfAQoCbHQYAiABKAJCkAHCSIwBCokBCghmbG9hdC5sdBp9IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKvAQoDbHRlGAMgASgCQp8BwkibAQqYAQoJZmxvYXQubHRlGooBIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSk/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAAS7wcKAmd0GAQgASgCQuAHwkjcBwqNAQoIZmxvYXQuZ3QagAEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwrDAQoLZmxvYXQuZ3RfbHQaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrNAQoVZmxvYXQuZ3RfbHRfZXhjbHVzaXZlGrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycK0wEKDGZsb2F0Lmd0X2x0ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCt0BChZmbG9hdC5ndF9sdGVfZXhjbHVzaXZlGsIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARK6CAoDZ3RlGAUgASgCQqoIwkimCAqbAQoJZmxvYXQuZ3RlGo0BIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCtIBCgxmbG9hdC5ndGVfbHQawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtwBChZmbG9hdC5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwriAQoNZmxvYXQuZ3RlX2x0ZRrQAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK7AEKF2Zsb2F0Lmd0ZV9sdGVfZXhjbHVzaXZlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEn8KAmluGAYgAygCQnPCSHAKbgoIZmxvYXQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgHIAMoAkJmwkhjCmEKDGZsb2F0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnUKBmZpbml0ZRgIIAEoCEJlwkhiCmAKDGZsb2F0LmZpbml0ZRpQcnVsZXMuZmluaXRlID8gKHRoaXMuaXNOYW4oKSB8fCB0aGlzLmlzSW5mKCkgPyAndmFsdWUgbXVzdCBiZSBmaW5pdGUnIDogJycpIDogJycSKwoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIu0XCgtEb3VibGVSdWxlcxKEAQoFY29uc3QYASABKAFCdcJIcgpwCgxkb3VibGUuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKgAQoCbHQYAiABKAFCkQHCSI0BCooBCglkb3VibGUubHQafSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASsAEKA2x0ZRgDIAEoAUKgAcJInAEKmQEKCmRvdWJsZS5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABL0BwoCZ3QYBCABKAFC5QfCSOEHCo4BCglkb3VibGUuZ3QagAEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwrEAQoMZG91YmxlLmd0X2x0GrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzgEKFmRvdWJsZS5ndF9sdF9leGNsdXNpdmUaswFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrUAQoNZG91YmxlLmd0X2x0ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCt4BChdkb3VibGUuZ3RfbHRlX2V4Y2x1c2l2ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESvwgKA2d0ZRgFIAEoAUKvCMJIqwgKnAEKCmRvdWJsZS5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0wEKDWRvdWJsZS5ndGVfbHQawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCt0BChdkb3VibGUuZ3RlX2x0X2V4Y2x1c2l2ZRrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK4wEKDmRvdWJsZS5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrtAQoYZG91YmxlLmd0ZV9sdGVfZXhjbHVzaXZlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoAUJ0wkhxCm8KCWRvdWJsZS5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygBQmfCSGQKYgoNZG91YmxlLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEnYKBmZpbml0ZRgIIAEoCEJmwkhjCmEKDWRvdWJsZS5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnEiwKB2V4YW1wbGUYCSADKAFCG8JIGAoWCg5kb3VibGUuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ijBUKCkludDMyUnVsZXMSgwEKBWNvbnN0GAEgASgFQnTCSHEKbwoLaW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKKAQoCbHQYAiABKAVCfMJIeQp3CghpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKcAQoDbHRlGAMgASgFQowBwkiIAQqFAQoJaW50MzIubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKXBwoCZ3QYBCABKAVCiAfCSIQHCnoKCGludDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50MzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES4wcKA2d0ZRgFIAEoBULTB8JIzwcKiAEKCWludDMyLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsIBCgxpbnQzMi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKygEKFmludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtIBCg1pbnQzMi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtoBChdpbnQzMi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ/CgJpbhgGIAMoBUJzwkhwCm4KCGludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YByADKAVCZsJIYwphCgxpbnQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIrCgdleGFtcGxlGAggAygFQhrCSBcKFQoNaW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ijBUKCkludDY0UnVsZXMSgwEKBWNvbnN0GAEgASgDQnTCSHEKbwoLaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKKAQoCbHQYAiABKANCfMJIeQp3CghpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKcAQoDbHRlGAMgASgDQowBwkiIAQqFAQoJaW50NjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABKXBwoCZ3QYBCABKANCiAfCSIQHCnoKCGludDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50NjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES4wcKA2d0ZRgFIAEoA0LTB8JIzwcKiAEKCWludDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsIBCgxpbnQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKygEKFmludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtIBCg1pbnQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCtoBChdpbnQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJ/CgJpbhgGIAMoA0JzwkhwCm4KCGludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ2CgZub3RfaW4YByADKANCZsJIYwphCgxpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIrCgdleGFtcGxlGAkgAygDQhrCSBcKFQoNaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1VJbnQzMlJ1bGVzEoQBCgVjb25zdBgBIAEoDUJ1wkhyCnAKDHVpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoDUJ9wkh6CngKCXVpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgNQo0BwkiJAQqGAQoKdWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgNQo0HwkiJBwp7Cgl1aW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgx1aW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZ1aW50MzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXVpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChd1aW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoDULYB8JI1AcKiQEKCnVpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoDUJ0wkhxCm8KCXVpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygNQmfCSGQKYgoNdWludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKA1CG8JIGAoWCg51aW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1VJbnQ2NFJ1bGVzEoQBCgVjb25zdBgBIAEoBEJ1wkhyCnAKDHVpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoBEJ9wkh6CngKCXVpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgEQo0BwkiJAQqGAQoKdWludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgEQo0HwkiJBwp7Cgl1aW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgx1aW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZ1aW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXVpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChd1aW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoBELYB8JI1AcKiQEKCnVpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoBEJ0wkhxCm8KCXVpbnQ2NC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygEQmfCSGQKYgoNdWludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKARCG8JIGAoWCg51aW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1NJbnQzMlJ1bGVzEoQBCgVjb25zdBgBIAEoEUJ1wkhyCnAKDHNpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoEUJ9wkh6CngKCXNpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgRQo0BwkiJAQqGAQoKc2ludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgRQo0HwkiJBwp7CglzaW50MzIuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgxzaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZzaW50MzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXNpbnQzMi5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChdzaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoEULYB8JI1AcKiQEKCnNpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoEUJ0wkhxCm8KCXNpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygRQmfCSGQKYgoNc2ludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBFCG8JIGAoWCg5zaW50MzIuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4inhUKC1NJbnQ2NFJ1bGVzEoQBCgVjb25zdBgBIAEoEkJ1wkhyCnAKDHNpbnQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEosBCgJsdBgCIAEoEkJ9wkh6CngKCXNpbnQ2NC5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKdAQoDbHRlGAMgASgSQo0BwkiJAQqGAQoKc2ludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASnAcKAmd0GAQgASgSQo0HwkiJBwp7CglzaW50NjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrQBCgxzaW50NjQuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrwBChZzaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxAEKDXNpbnQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCswBChdzaW50NjQuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES6AcKA2d0ZRgFIAEoEkLYB8JI1AcKiQEKCnNpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoABCgJpbhgGIAMoEkJ0wkhxCm8KCXNpbnQ2NC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAcgAygSQmfCSGQKYgoNc2ludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEiwKB2V4YW1wbGUYCCADKBJCG8JIGAoWCg5zaW50NjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4irxUKDEZpeGVkMzJSdWxlcxKFAQoFY29uc3QYASABKAdCdsJIcwpxCg1maXhlZDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjAEKAmx0GAIgASgHQn7CSHsKeQoKZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABKeAQoDbHRlGAMgASgHQo4BwkiKAQqHAQoLZml4ZWQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEqEHCgJndBgEIAEoB0KSB8JIjgcKfAoKZml4ZWQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtQEKDWZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr0BChdmaXhlZDMyLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsUBCg5maXhlZDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzQEKGGZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAES7QcKA2d0ZRgFIAEoB0LdB8JI2QcKigEKC2ZpeGVkMzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxAEKDmZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCswBChhmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtQBCg9maXhlZDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3AEKGWZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESgQEKAmluGAYgAygHQnXCSHIKcAoKZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSeAoGbm90X2luGAcgAygHQmjCSGUKYwoOZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxItCgdleGFtcGxlGAggAygHQhzCSBkKFwoPZml4ZWQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKvFQoMRml4ZWQ2NFJ1bGVzEoUBCgVjb25zdBgBIAEoBkJ2wkhzCnEKDWZpeGVkNjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKMAQoCbHQYAiABKAZCfsJIewp5CgpmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp4BCgNsdGUYAyABKAZCjgHCSIoBCocBCgtmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASoQcKAmd0GAQgASgGQpIHwkiOBwp8CgpmaXhlZDY0Lmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkNjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkNjQuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLtBwoDZ3RlGAUgASgGQt0HwkjZBwqKAQoLZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKBAQoCaW4YBiADKAZCdcJIcgpwCgpmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ4CgZub3RfaW4YByADKAZCaMJIZQpjCg5maXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi0KB2V4YW1wbGUYCCADKAZCHMJIGQoXCg9maXhlZDY0LmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIsAVCg1TRml4ZWQzMlJ1bGVzEoYBCgVjb25zdBgBIAEoD0J3wkh0CnIKDnNmaXhlZDMyLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSjQEKAmx0GAIgASgPQn/CSHwKegoLc2ZpeGVkMzIubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSAASnwEKA2x0ZRgDIAEoD0KPAcJIiwEKiAEKDHNmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASpgcKAmd0GAQgASgPQpcHwkiTBwp9CgtzZml4ZWQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtgEKDnNmaXhlZDMyLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq+AQoYc2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxgEKD3NmaXhlZDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzgEKGXNmaXhlZDMyLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBEvIHCgNndGUYBSABKA9C4gfCSN4HCosBCgxzZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAESggEKAmluGAYgAygPQnbCSHMKcQoLc2ZpeGVkMzIuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnkKBm5vdF9pbhgHIAMoD0JpwkhmCmQKD3NmaXhlZDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEi4KB2V4YW1wbGUYCCADKA9CHcJIGgoYChBzZml4ZWQzMi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLAFQoNU0ZpeGVkNjRSdWxlcxKGAQoFY29uc3QYASABKBBCd8JIdApyCg5zZml4ZWQ2NC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEo0BCgJsdBgCIAEoEEJ/wkh8CnoKC3NmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAEp8BCgNsdGUYAyABKBBCjwHCSIsBCogBCgxzZml4ZWQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAEqYHCgJndBgEIAEoEEKXB8JIkwcKfQoLc2ZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrYBCg5zZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKGHNmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsYBCg9zZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs4BChlzZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIARLyBwoDZ3RlGAUgASgQQuIHwkjeBwqLAQoMc2ZpeGVkNjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxQEKD3NmaXhlZDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrNAQoZc2ZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1QEKEHNmaXhlZDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3QEKGnNmaXhlZDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBEoIBCgJpbhgGIAMoEEJ2wkhzCnEKC3NmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJxJ5CgZub3RfaW4YByADKBBCacJIZgpkCg9zZml4ZWQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJxIuCgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4ixwEKCUJvb2xSdWxlcxKCAQoFY29uc3QYASABKAhCc8JIcApuCgpib29sLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSKgoHZXhhbXBsZRgCIAMoCEIZwkgWChQKDGJvb2wuZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIpA3CgtTdHJpbmdSdWxlcxKGAQoFY29uc3QYASABKAlCd8JIdApyCgxzdHJpbmcuY29uc3QaYnRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgYCVzYCcuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEn4KA2xlbhgTIAEoBEJxwkhuCmwKCnN0cmluZy5sZW4aXnVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJycSmQEKB21pbl9sZW4YAiABKARChwHCSIMBCoABCg5zdHJpbmcubWluX2xlbhpudWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fbGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0ICVzIGNoYXJhY3RlcnMnLmZvcm1hdChbcnVsZXMubWluX2xlbl0pIDogJycSlwEKB21heF9sZW4YAyABKARChQHCSIEBCn8KDnN0cmluZy5tYXhfbGVuGm11aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbW9zdCAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLm1heF9sZW5dKSA6ICcnEpsBCglsZW5fYnl0ZXMYFCABKARChwHCSIMBCoABChBzdHJpbmcubGVuX2J5dGVzGmx1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl9ieXRlc10pIDogJycSowEKCW1pbl9ieXRlcxgEIAEoBEKPAcJIiwEKiAEKEHN0cmluZy5taW5fYnl0ZXMadHVpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fYnl0ZXNdKSA6ICcnEqIBCgltYXhfYnl0ZXMYBSABKARCjgHCSIoBCocBChBzdHJpbmcubWF4X2J5dGVzGnN1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgPiBydWxlcy5tYXhfYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbW9zdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5tYXhfYnl0ZXNdKSA6ICcnEo0BCgdwYXR0ZXJuGAYgASgJQnzCSHkKdwoOc3RyaW5nLnBhdHRlcm4aZSF0aGlzLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgZG9lcyBub3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnEoQBCgZwcmVmaXgYByABKAlCdMJIcQpvCg1zdHJpbmcucHJlZml4Gl4hdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnEoIBCgZzdWZmaXgYCCABKAlCcsJIbwptCg1zdHJpbmcuc3VmZml4GlwhdGhpcy5lbmRzV2l0aChydWxlcy5zdWZmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgc3VmZml4IGAlc2AnLmZvcm1hdChbcnVsZXMuc3VmZml4XSkgOiAnJxKQAQoIY29udGFpbnMYCSABKAlCfsJIewp5Cg9zdHJpbmcuY29udGFpbnMaZiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJxKYAQoMbm90X2NvbnRhaW5zGBcgASgJQoEBwkh+CnwKE3N0cmluZy5ub3RfY29udGFpbnMaZXRoaXMuY29udGFpbnMocnVsZXMubm90X2NvbnRhaW5zKSA/ICd2YWx1ZSBjb250YWlucyBzdWJzdHJpbmcgYCVzYCcuZm9ybWF0KFtydWxlcy5ub3RfY29udGFpbnNdKSA6ICcnEoABCgJpbhgKIAMoCUJ0wkhxCm8KCXN0cmluZy5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSdwoGbm90X2luGAsgAygJQmfCSGQKYgoNc3RyaW5nLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEt8BCgVlbWFpbBgMIAEoCELNAcJIyQEKYQoMc3RyaW5nLmVtYWlsEiN2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcxosIXJ1bGVzLmVtYWlsIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0VtYWlsKCkKZAoSc3RyaW5nLmVtYWlsX2VtcHR5EjJ2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcxoaIXJ1bGVzLmVtYWlsIHx8IHRoaXMgIT0gJydIABLnAQoIaG9zdG5hbWUYDSABKAhC0gHCSM4BCmUKD3N0cmluZy5ob3N0bmFtZRIedmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIABLHAQoCaXAYDiABKAhCuAHCSLQBClUKCXN0cmluZy5pcBIgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3MaJiFydWxlcy5pcCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCgpClsKD3N0cmluZy5pcF9lbXB0eRIvdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MaFyFydWxlcy5pcCB8fCB0aGlzICE9ICcnSAAS1gEKBGlwdjQYDyABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY0EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzGikhcnVsZXMuaXB2NCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg0KQphChFzdHJpbmcuaXB2NF9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcxoZIXJ1bGVzLmlwdjQgfHwgdGhpcyAhPSAnJ0gAEtYBCgRpcHY2GBAgASgIQsUBwkjBAQpcCgtzdHJpbmcuaXB2NhIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxopIXJ1bGVzLmlwdjYgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoNikKYQoRc3RyaW5nLmlwdjZfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MaGSFydWxlcy5pcHY2IHx8IHRoaXMgIT0gJydIABK/AQoDdXJpGBEgASgIQq8BwkirAQpRCgpzdHJpbmcudXJpEhl2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVJJGighcnVsZXMudXJpIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc1VyaSgpClYKEHN0cmluZy51cmlfZW1wdHkSKHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBVUkkaGCFydWxlcy51cmkgfHwgdGhpcyAhPSAnJ0gAEnAKB3VyaV9yZWYYEiABKAhCXcJIWgpYCg5zdHJpbmcudXJpX3JlZhIjdmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVSSSBSZWZlcmVuY2UaISFydWxlcy51cmlfcmVmIHx8IHRoaXMuaXNVcmlSZWYoKUgAEpACCgdhZGRyZXNzGBUgASgIQvwBwkj4AQqBAQoOc3RyaW5nLmFkZHJlc3MSLXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0bmFtZSwgb3IgaXAgYWRkcmVzcxpAIXJ1bGVzLmFkZHJlc3MgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKSB8fCB0aGlzLmlzSXAoKQpyChRzdHJpbmcuYWRkcmVzc19lbXB0eRI8dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGhwhcnVsZXMuYWRkcmVzcyB8fCB0aGlzICE9ICcnSAASmAIKBHV1aWQYFiABKAhChwLCSIMCCqUBCgtzdHJpbmcudXVpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeiFydWxlcy51dWlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpClkKEXN0cmluZy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBoZIXJ1bGVzLnV1aWQgfHwgdGhpcyAhPSAnJ0gAEvABCgV0dXVpZBghIAEoCELeAcJI2gEKcwoMc3RyaW5nLnR1dWlkEiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgdHJpbW1lZCBVVUlEGj8hcnVsZXMudHV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXszMn0kJykKYwoSc3RyaW5nLnR1dWlkX2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgdHJpbW1lZCBVVUlEGhohcnVsZXMudHV1aWQgfHwgdGhpcyAhPSAnJ0gAEpYCChFpcF93aXRoX3ByZWZpeGxlbhgaIAEoCEL4AcJI9AEKeAoYc3RyaW5nLmlwX3dpdGhfcHJlZml4bGVuEh92YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVAgcHJlZml4GjshcnVsZXMuaXBfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoKQp4Ch5zdHJpbmcuaXBfd2l0aF9wcmVmaXhsZW5fZW1wdHkSLnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUCBwcmVmaXgaJiFydWxlcy5pcF93aXRoX3ByZWZpeGxlbiB8fCB0aGlzICE9ICcnSAASzwIKE2lwdjRfd2l0aF9wcmVmaXhsZW4YGyABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQpCpIBCiBzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIABLPAgoTaXB2Nl93aXRoX3ByZWZpeGxlbhgcIAEoCEKvAsJIqwIKkwEKGnN0cmluZy5pcHY2X3dpdGhfcHJlZml4bGVuEjV2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBo+IXJ1bGVzLmlwdjZfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgoNikKkgEKIHN0cmluZy5pcHY2X3dpdGhfcHJlZml4bGVuX2VtcHR5EkR2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NiBhZGRyZXNzIHdpdGggcHJlZml4IGxlbmd0aBooIXJ1bGVzLmlwdjZfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAEvIBCglpcF9wcmVmaXgYHSABKAhC3AHCSNgBCmwKEHN0cmluZy5pcF9wcmVmaXgSH3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBwcmVmaXgaNyFydWxlcy5pcF9wcmVmaXggfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXBQcmVmaXgodHJ1ZSkKaAoWc3RyaW5nLmlwX3ByZWZpeF9lbXB0eRIudmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQIHByZWZpeBoeIXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzICE9ICcnSAASgwIKC2lwdjRfcHJlZml4GB4gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2NF9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IHByZWZpeBo8IXJ1bGVzLmlwdjRfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQsIHRydWUpCm4KGHN0cmluZy5pcHY0X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgcHJlZml4GiAhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAEoMCCgtpcHY2X3ByZWZpeBgfIAEoCELrAcJI5wEKdQoSc3RyaW5nLmlwdjZfcHJlZml4EiF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBwcmVmaXgaPCFydWxlcy5pcHY2X3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2LCB0cnVlKQpuChhzdHJpbmcuaXB2Nl9wcmVmaXhfZW1wdHkSMHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IHByZWZpeBogIXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgIT0gJydIABK1AgoNaG9zdF9hbmRfcG9ydBggIAEoCEKbAsJIlwIKmQEKFHN0cmluZy5ob3N0X2FuZF9wb3J0EkF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdCAoaG9zdG5hbWUgb3IgSVAgYWRkcmVzcykgYW5kIHBvcnQgcGFpcho+IXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdEFuZFBvcnQodHJ1ZSkKeQoac3RyaW5nLmhvc3RfYW5kX3BvcnRfZW1wdHkSN3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0IGFuZCBwb3J0IHBhaXIaIiFydWxlcy5ob3N0X2FuZF9wb3J0IHx8IHRoaXMgIT0gJydIABKoBQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QvEEwkjtBArwAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSJnZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrnAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEid2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAEg4KBnN0cmljdBgZIAEoCBIsCgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIuoQCgpCeXRlc1J1bGVzEoABCgVjb25zdBgBIAEoDEJxwkhuCmwKC2J5dGVzLmNvbnN0Gl10aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGJlICV4Jy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJycSeAoDbGVuGA0gASgEQmvCSGgKZgoJYnl0ZXMubGVuGll1aW50KHRoaXMuc2l6ZSgpKSAhPSBydWxlcy5sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubGVuXSkgOiAnJxKQAQoHbWluX2xlbhgCIAEoBEJ/wkh8CnoKDWJ5dGVzLm1pbl9sZW4aaXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJxKIAQoHbWF4X2xlbhgDIAEoBEJ3wkh0CnIKDWJ5dGVzLm1heF9sZW4aYXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2xlbiA/ICd2YWx1ZSBtdXN0IGJlIGF0IG1vc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWF4X2xlbl0pIDogJycSkAEKB3BhdHRlcm4YBCABKAlCf8JIfAp6Cg1ieXRlcy5wYXR0ZXJuGmkhc3RyaW5nKHRoaXMpLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgbXVzdCBtYXRjaCByZWdleCBwYXR0ZXJuIGAlc2AnLmZvcm1hdChbcnVsZXMucGF0dGVybl0pIDogJycSgQEKBnByZWZpeBgFIAEoDEJxwkhuCmwKDGJ5dGVzLnByZWZpeBpcIXRoaXMuc3RhcnRzV2l0aChydWxlcy5wcmVmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgcHJlZml4ICV4Jy5mb3JtYXQoW3J1bGVzLnByZWZpeF0pIDogJycSfwoGc3VmZml4GAYgASgMQm/CSGwKagoMYnl0ZXMuc3VmZml4GlohdGhpcy5lbmRzV2l0aChydWxlcy5zdWZmaXgpID8gJ3ZhbHVlIGRvZXMgbm90IGhhdmUgc3VmZml4ICV4Jy5mb3JtYXQoW3J1bGVzLnN1ZmZpeF0pIDogJycSgwEKCGNvbnRhaW5zGAcgASgMQnHCSG4KbAoOYnl0ZXMuY29udGFpbnMaWiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluICV4Jy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJxKnAQoCaW4YCCADKAxCmgHCSJYBCpMBCghieXRlcy5pbhqGAWdldEZpZWxkKHJ1bGVzLCAnaW4nKS5zaXplKCkgPiAwICYmICEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnYKBm5vdF9pbhgJIAMoDEJmwkhjCmEKDGJ5dGVzLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEusBCgJpcBgKIAEoCELcAcJI2AEKdAoIYnl0ZXMuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGkYhcnVsZXMuaXAgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0IHx8IHRoaXMuc2l6ZSgpID09IDE2CmAKDmJ5dGVzLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxodIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpICE9IDBIABLkAQoEaXB2NBgLIAEoCELTAcJIzwEKZQoKYnl0ZXMuaXB2NBIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcxozIXJ1bGVzLmlwdjQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0CmYKEGJ5dGVzLmlwdjRfZW1wdHkSMXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY0IGFkZHJlc3MaHyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpICE9IDBIABLlAQoEaXB2NhgMIAEoCELUAcJI0AEKZgoKYnl0ZXMuaXB2NhIidmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcxo0IXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpmChBieXRlcy5pcHY2X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NiBhZGRyZXNzGh8hcnVsZXMuaXB2NiB8fCB0aGlzLnNpemUoKSAhPSAwSAASKwoHZXhhbXBsZRgOIAMoDEIawkgXChUKDWJ5dGVzLmV4YW1wbGUaBHRydWUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duItQDCglFbnVtUnVsZXMSggEKBWNvbnN0GAEgASgFQnPCSHAKbgoKZW51bS5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEhQKDGRlZmluZWRfb25seRgCIAEoCBJ+CgJpbhgDIAMoBUJywkhvCm0KB2VudW0uaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnEnUKBm5vdF9pbhgEIAMoBUJlwkhiCmAKC2VudW0ubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJycSKgoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZSoJCOgHEICAgIACIvsDCg1SZXBlYXRlZFJ1bGVzEp4BCgltaW5faXRlbXMYASABKARCigHCSIYBCoMBChJyZXBlYXRlZC5taW5faXRlbXMabXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAlZCBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1pbl9pdGVtc10pIDogJycSogEKCW1heF9pdGVtcxgCIAEoBEKOAcJIigEKhwEKEnJlcGVhdGVkLm1heF9pdGVtcxpxdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfaXRlbXMgPyAndmFsdWUgbXVzdCBjb250YWluIG5vIG1vcmUgdGhhbiAlcyBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1heF9pdGVtc10pIDogJycScAoGdW5pcXVlGAMgASgIQmDCSF0KWwoPcmVwZWF0ZWQudW5pcXVlEihyZXBlYXRlZCB2YWx1ZSBtdXN0IGNvbnRhaW4gdW5pcXVlIGl0ZW1zGh4hcnVsZXMudW5pcXVlIHx8IHRoaXMudW5pcXVlKCkSJwoFaXRlbXMYBCABKAsyGC5idWYudmFsaWRhdGUuRmllbGRSdWxlcyoJCOgHEICAgIACIooDCghNYXBSdWxlcxKPAQoJbWluX3BhaXJzGAEgASgEQnzCSHkKdwoNbWFwLm1pbl9wYWlycxpmdWludCh0aGlzLnNpemUoKSkgPCBydWxlcy5taW5fcGFpcnMgPyAnbWFwIG11c3QgYmUgYXQgbGVhc3QgJWQgZW50cmllcycuZm9ybWF0KFtydWxlcy5taW5fcGFpcnNdKSA6ICcnEo4BCgltYXhfcGFpcnMYAiABKARCe8JIeAp2Cg1tYXAubWF4X3BhaXJzGmV1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBtb3N0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWF4X3BhaXJzXSkgOiAnJxImCgRrZXlzGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMSKAoGdmFsdWVzGAUgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXMqCQjoBxCAgICAAiImCghBbnlSdWxlcxIKCgJpbhgCIAMoCRIOCgZub3RfaW4YAyADKAkimRcKDUR1cmF0aW9uUnVsZXMSoQEKBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQnfCSHQKcgoOZHVyYXRpb24uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJxKoAQoCbHQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cf8JIfAp6CgtkdXJhdGlvbi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIABK6AQoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQo8BwkiLAQqIAQoMZHVyYXRpb24ubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIABLBBwoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ClwfCSJMHCn0KC2R1cmF0aW9uLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOZHVyYXRpb24uZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPZHVyYXRpb24uZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZZHVyYXRpb24uZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESjQgKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkLiB8JI3gcKiwEKDGR1cmF0aW9uLmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9kdXJhdGlvbi5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGWR1cmF0aW9uLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBkdXJhdGlvbi5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpkdXJhdGlvbi5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARKdAQoCaW4YByADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CdsJIcwpxCgtkdXJhdGlvbi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJycSlAEKBm5vdF9pbhgIIAMoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkJpwkhmCmQKD2R1cmF0aW9uLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnEkkKB2V4YW1wbGUYCSADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CHcJIGgoYChBkdXJhdGlvbi5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiKSGAoOVGltZXN0YW1wUnVsZXMSowEKBWNvbnN0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEJ4wkh1CnMKD3RpbWVzdGFtcC5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnEqsBCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCgAHCSH0KewoMdGltZXN0YW1wLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAErwBCgNsdGUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQpABwkiMAQqJAQoNdGltZXN0YW1wLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSAASbAoGbHRfbm93GAcgASgIQlrCSFcKVQoQdGltZXN0YW1wLmx0X25vdxpBKHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIABLHBwoCZ3QYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQpwHwkiYBwp+Cgx0aW1lc3RhbXAuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrcBCg90aW1lc3RhbXAuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr8BChl0aW1lc3RhbXAuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxwEKEHRpbWVzdGFtcC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs8BChp0aW1lc3RhbXAuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAESkwgKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBC5wfCSOMHCowBCg10aW1lc3RhbXAuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxgEKEHRpbWVzdGFtcC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzgEKGnRpbWVzdGFtcC5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrWAQoRdGltZXN0YW1wLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3gEKG3RpbWVzdGFtcC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIARJvCgZndF9ub3cYCCABKAhCXcJIWgpYChB0aW1lc3RhbXAuZ3Rfbm93GkQocnVsZXMuZ3Rfbm93ICYmIHRoaXMgPCBub3cpID8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG5vdycgOiAnJ0gBErgBCgZ3aXRoaW4YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CjAHCSIgBCoUBChB0aW1lc3RhbXAud2l0aGluGnF0aGlzIDwgbm93LXJ1bGVzLndpdGhpbiB8fCB0aGlzID4gbm93K3J1bGVzLndpdGhpbiA/ICd2YWx1ZSBtdXN0IGJlIHdpdGhpbiAlcyBvZiBub3cnLmZvcm1hdChbcnVsZXMud2l0aGluXSkgOiAnJxJLCgdleGFtcGxlGAogAygLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIewkgbChkKEXRpbWVzdGFtcC5leGFtcGxlGgR0cnVlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiI5CgpWaW9sYXRpb25zEisKCnZpb2xhdGlvbnMYASADKAsyFy5idWYudmFsaWRhdGUuVmlvbGF0aW9uIp8BCglWaW9sYXRpb24SJgoFZmllbGQYBSABKAsyFy5idWYudmFsaWRhdGUuRmllbGRQYXRoEiUKBHJ1bGUYBiABKAsyFy5idWYudmFsaWRhdGUuRmllbGRQYXRoEg8KB3J1bGVfaWQYAiABKAkSDwoHbWVzc2FnZRgDIAEoCRIPCgdmb3Jfa2V5GAQgASgISgQIARACUgpmaWVsZF9wYXRoIj0KCUZpZWxkUGF0aBIwCghlbGVtZW50cxgBIAMoCzIeLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhFbGVtZW50IukCChBGaWVsZFBhdGhFbGVtZW50EhQKDGZpZWxkX251bWJlchgBIAEoBRISCgpmaWVsZF9uYW1lGAIgASgJEj4KCmZpZWxkX3R5cGUYAyABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRI8CghrZXlfdHlwZRgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlEj4KCnZhbHVlX3R5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRIPCgVpbmRleBgGIAEoBEgAEhIKCGJvb2xfa2V5GAcgASgISAASEQoHaW50X2tleRgIIAEoA0gAEhIKCHVpbnRfa2V5GAkgASgESAASFAoKc3RyaW5nX2tleRgKIAEoCUgAQgsKCXN1YnNjcmlwdCqhAQoGSWdub3JlEhYKEklHTk9SRV9VTlNQRUNJRklFRBAAEhgKFElHTk9SRV9JRl9aRVJPX1ZBTFVFEAESEQoNSUdOT1JFX0FMV0FZUxADIgQIAhACKgxJR05PUkVfRU1QVFkqDklHTk9SRV9ERUZBVUxUKhdJR05PUkVfSUZfREVGQVVMVF9WQUxVRSoVSUdOT1JFX0lGX1VOUE9QVUxBVEVEKm4KCktub3duUmVnZXgSGwoXS05PV05fUkVHRVhfVU5TUEVDSUZJRUQQABIgChxLTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9OQU1FEAESIQodS05PV05fUkVHRVhfSFRUUF9IRUFERVJfVkFMVUUQAjpWCgdtZXNzYWdlEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGIcJIAEoCzIaLmJ1Zi52YWxpZGF0ZS5NZXNzYWdlUnVsZXNSB21lc3NhZ2U6TgoFb25lb2YSHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5PbmVvZlJ1bGVzUgVvbmVvZjpOCgVmaWVsZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYhwkgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXNSBWZpZWxkOl0KCnByZWRlZmluZWQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIgJIAEoCzIdLmJ1Zi52YWxpZGF0ZS5QcmVkZWZpbmVkUnVsZXNSCnByZWRlZmluZWRCbgoSYnVpbGQuYnVmLnZhbGlkYXRlQg1WYWxpZGF0ZVByb3RvUAFaR2J1Zi5idWlsZC9nZW4vZ28vYnVmYnVpbGQvcHJvdG92YWxpZGF0ZS9wcm90b2NvbGJ1ZmZlcnMvZ28vYnVmL3ZhbGlkYXRl\", [file_google_protobuf_descriptor, file_google_protobuf_duration, file_google_protobuf_timestamp]);\n\n/**\n * `Rule` represents a validation rule written in the Common Expression\n * Language (CEL) syntax. Each Rule includes a unique identifier, an\n * optional error message, and the CEL expression to evaluate. For more\n * information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message Foo {\n * option (buf.validate.message).cel = {\n * id: \"foo.bar\"\n * message: \"bar must be greater than 0\"\n * expression: \"this.bar > 0\"\n * };\n * int32 bar = 1;\n * }\n * ```\n *\n * @generated from message buf.validate.Rule\n */\nexport type Rule = Message<\"buf.validate.Rule\"> & {\n /**\n * `id` is a string that serves as a machine-readable name for this Rule.\n * It should be unique within its scope, which could be either a message or a field.\n *\n * @generated from field: optional string id = 1;\n */\n id: string;\n\n /**\n * `message` is an optional field that provides a human-readable error message\n * for this Rule when the CEL expression evaluates to false. If a\n * non-empty message is provided, any strings resulting from the CEL\n * expression evaluation are ignored.\n *\n * @generated from field: optional string message = 2;\n */\n message: string;\n\n /**\n * `expression` is the actual CEL expression that will be evaluated for\n * validation. This string must resolve to either a boolean or a string\n * value. If the expression evaluates to false or a non-empty string, the\n * validation is considered failed, and the message is rejected.\n *\n * @generated from field: optional string expression = 3;\n */\n expression: string;\n};\n\n/**\n * `Rule` represents a validation rule written in the Common Expression\n * Language (CEL) syntax. Each Rule includes a unique identifier, an\n * optional error message, and the CEL expression to evaluate. For more\n * information, [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message Foo {\n * option (buf.validate.message).cel = {\n * id: \"foo.bar\"\n * message: \"bar must be greater than 0\"\n * expression: \"this.bar > 0\"\n * };\n * int32 bar = 1;\n * }\n * ```\n *\n * @generated from message buf.validate.Rule\n */\nexport type RuleJson = {\n /**\n * `id` is a string that serves as a machine-readable name for this Rule.\n * It should be unique within its scope, which could be either a message or a field.\n *\n * @generated from field: optional string id = 1;\n */\n id?: string;\n\n /**\n * `message` is an optional field that provides a human-readable error message\n * for this Rule when the CEL expression evaluates to false. If a\n * non-empty message is provided, any strings resulting from the CEL\n * expression evaluation are ignored.\n *\n * @generated from field: optional string message = 2;\n */\n message?: string;\n\n /**\n * `expression` is the actual CEL expression that will be evaluated for\n * validation. This string must resolve to either a boolean or a string\n * value. If the expression evaluates to false or a non-empty string, the\n * validation is considered failed, and the message is rejected.\n *\n * @generated from field: optional string expression = 3;\n */\n expression?: string;\n};\n\n/**\n * Describes the message buf.validate.Rule.\n * Use `create(RuleSchema)` to create a new message.\n */\nexport const RuleSchema: GenMessage<Rule, {jsonType: RuleJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 0);\n\n/**\n * MessageRules represents validation rules that are applied to the entire message.\n * It includes disabling options and a list of Rule messages representing Common Expression Language (CEL) validation rules.\n *\n * @generated from message buf.validate.MessageRules\n */\nexport type MessageRules = Message<\"buf.validate.MessageRules\"> & {\n /**\n * `cel` is a repeated field of type Rule. Each Rule specifies a validation rule to be applied to this message.\n * These rules are written in Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n *\n * ```proto\n * message MyMessage {\n * // The field `foo` must be greater than 42.\n * option (buf.validate.message).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this.foo > 42\",\n * };\n * optional int32 foo = 1;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 3;\n */\n cel: Rule[];\n\n /**\n * `oneof` is a repeated field of type MessageOneofRule that specifies a list of fields\n * of which at most one can be present. If `required` is also specified, then exactly one\n * of the specified fields _must_ be present.\n *\n * This will enforce oneof-like constraints with a few features not provided by\n * actual Protobuf oneof declarations:\n * 1. Repeated and map fields are allowed in this validation. In a Protobuf oneof,\n * only scalar fields are allowed.\n * 2. Fields with implicit presence are allowed. In a Protobuf oneof, all member\n * fields have explicit presence. This means that, for the purpose of determining\n * how many fields are set, explicitly setting such a field to its zero value is\n * effectively the same as not setting it at all.\n * 3. This will always generate validation errors for a message unmarshalled from\n * serialized data that sets more than one field. With a Protobuf oneof, when\n * multiple fields are present in the serialized form, earlier values are usually\n * silently ignored when unmarshalling, with only the last field being set when\n * unmarshalling completes.\n *\n * Note that adding a field to a `oneof` will also set the IGNORE_IF_ZERO_VALUE on the fields. This means\n * only the field that is set will be validated and the unset fields are not validated according to the field rules.\n * This behavior can be overridden by setting `ignore` against a field.\n *\n * ```proto\n * message MyMessage {\n * // Only one of `field1` or `field2` _can_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field1\", \"field2\"] };\n * // Exactly one of `field3` or `field4` _must_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field3\", \"field4\"], required: true };\n * string field1 = 1;\n * bytes field2 = 2;\n * bool field3 = 3;\n * int32 field4 = 4;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.MessageOneofRule oneof = 4;\n */\n oneof: MessageOneofRule[];\n};\n\n/**\n * MessageRules represents validation rules that are applied to the entire message.\n * It includes disabling options and a list of Rule messages representing Common Expression Language (CEL) validation rules.\n *\n * @generated from message buf.validate.MessageRules\n */\nexport type MessageRulesJson = {\n /**\n * `cel` is a repeated field of type Rule. Each Rule specifies a validation rule to be applied to this message.\n * These rules are written in Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n *\n * ```proto\n * message MyMessage {\n * // The field `foo` must be greater than 42.\n * option (buf.validate.message).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this.foo > 42\",\n * };\n * optional int32 foo = 1;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 3;\n */\n cel?: RuleJson[];\n\n /**\n * `oneof` is a repeated field of type MessageOneofRule that specifies a list of fields\n * of which at most one can be present. If `required` is also specified, then exactly one\n * of the specified fields _must_ be present.\n *\n * This will enforce oneof-like constraints with a few features not provided by\n * actual Protobuf oneof declarations:\n * 1. Repeated and map fields are allowed in this validation. In a Protobuf oneof,\n * only scalar fields are allowed.\n * 2. Fields with implicit presence are allowed. In a Protobuf oneof, all member\n * fields have explicit presence. This means that, for the purpose of determining\n * how many fields are set, explicitly setting such a field to its zero value is\n * effectively the same as not setting it at all.\n * 3. This will always generate validation errors for a message unmarshalled from\n * serialized data that sets more than one field. With a Protobuf oneof, when\n * multiple fields are present in the serialized form, earlier values are usually\n * silently ignored when unmarshalling, with only the last field being set when\n * unmarshalling completes.\n *\n * Note that adding a field to a `oneof` will also set the IGNORE_IF_ZERO_VALUE on the fields. This means\n * only the field that is set will be validated and the unset fields are not validated according to the field rules.\n * This behavior can be overridden by setting `ignore` against a field.\n *\n * ```proto\n * message MyMessage {\n * // Only one of `field1` or `field2` _can_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field1\", \"field2\"] };\n * // Exactly one of `field3` or `field4` _must_ be present in this message.\n * option (buf.validate.message).oneof = { fields: [\"field3\", \"field4\"], required: true };\n * string field1 = 1;\n * bytes field2 = 2;\n * bool field3 = 3;\n * int32 field4 = 4;\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.MessageOneofRule oneof = 4;\n */\n oneof?: MessageOneofRuleJson[];\n};\n\n/**\n * Describes the message buf.validate.MessageRules.\n * Use `create(MessageRulesSchema)` to create a new message.\n */\nexport const MessageRulesSchema: GenMessage<MessageRules, {jsonType: MessageRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 1);\n\n/**\n * @generated from message buf.validate.MessageOneofRule\n */\nexport type MessageOneofRule = Message<\"buf.validate.MessageOneofRule\"> & {\n /**\n * A list of field names to include in the oneof. All field names must be\n * defined in the message. At least one field must be specified, and\n * duplicates are not permitted.\n *\n * @generated from field: repeated string fields = 1;\n */\n fields: string[];\n\n /**\n * If true, one of the fields specified _must_ be set.\n *\n * @generated from field: optional bool required = 2;\n */\n required: boolean;\n};\n\n/**\n * @generated from message buf.validate.MessageOneofRule\n */\nexport type MessageOneofRuleJson = {\n /**\n * A list of field names to include in the oneof. All field names must be\n * defined in the message. At least one field must be specified, and\n * duplicates are not permitted.\n *\n * @generated from field: repeated string fields = 1;\n */\n fields?: string[];\n\n /**\n * If true, one of the fields specified _must_ be set.\n *\n * @generated from field: optional bool required = 2;\n */\n required?: boolean;\n};\n\n/**\n * Describes the message buf.validate.MessageOneofRule.\n * Use `create(MessageOneofRuleSchema)` to create a new message.\n */\nexport const MessageOneofRuleSchema: GenMessage<MessageOneofRule, {jsonType: MessageOneofRuleJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 2);\n\n/**\n * The `OneofRules` message type enables you to manage rules for\n * oneof fields in your protobuf messages.\n *\n * @generated from message buf.validate.OneofRules\n */\nexport type OneofRules = Message<\"buf.validate.OneofRules\"> & {\n /**\n * If `required` is true, exactly one field of the oneof must be set. A\n * validation error is returned if no fields in the oneof are set. Further rules\n * should be placed on the fields themselves to ensure they are valid values,\n * such as `min_len` or `gt`.\n *\n * ```proto\n * message MyMessage {\n * oneof value {\n * // Either `a` or `b` must be set. If `a` is set, it must also be\n * // non-empty; whereas if `b` is set, it can still be an empty string.\n * option (buf.validate.oneof).required = true;\n * string a = 1 [(buf.validate.field).string.min_len = 1];\n * string b = 2;\n * }\n * }\n * ```\n *\n * @generated from field: optional bool required = 1;\n */\n required: boolean;\n};\n\n/**\n * The `OneofRules` message type enables you to manage rules for\n * oneof fields in your protobuf messages.\n *\n * @generated from message buf.validate.OneofRules\n */\nexport type OneofRulesJson = {\n /**\n * If `required` is true, exactly one field of the oneof must be set. A\n * validation error is returned if no fields in the oneof are set. Further rules\n * should be placed on the fields themselves to ensure they are valid values,\n * such as `min_len` or `gt`.\n *\n * ```proto\n * message MyMessage {\n * oneof value {\n * // Either `a` or `b` must be set. If `a` is set, it must also be\n * // non-empty; whereas if `b` is set, it can still be an empty string.\n * option (buf.validate.oneof).required = true;\n * string a = 1 [(buf.validate.field).string.min_len = 1];\n * string b = 2;\n * }\n * }\n * ```\n *\n * @generated from field: optional bool required = 1;\n */\n required?: boolean;\n};\n\n/**\n * Describes the message buf.validate.OneofRules.\n * Use `create(OneofRulesSchema)` to create a new message.\n */\nexport const OneofRulesSchema: GenMessage<OneofRules, {jsonType: OneofRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 3);\n\n/**\n * FieldRules encapsulates the rules for each type of field. Depending on\n * the field, the correct set should be used to ensure proper validations.\n *\n * @generated from message buf.validate.FieldRules\n */\nexport type FieldRules = Message<\"buf.validate.FieldRules\"> & {\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.field).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 23;\n */\n cel: Rule[];\n\n /**\n * If `required` is true, the field must be set. A validation error is returned\n * if the field is not set.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithPresence {\n * // Requires any string to be set, including the empty string.\n * optional string link = 1 [\n * (buf.validate.field).required = true\n * ];\n * // Requires true or false to be set.\n * optional bool disabled = 2 [\n * (buf.validate.field).required = true\n * ];\n * // Requires a message to be set, including the empty message.\n * SomeMessage msg = 4 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * All fields in the example above track presence. By default, Protovalidate\n * ignores rules on those fields if no value is set. `required` ensures that\n * the fields are set and valid.\n *\n * Fields that don't track presence are always validated by Protovalidate,\n * whether they are set or not. It is not necessary to add `required`. It\n * can be added to indicate that the field cannot be the zero value.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithoutPresence {\n * // `string.email` always applies, even to an empty string.\n * string link = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * // `repeated.min_items` always applies, even to an empty list.\n * repeated string labels = 2 [\n * (buf.validate.field).repeated.min_items = 1\n * ];\n * // `required`, for fields that don't track presence, indicates\n * // the value of the field can't be the zero value.\n * int32 zero_value_not_allowed = 3 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * To learn which fields track presence, see the\n * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat).\n *\n * Note: While field rules can be applied to repeated items, map keys, and map\n * values, the elements are always considered to be set. Consequently,\n * specifying `repeated.items.required` is redundant.\n *\n * @generated from field: optional bool required = 25;\n */\n required: boolean;\n\n /**\n * Ignore validation rules on the field if its value matches the specified\n * criteria. See the `Ignore` enum for details.\n *\n * ```proto\n * message UpdateRequest {\n * // The uri rule only applies if the field is not an empty string.\n * string url = 1 [\n * (buf.validate.field).ignore = IGNORE_IF_ZERO_VALUE,\n * (buf.validate.field).string.uri = true\n * ];\n * }\n * ```\n *\n * @generated from field: optional buf.validate.Ignore ignore = 27;\n */\n ignore: Ignore;\n\n /**\n * @generated from oneof buf.validate.FieldRules.type\n */\n type: {\n /**\n * Scalar Field Types\n *\n * @generated from field: buf.validate.FloatRules float = 1;\n */\n value: FloatRules;\n case: \"float\";\n } | {\n /**\n * @generated from field: buf.validate.DoubleRules double = 2;\n */\n value: DoubleRules;\n case: \"double\";\n } | {\n /**\n * @generated from field: buf.validate.Int32Rules int32 = 3;\n */\n value: Int32Rules;\n case: \"int32\";\n } | {\n /**\n * @generated from field: buf.validate.Int64Rules int64 = 4;\n */\n value: Int64Rules;\n case: \"int64\";\n } | {\n /**\n * @generated from field: buf.validate.UInt32Rules uint32 = 5;\n */\n value: UInt32Rules;\n case: \"uint32\";\n } | {\n /**\n * @generated from field: buf.validate.UInt64Rules uint64 = 6;\n */\n value: UInt64Rules;\n case: \"uint64\";\n } | {\n /**\n * @generated from field: buf.validate.SInt32Rules sint32 = 7;\n */\n value: SInt32Rules;\n case: \"sint32\";\n } | {\n /**\n * @generated from field: buf.validate.SInt64Rules sint64 = 8;\n */\n value: SInt64Rules;\n case: \"sint64\";\n } | {\n /**\n * @generated from field: buf.validate.Fixed32Rules fixed32 = 9;\n */\n value: Fixed32Rules;\n case: \"fixed32\";\n } | {\n /**\n * @generated from field: buf.validate.Fixed64Rules fixed64 = 10;\n */\n value: Fixed64Rules;\n case: \"fixed64\";\n } | {\n /**\n * @generated from field: buf.validate.SFixed32Rules sfixed32 = 11;\n */\n value: SFixed32Rules;\n case: \"sfixed32\";\n } | {\n /**\n * @generated from field: buf.validate.SFixed64Rules sfixed64 = 12;\n */\n value: SFixed64Rules;\n case: \"sfixed64\";\n } | {\n /**\n * @generated from field: buf.validate.BoolRules bool = 13;\n */\n value: BoolRules;\n case: \"bool\";\n } | {\n /**\n * @generated from field: buf.validate.StringRules string = 14;\n */\n value: StringRules;\n case: \"string\";\n } | {\n /**\n * @generated from field: buf.validate.BytesRules bytes = 15;\n */\n value: BytesRules;\n case: \"bytes\";\n } | {\n /**\n * Complex Field Types\n *\n * @generated from field: buf.validate.EnumRules enum = 16;\n */\n value: EnumRules;\n case: \"enum\";\n } | {\n /**\n * @generated from field: buf.validate.RepeatedRules repeated = 18;\n */\n value: RepeatedRules;\n case: \"repeated\";\n } | {\n /**\n * @generated from field: buf.validate.MapRules map = 19;\n */\n value: MapRules;\n case: \"map\";\n } | {\n /**\n * Well-Known Field Types\n *\n * @generated from field: buf.validate.AnyRules any = 20;\n */\n value: AnyRules;\n case: \"any\";\n } | {\n /**\n * @generated from field: buf.validate.DurationRules duration = 21;\n */\n value: DurationRules;\n case: \"duration\";\n } | {\n /**\n * @generated from field: buf.validate.TimestampRules timestamp = 22;\n */\n value: TimestampRules;\n case: \"timestamp\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * FieldRules encapsulates the rules for each type of field. Depending on\n * the field, the correct set should be used to ensure proper validations.\n *\n * @generated from message buf.validate.FieldRules\n */\nexport type FieldRulesJson = {\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/custom-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.field).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 23;\n */\n cel?: RuleJson[];\n\n /**\n * If `required` is true, the field must be set. A validation error is returned\n * if the field is not set.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithPresence {\n * // Requires any string to be set, including the empty string.\n * optional string link = 1 [\n * (buf.validate.field).required = true\n * ];\n * // Requires true or false to be set.\n * optional bool disabled = 2 [\n * (buf.validate.field).required = true\n * ];\n * // Requires a message to be set, including the empty message.\n * SomeMessage msg = 4 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * All fields in the example above track presence. By default, Protovalidate\n * ignores rules on those fields if no value is set. `required` ensures that\n * the fields are set and valid.\n *\n * Fields that don't track presence are always validated by Protovalidate,\n * whether they are set or not. It is not necessary to add `required`. It\n * can be added to indicate that the field cannot be the zero value.\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message FieldsWithoutPresence {\n * // `string.email` always applies, even to an empty string.\n * string link = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * // `repeated.min_items` always applies, even to an empty list.\n * repeated string labels = 2 [\n * (buf.validate.field).repeated.min_items = 1\n * ];\n * // `required`, for fields that don't track presence, indicates\n * // the value of the field can't be the zero value.\n * int32 zero_value_not_allowed = 3 [\n * (buf.validate.field).required = true\n * ];\n * }\n * ```\n *\n * To learn which fields track presence, see the\n * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat).\n *\n * Note: While field rules can be applied to repeated items, map keys, and map\n * values, the elements are always considered to be set. Consequently,\n * specifying `repeated.items.required` is redundant.\n *\n * @generated from field: optional bool required = 25;\n */\n required?: boolean;\n\n /**\n * Ignore validation rules on the field if its value matches the specified\n * criteria. See the `Ignore` enum for details.\n *\n * ```proto\n * message UpdateRequest {\n * // The uri rule only applies if the field is not an empty string.\n * string url = 1 [\n * (buf.validate.field).ignore = IGNORE_IF_ZERO_VALUE,\n * (buf.validate.field).string.uri = true\n * ];\n * }\n * ```\n *\n * @generated from field: optional buf.validate.Ignore ignore = 27;\n */\n ignore?: IgnoreJson;\n\n /**\n * Scalar Field Types\n *\n * @generated from field: buf.validate.FloatRules float = 1;\n */\n float?: FloatRulesJson;\n\n /**\n * @generated from field: buf.validate.DoubleRules double = 2;\n */\n double?: DoubleRulesJson;\n\n /**\n * @generated from field: buf.validate.Int32Rules int32 = 3;\n */\n int32?: Int32RulesJson;\n\n /**\n * @generated from field: buf.validate.Int64Rules int64 = 4;\n */\n int64?: Int64RulesJson;\n\n /**\n * @generated from field: buf.validate.UInt32Rules uint32 = 5;\n */\n uint32?: UInt32RulesJson;\n\n /**\n * @generated from field: buf.validate.UInt64Rules uint64 = 6;\n */\n uint64?: UInt64RulesJson;\n\n /**\n * @generated from field: buf.validate.SInt32Rules sint32 = 7;\n */\n sint32?: SInt32RulesJson;\n\n /**\n * @generated from field: buf.validate.SInt64Rules sint64 = 8;\n */\n sint64?: SInt64RulesJson;\n\n /**\n * @generated from field: buf.validate.Fixed32Rules fixed32 = 9;\n */\n fixed32?: Fixed32RulesJson;\n\n /**\n * @generated from field: buf.validate.Fixed64Rules fixed64 = 10;\n */\n fixed64?: Fixed64RulesJson;\n\n /**\n * @generated from field: buf.validate.SFixed32Rules sfixed32 = 11;\n */\n sfixed32?: SFixed32RulesJson;\n\n /**\n * @generated from field: buf.validate.SFixed64Rules sfixed64 = 12;\n */\n sfixed64?: SFixed64RulesJson;\n\n /**\n * @generated from field: buf.validate.BoolRules bool = 13;\n */\n bool?: BoolRulesJson;\n\n /**\n * @generated from field: buf.validate.StringRules string = 14;\n */\n string?: StringRulesJson;\n\n /**\n * @generated from field: buf.validate.BytesRules bytes = 15;\n */\n bytes?: BytesRulesJson;\n\n /**\n * Complex Field Types\n *\n * @generated from field: buf.validate.EnumRules enum = 16;\n */\n enum?: EnumRulesJson;\n\n /**\n * @generated from field: buf.validate.RepeatedRules repeated = 18;\n */\n repeated?: RepeatedRulesJson;\n\n /**\n * @generated from field: buf.validate.MapRules map = 19;\n */\n map?: MapRulesJson;\n\n /**\n * Well-Known Field Types\n *\n * @generated from field: buf.validate.AnyRules any = 20;\n */\n any?: AnyRulesJson;\n\n /**\n * @generated from field: buf.validate.DurationRules duration = 21;\n */\n duration?: DurationRulesJson;\n\n /**\n * @generated from field: buf.validate.TimestampRules timestamp = 22;\n */\n timestamp?: TimestampRulesJson;\n};\n\n/**\n * Describes the message buf.validate.FieldRules.\n * Use `create(FieldRulesSchema)` to create a new message.\n */\nexport const FieldRulesSchema: GenMessage<FieldRules, {jsonType: FieldRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 4);\n\n/**\n * PredefinedRules are custom rules that can be re-used with\n * multiple fields.\n *\n * @generated from message buf.validate.PredefinedRules\n */\nexport type PredefinedRules = Message<\"buf.validate.PredefinedRules\"> & {\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/predefined-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.predefined).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 1;\n */\n cel: Rule[];\n};\n\n/**\n * PredefinedRules are custom rules that can be re-used with\n * multiple fields.\n *\n * @generated from message buf.validate.PredefinedRules\n */\nexport type PredefinedRulesJson = {\n /**\n * `cel` is a repeated field used to represent a textual expression\n * in the Common Expression Language (CEL) syntax. For more information,\n * [see our documentation](https://buf.build/docs/protovalidate/schemas/predefined-rules/).\n *\n * ```proto\n * message MyMessage {\n * // The field `value` must be greater than 42.\n * optional int32 value = 1 [(buf.validate.predefined).cel = {\n * id: \"my_message.value\",\n * message: \"value must be greater than 42\",\n * expression: \"this > 42\",\n * }];\n * }\n * ```\n *\n * @generated from field: repeated buf.validate.Rule cel = 1;\n */\n cel?: RuleJson[];\n};\n\n/**\n * Describes the message buf.validate.PredefinedRules.\n * Use `create(PredefinedRulesSchema)` to create a new message.\n */\nexport const PredefinedRulesSchema: GenMessage<PredefinedRules, {jsonType: PredefinedRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 5);\n\n/**\n * FloatRules describes the rules applied to `float` values. These\n * rules may also be applied to the `google.protobuf.FloatValue` Well-Known-Type.\n *\n * @generated from message buf.validate.FloatRules\n */\nexport type FloatRules = Message<\"buf.validate.FloatRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must equal 42.0\n * float value = 1 [(buf.validate.field).float.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional float const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.FloatRules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be less than 10.0\n * float value = 1 [(buf.validate.field).float.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: float lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be less than or equal to 10.0\n * float value = 1 [(buf.validate.field).float.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: float lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.FloatRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be greater than 5.0 [float.gt]\n * float value = 1 [(buf.validate.field).float.gt = 5.0];\n *\n * // value must be greater than 5 and less than 10.0 [float.gt_lt]\n * float other_value = 2 [(buf.validate.field).float = { gt: 5.0, lt: 10.0 }];\n *\n * // value must be greater than 10 or less than 5.0 [float.gt_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be greater than or equal to 5.0 [float.gte]\n * float value = 1 [(buf.validate.field).float.gte = 5.0];\n *\n * // value must be greater than or equal to 5.0 and less than 10.0 [float.gte_lt]\n * float other_value = 2 [(buf.validate.field).float = { gte: 5.0, lt: 10.0 }];\n *\n * // value must be greater than or equal to 10.0 or less than 5.0 [float.gte_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float in = 6;\n */\n in: number[];\n\n /**\n * `in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must not be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float not_in = 7;\n */\n notIn: number[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFloat {\n * float value = 1 [\n * (buf.validate.field).float.example = 1.0,\n * (buf.validate.field).float.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated float example = 9;\n */\n example: number[];\n};\n\n/**\n * FloatRules describes the rules applied to `float` values. These\n * rules may also be applied to the `google.protobuf.FloatValue` Well-Known-Type.\n *\n * @generated from message buf.validate.FloatRules\n */\nexport type FloatRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must equal 42.0\n * float value = 1 [(buf.validate.field).float.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional float const = 1;\n */\n const?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be less than 10.0\n * float value = 1 [(buf.validate.field).float.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: float lt = 2;\n */\n lt?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be less than or equal to 10.0\n * float value = 1 [(buf.validate.field).float.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: float lte = 3;\n */\n lte?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be greater than 5.0 [float.gt]\n * float value = 1 [(buf.validate.field).float.gt = 5.0];\n *\n * // value must be greater than 5 and less than 10.0 [float.gt_lt]\n * float other_value = 2 [(buf.validate.field).float = { gt: 5.0, lt: 10.0 }];\n *\n * // value must be greater than 10 or less than 5.0 [float.gt_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gt = 4;\n */\n gt?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be greater than or equal to 5.0 [float.gte]\n * float value = 1 [(buf.validate.field).float.gte = 5.0];\n *\n * // value must be greater than or equal to 5.0 and less than 10.0 [float.gte_lt]\n * float other_value = 2 [(buf.validate.field).float = { gte: 5.0, lt: 10.0 }];\n *\n * // value must be greater than or equal to 10.0 or less than 5.0 [float.gte_lt_exclusive]\n * float another_value = 3 [(buf.validate.field).float = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: float gte = 5;\n */\n gte?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float in = 6;\n */\n in?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n\n /**\n * `in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFloat {\n * // value must not be in list [1.0, 2.0, 3.0]\n * float value = 1 [(buf.validate.field).float = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated float not_in = 7;\n */\n notIn?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFloat {\n * float value = 1 [\n * (buf.validate.field).float.example = 1.0,\n * (buf.validate.field).float.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated float example = 9;\n */\n example?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n};\n\n/**\n * Describes the message buf.validate.FloatRules.\n * Use `create(FloatRulesSchema)` to create a new message.\n */\nexport const FloatRulesSchema: GenMessage<FloatRules, {jsonType: FloatRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 6);\n\n/**\n * DoubleRules describes the rules applied to `double` values. These\n * rules may also be applied to the `google.protobuf.DoubleValue` Well-Known-Type.\n *\n * @generated from message buf.validate.DoubleRules\n */\nexport type DoubleRules = Message<\"buf.validate.DoubleRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must equal 42.0\n * double value = 1 [(buf.validate.field).double.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional double const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.DoubleRules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be less than 10.0\n * double value = 1 [(buf.validate.field).double.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: double lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified value\n * (field <= value). If the field value is greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be less than or equal to 10.0\n * double value = 1 [(buf.validate.field).double.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: double lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.DoubleRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or `lte`,\n * the range is reversed, and the field value must be outside the specified\n * range. If the field value doesn't meet the required conditions, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be greater than 5.0 [double.gt]\n * double value = 1 [(buf.validate.field).double.gt = 5.0];\n *\n * // value must be greater than 5 and less than 10.0 [double.gt_lt]\n * double other_value = 2 [(buf.validate.field).double = { gt: 5.0, lt: 10.0 }];\n *\n * // value must be greater than 10 or less than 5.0 [double.gt_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be greater than or equal to 5.0 [double.gte]\n * double value = 1 [(buf.validate.field).double.gte = 5.0];\n *\n * // value must be greater than or equal to 5.0 and less than 10.0 [double.gte_lt]\n * double other_value = 2 [(buf.validate.field).double = { gte: 5.0, lt: 10.0 }];\n *\n * // value must be greater than or equal to 10.0 or less than 5.0 [double.gte_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must not be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double not_in = 7;\n */\n notIn: number[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDouble {\n * double value = 1 [\n * (buf.validate.field).double.example = 1.0,\n * (buf.validate.field).double.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated double example = 9;\n */\n example: number[];\n};\n\n/**\n * DoubleRules describes the rules applied to `double` values. These\n * rules may also be applied to the `google.protobuf.DoubleValue` Well-Known-Type.\n *\n * @generated from message buf.validate.DoubleRules\n */\nexport type DoubleRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must equal 42.0\n * double value = 1 [(buf.validate.field).double.const = 42.0];\n * }\n * ```\n *\n * @generated from field: optional double const = 1;\n */\n const?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be less than 10.0\n * double value = 1 [(buf.validate.field).double.lt = 10.0];\n * }\n * ```\n *\n * @generated from field: double lt = 2;\n */\n lt?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `lte` requires the field value to be less than or equal to the specified value\n * (field <= value). If the field value is greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be less than or equal to 10.0\n * double value = 1 [(buf.validate.field).double.lte = 10.0];\n * }\n * ```\n *\n * @generated from field: double lte = 3;\n */\n lte?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or `lte`,\n * the range is reversed, and the field value must be outside the specified\n * range. If the field value doesn't meet the required conditions, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be greater than 5.0 [double.gt]\n * double value = 1 [(buf.validate.field).double.gt = 5.0];\n *\n * // value must be greater than 5 and less than 10.0 [double.gt_lt]\n * double other_value = 2 [(buf.validate.field).double = { gt: 5.0, lt: 10.0 }];\n *\n * // value must be greater than 10 or less than 5.0 [double.gt_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gt: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gt = 4;\n */\n gt?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be greater than or equal to 5.0 [double.gte]\n * double value = 1 [(buf.validate.field).double.gte = 5.0];\n *\n * // value must be greater than or equal to 5.0 and less than 10.0 [double.gte_lt]\n * double other_value = 2 [(buf.validate.field).double = { gte: 5.0, lt: 10.0 }];\n *\n * // value must be greater than or equal to 10.0 or less than 5.0 [double.gte_lt_exclusive]\n * double another_value = 3 [(buf.validate.field).double = { gte: 10.0, lt: 5.0 }];\n * }\n * ```\n *\n * @generated from field: double gte = 5;\n */\n gte?: number | \"NaN\" | \"Infinity\" | \"-Infinity\";\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyDouble {\n * // value must be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double in = 6;\n */\n in?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyDouble {\n * // value must not be in list [1.0, 2.0, 3.0]\n * double value = 1 [(buf.validate.field).double = { not_in: [1.0, 2.0, 3.0] }];\n * }\n * ```\n *\n * @generated from field: repeated double not_in = 7;\n */\n notIn?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n\n /**\n * `finite` requires the field value to be finite. If the field value is\n * infinite or NaN, an error message is generated.\n *\n * @generated from field: optional bool finite = 8;\n */\n finite?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDouble {\n * double value = 1 [\n * (buf.validate.field).double.example = 1.0,\n * (buf.validate.field).double.example = inf\n * ];\n * }\n * ```\n *\n * @generated from field: repeated double example = 9;\n */\n example?: (number | \"NaN\" | \"Infinity\" | \"-Infinity\")[];\n};\n\n/**\n * Describes the message buf.validate.DoubleRules.\n * Use `create(DoubleRulesSchema)` to create a new message.\n */\nexport const DoubleRulesSchema: GenMessage<DoubleRules, {jsonType: DoubleRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 7);\n\n/**\n * Int32Rules describes the rules applied to `int32` values. These\n * rules may also be applied to the `google.protobuf.Int32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int32Rules\n */\nexport type Int32Rules = Message<\"buf.validate.Int32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must equal 42\n * int32 value = 1 [(buf.validate.field).int32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.Int32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be less than 10\n * int32 value = 1 [(buf.validate.field).int32.lt = 10];\n * }\n * ```\n *\n * @generated from field: int32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be less than or equal to 10\n * int32 value = 1 [(buf.validate.field).int32.lte = 10];\n * }\n * ```\n *\n * @generated from field: int32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Int32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be greater than 5 [int32.gt]\n * int32 value = 1 [(buf.validate.field).int32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [int32.gt_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [int32.gt_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified value\n * (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be greater than or equal to 5 [int32.gte]\n * int32 value = 1 [(buf.validate.field).int32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [int32.gte_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [int32.gte_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must not be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt32 {\n * int32 value = 1 [\n * (buf.validate.field).int32.example = 1,\n * (buf.validate.field).int32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 8;\n */\n example: number[];\n};\n\n/**\n * Int32Rules describes the rules applied to `int32` values. These\n * rules may also be applied to the `google.protobuf.Int32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int32Rules\n */\nexport type Int32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must equal 42\n * int32 value = 1 [(buf.validate.field).int32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be less than 10\n * int32 value = 1 [(buf.validate.field).int32.lt = 10];\n * }\n * ```\n *\n * @generated from field: int32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be less than or equal to 10\n * int32 value = 1 [(buf.validate.field).int32.lte = 10];\n * }\n * ```\n *\n * @generated from field: int32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be greater than 5 [int32.gt]\n * int32 value = 1 [(buf.validate.field).int32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [int32.gt_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [int32.gt_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified value\n * (exclusive). If the value of `gte` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be greater than or equal to 5 [int32.gte]\n * int32 value = 1 [(buf.validate.field).int32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [int32.gte_lt]\n * int32 other_value = 2 [(buf.validate.field).int32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [int32.gte_lt_exclusive]\n * int32 another_value = 3 [(buf.validate.field).int32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyInt32 {\n * // value must not be in list [1, 2, 3]\n * int32 value = 1 [(buf.validate.field).int32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt32 {\n * int32 value = 1 [\n * (buf.validate.field).int32.example = 1,\n * (buf.validate.field).int32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.Int32Rules.\n * Use `create(Int32RulesSchema)` to create a new message.\n */\nexport const Int32RulesSchema: GenMessage<Int32Rules, {jsonType: Int32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 8);\n\n/**\n * Int64Rules describes the rules applied to `int64` values. These\n * rules may also be applied to the `google.protobuf.Int64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int64Rules\n */\nexport type Int64Rules = Message<\"buf.validate.Int64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must equal 42\n * int64 value = 1 [(buf.validate.field).int64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.Int64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be less than 10\n * int64 value = 1 [(buf.validate.field).int64.lt = 10];\n * }\n * ```\n *\n * @generated from field: int64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be less than or equal to 10\n * int64 value = 1 [(buf.validate.field).int64.lte = 10];\n * }\n * ```\n *\n * @generated from field: int64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Int64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be greater than 5 [int64.gt]\n * int64 value = 1 [(buf.validate.field).int64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [int64.gt_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [int64.gt_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be greater than or equal to 5 [int64.gte]\n * int64 value = 1 [(buf.validate.field).int64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [int64.gte_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [int64.gte_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must not be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt64 {\n * int64 value = 1 [\n * (buf.validate.field).int64.example = 1,\n * (buf.validate.field).int64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int64 example = 9;\n */\n example: bigint[];\n};\n\n/**\n * Int64Rules describes the rules applied to `int64` values. These\n * rules may also be applied to the `google.protobuf.Int64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.Int64Rules\n */\nexport type Int64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must equal 42\n * int64 value = 1 [(buf.validate.field).int64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional int64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be less than 10\n * int64 value = 1 [(buf.validate.field).int64.lt = 10];\n * }\n * ```\n *\n * @generated from field: int64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be less than or equal to 10\n * int64 value = 1 [(buf.validate.field).int64.lte = 10];\n * }\n * ```\n *\n * @generated from field: int64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be greater than 5 [int64.gt]\n * int64 value = 1 [(buf.validate.field).int64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [int64.gt_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [int64.gt_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be greater than or equal to 5 [int64.gte]\n * int64 value = 1 [(buf.validate.field).int64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [int64.gte_lt]\n * int64 other_value = 2 [(buf.validate.field).int64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [int64.gte_lt_exclusive]\n * int64 another_value = 3 [(buf.validate.field).int64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: int64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyInt64 {\n * // value must not be in list [1, 2, 3]\n * int64 value = 1 [(buf.validate.field).int64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated int64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyInt64 {\n * int64 value = 1 [\n * (buf.validate.field).int64.example = 1,\n * (buf.validate.field).int64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated int64 example = 9;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.Int64Rules.\n * Use `create(Int64RulesSchema)` to create a new message.\n */\nexport const Int64RulesSchema: GenMessage<Int64Rules, {jsonType: Int64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 9);\n\n/**\n * UInt32Rules describes the rules applied to `uint32` values. These\n * rules may also be applied to the `google.protobuf.UInt32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt32Rules\n */\nexport type UInt32Rules = Message<\"buf.validate.UInt32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must equal 42\n * uint32 value = 1 [(buf.validate.field).uint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.UInt32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be less than 10\n * uint32 value = 1 [(buf.validate.field).uint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be less than or equal to 10\n * uint32 value = 1 [(buf.validate.field).uint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.UInt32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be greater than 5 [uint32.gt]\n * uint32 value = 1 [(buf.validate.field).uint32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [uint32.gt_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [uint32.gt_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be greater than or equal to 5 [uint32.gte]\n * uint32 value = 1 [(buf.validate.field).uint32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [uint32.gte_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [uint32.gte_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must not be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt32 {\n * uint32 value = 1 [\n * (buf.validate.field).uint32.example = 1,\n * (buf.validate.field).uint32.example = 10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint32 example = 8;\n */\n example: number[];\n};\n\n/**\n * UInt32Rules describes the rules applied to `uint32` values. These\n * rules may also be applied to the `google.protobuf.UInt32Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt32Rules\n */\nexport type UInt32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must equal 42\n * uint32 value = 1 [(buf.validate.field).uint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be less than 10\n * uint32 value = 1 [(buf.validate.field).uint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be less than or equal to 10\n * uint32 value = 1 [(buf.validate.field).uint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be greater than 5 [uint32.gt]\n * uint32 value = 1 [(buf.validate.field).uint32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [uint32.gt_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [uint32.gt_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be greater than or equal to 5 [uint32.gte]\n * uint32 value = 1 [(buf.validate.field).uint32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [uint32.gte_lt]\n * uint32 other_value = 2 [(buf.validate.field).uint32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [uint32.gte_lt_exclusive]\n * uint32 another_value = 3 [(buf.validate.field).uint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt32 {\n * // value must not be in list [1, 2, 3]\n * uint32 value = 1 [(buf.validate.field).uint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt32 {\n * uint32 value = 1 [\n * (buf.validate.field).uint32.example = 1,\n * (buf.validate.field).uint32.example = 10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.UInt32Rules.\n * Use `create(UInt32RulesSchema)` to create a new message.\n */\nexport const UInt32RulesSchema: GenMessage<UInt32Rules, {jsonType: UInt32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 10);\n\n/**\n * UInt64Rules describes the rules applied to `uint64` values. These\n * rules may also be applied to the `google.protobuf.UInt64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt64Rules\n */\nexport type UInt64Rules = Message<\"buf.validate.UInt64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must equal 42\n * uint64 value = 1 [(buf.validate.field).uint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.UInt64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be less than 10\n * uint64 value = 1 [(buf.validate.field).uint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be less than or equal to 10\n * uint64 value = 1 [(buf.validate.field).uint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.UInt64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be greater than 5 [uint64.gt]\n * uint64 value = 1 [(buf.validate.field).uint64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [uint64.gt_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [uint64.gt_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be greater than or equal to 5 [uint64.gte]\n * uint64 value = 1 [(buf.validate.field).uint64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [uint64.gte_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [uint64.gte_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must not be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt64 {\n * uint64 value = 1 [\n * (buf.validate.field).uint64.example = 1,\n * (buf.validate.field).uint64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * UInt64Rules describes the rules applied to `uint64` values. These\n * rules may also be applied to the `google.protobuf.UInt64Value` Well-Known-Type.\n *\n * @generated from message buf.validate.UInt64Rules\n */\nexport type UInt64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must equal 42\n * uint64 value = 1 [(buf.validate.field).uint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional uint64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be less than 10\n * uint64 value = 1 [(buf.validate.field).uint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be less than or equal to 10\n * uint64 value = 1 [(buf.validate.field).uint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: uint64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be greater than 5 [uint64.gt]\n * uint64 value = 1 [(buf.validate.field).uint64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [uint64.gt_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [uint64.gt_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be greater than or equal to 5 [uint64.gte]\n * uint64 value = 1 [(buf.validate.field).uint64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [uint64.gte_lt]\n * uint64 other_value = 2 [(buf.validate.field).uint64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [uint64.gte_lt_exclusive]\n * uint64 another_value = 3 [(buf.validate.field).uint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: uint64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyUInt64 {\n * // value must not be in list [1, 2, 3]\n * uint64 value = 1 [(buf.validate.field).uint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated uint64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyUInt64 {\n * uint64 value = 1 [\n * (buf.validate.field).uint64.example = 1,\n * (buf.validate.field).uint64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated uint64 example = 8;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.UInt64Rules.\n * Use `create(UInt64RulesSchema)` to create a new message.\n */\nexport const UInt64RulesSchema: GenMessage<UInt64Rules, {jsonType: UInt64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 11);\n\n/**\n * SInt32Rules describes the rules applied to `sint32` values.\n *\n * @generated from message buf.validate.SInt32Rules\n */\nexport type SInt32Rules = Message<\"buf.validate.SInt32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must equal 42\n * sint32 value = 1 [(buf.validate.field).sint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.SInt32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be less than 10\n * sint32 value = 1 [(buf.validate.field).sint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be less than or equal to 10\n * sint32 value = 1 [(buf.validate.field).sint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SInt32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be greater than 5 [sint32.gt]\n * sint32 value = 1 [(buf.validate.field).sint32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sint32.gt_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sint32.gt_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be greater than or equal to 5 [sint32.gte]\n * sint32 value = 1 [(buf.validate.field).sint32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sint32.gte_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sint32.gte_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must not be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt32 {\n * sint32 value = 1 [\n * (buf.validate.field).sint32.example = 1,\n * (buf.validate.field).sint32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint32 example = 8;\n */\n example: number[];\n};\n\n/**\n * SInt32Rules describes the rules applied to `sint32` values.\n *\n * @generated from message buf.validate.SInt32Rules\n */\nexport type SInt32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must equal 42\n * sint32 value = 1 [(buf.validate.field).sint32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be less than 10\n * sint32 value = 1 [(buf.validate.field).sint32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be less than or equal to 10\n * sint32 value = 1 [(buf.validate.field).sint32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be greater than 5 [sint32.gt]\n * sint32 value = 1 [(buf.validate.field).sint32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sint32.gt_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sint32.gt_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be greater than or equal to 5 [sint32.gte]\n * sint32 value = 1 [(buf.validate.field).sint32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sint32.gte_lt]\n * sint32 other_value = 2 [(buf.validate.field).sint32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sint32.gte_lt_exclusive]\n * sint32 another_value = 3 [(buf.validate.field).sint32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt32 {\n * // value must not be in list [1, 2, 3]\n * sint32 value = 1 [(buf.validate.field).sint32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt32 {\n * sint32 value = 1 [\n * (buf.validate.field).sint32.example = 1,\n * (buf.validate.field).sint32.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.SInt32Rules.\n * Use `create(SInt32RulesSchema)` to create a new message.\n */\nexport const SInt32RulesSchema: GenMessage<SInt32Rules, {jsonType: SInt32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 12);\n\n/**\n * SInt64Rules describes the rules applied to `sint64` values.\n *\n * @generated from message buf.validate.SInt64Rules\n */\nexport type SInt64Rules = Message<\"buf.validate.SInt64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must equal 42\n * sint64 value = 1 [(buf.validate.field).sint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.SInt64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be less than 10\n * sint64 value = 1 [(buf.validate.field).sint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be less than or equal to 10\n * sint64 value = 1 [(buf.validate.field).sint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SInt64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be greater than 5 [sint64.gt]\n * sint64 value = 1 [(buf.validate.field).sint64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sint64.gt_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sint64.gt_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be greater than or equal to 5 [sint64.gte]\n * sint64 value = 1 [(buf.validate.field).sint64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sint64.gte_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sint64.gte_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must not be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt64 {\n * sint64 value = 1 [\n * (buf.validate.field).sint64.example = 1,\n * (buf.validate.field).sint64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * SInt64Rules describes the rules applied to `sint64` values.\n *\n * @generated from message buf.validate.SInt64Rules\n */\nexport type SInt64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must equal 42\n * sint64 value = 1 [(buf.validate.field).sint64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sint64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field\n * < value). If the field value is equal to or greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be less than 10\n * sint64 value = 1 [(buf.validate.field).sint64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be less than or equal to 10\n * sint64 value = 1 [(buf.validate.field).sint64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sint64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be greater than 5 [sint64.gt]\n * sint64 value = 1 [(buf.validate.field).sint64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sint64.gt_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sint64.gt_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be greater than or equal to 5 [sint64.gte]\n * sint64 value = 1 [(buf.validate.field).sint64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sint64.gte_lt]\n * sint64 other_value = 2 [(buf.validate.field).sint64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sint64.gte_lt_exclusive]\n * sint64 another_value = 3 [(buf.validate.field).sint64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sint64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySInt64 {\n * // value must not be in list [1, 2, 3]\n * sint64 value = 1 [(buf.validate.field).sint64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sint64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySInt64 {\n * sint64 value = 1 [\n * (buf.validate.field).sint64.example = 1,\n * (buf.validate.field).sint64.example = -10\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sint64 example = 8;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.SInt64Rules.\n * Use `create(SInt64RulesSchema)` to create a new message.\n */\nexport const SInt64RulesSchema: GenMessage<SInt64Rules, {jsonType: SInt64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 13);\n\n/**\n * Fixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.Fixed32Rules\n */\nexport type Fixed32Rules = Message<\"buf.validate.Fixed32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must equal 42\n * fixed32 value = 1 [(buf.validate.field).fixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.Fixed32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be less than 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be less than or equal to 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Fixed32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be greater than 5 [fixed32.gt]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [fixed32.gt_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [fixed32.gt_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be greater than or equal to 5 [fixed32.gte]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [fixed32.gte_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [fixed32.gte_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must not be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed32 {\n * fixed32 value = 1 [\n * (buf.validate.field).fixed32.example = 1,\n * (buf.validate.field).fixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 example = 8;\n */\n example: number[];\n};\n\n/**\n * Fixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.Fixed32Rules\n */\nexport type Fixed32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must equal 42\n * fixed32 value = 1 [(buf.validate.field).fixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be less than 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be less than or equal to 10\n * fixed32 value = 1 [(buf.validate.field).fixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be greater than 5 [fixed32.gt]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [fixed32.gt_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [fixed32.gt_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be greater than or equal to 5 [fixed32.gte]\n * fixed32 value = 1 [(buf.validate.field).fixed32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [fixed32.gte_lt]\n * fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [fixed32.gte_lt_exclusive]\n * fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message\n * is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed32 {\n * // value must not be in list [1, 2, 3]\n * fixed32 value = 1 [(buf.validate.field).fixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed32 {\n * fixed32 value = 1 [\n * (buf.validate.field).fixed32.example = 1,\n * (buf.validate.field).fixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.Fixed32Rules.\n * Use `create(Fixed32RulesSchema)` to create a new message.\n */\nexport const Fixed32RulesSchema: GenMessage<Fixed32Rules, {jsonType: Fixed32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 14);\n\n/**\n * Fixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.Fixed64Rules\n */\nexport type Fixed64Rules = Message<\"buf.validate.Fixed64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must equal 42\n * fixed64 value = 1 [(buf.validate.field).fixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.Fixed64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be less than 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be less than or equal to 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.Fixed64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be greater than 5 [fixed64.gt]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [fixed64.gt_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [fixed64.gt_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be greater than or equal to 5 [fixed64.gte]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [fixed64.gte_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [fixed64.gte_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must not be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed64 {\n * fixed64 value = 1 [\n * (buf.validate.field).fixed64.example = 1,\n * (buf.validate.field).fixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * Fixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.Fixed64Rules\n */\nexport type Fixed64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must equal 42\n * fixed64 value = 1 [(buf.validate.field).fixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional fixed64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be less than 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be less than or equal to 10\n * fixed64 value = 1 [(buf.validate.field).fixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: fixed64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be greater than 5 [fixed64.gt]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [fixed64.gt_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [fixed64.gt_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be greater than or equal to 5 [fixed64.gte]\n * fixed64 value = 1 [(buf.validate.field).fixed64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [fixed64.gte_lt]\n * fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [fixed64.gte_lt_exclusive]\n * fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: fixed64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyFixed64 {\n * // value must not be in list [1, 2, 3]\n * fixed64 value = 1 [(buf.validate.field).fixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyFixed64 {\n * fixed64 value = 1 [\n * (buf.validate.field).fixed64.example = 1,\n * (buf.validate.field).fixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated fixed64 example = 8;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.Fixed64Rules.\n * Use `create(Fixed64RulesSchema)` to create a new message.\n */\nexport const Fixed64RulesSchema: GenMessage<Fixed64Rules, {jsonType: Fixed64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 15);\n\n/**\n * SFixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.SFixed32Rules\n */\nexport type SFixed32Rules = Message<\"buf.validate.SFixed32Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must equal 42\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed32 const = 1;\n */\n const: number;\n\n /**\n * @generated from oneof buf.validate.SFixed32Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be less than 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lt = 2;\n */\n value: number;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be less than or equal to 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lte = 3;\n */\n value: number;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SFixed32Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be greater than 5 [sfixed32.gt]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sfixed32.gt_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sfixed32.gt_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gt = 4;\n */\n value: number;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be greater than or equal to 5 [sfixed32.gte]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sfixed32.gte_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sfixed32.gte_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gte = 5;\n */\n value: number;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 in = 6;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must not be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 not_in = 7;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed32 {\n * sfixed32 value = 1 [\n * (buf.validate.field).sfixed32.example = 1,\n * (buf.validate.field).sfixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 example = 8;\n */\n example: number[];\n};\n\n/**\n * SFixed32Rules describes the rules applied to `fixed32` values.\n *\n * @generated from message buf.validate.SFixed32Rules\n */\nexport type SFixed32RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must equal 42\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed32 const = 1;\n */\n const?: number;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be less than 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lt = 2;\n */\n lt?: number;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be less than or equal to 10\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed32 lte = 3;\n */\n lte?: number;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be greater than 5 [sfixed32.gt]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sfixed32.gt_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sfixed32.gt_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gt = 4;\n */\n gt?: number;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be greater than or equal to 5 [sfixed32.gte]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sfixed32.gte_lt]\n * sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sfixed32.gte_lt_exclusive]\n * sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed32 gte = 5;\n */\n gte?: number;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 in = 6;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed32 {\n * // value must not be in list [1, 2, 3]\n * sfixed32 value = 1 [(buf.validate.field).sfixed32 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 not_in = 7;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed32 {\n * sfixed32 value = 1 [\n * (buf.validate.field).sfixed32.example = 1,\n * (buf.validate.field).sfixed32.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed32 example = 8;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.SFixed32Rules.\n * Use `create(SFixed32RulesSchema)` to create a new message.\n */\nexport const SFixed32RulesSchema: GenMessage<SFixed32Rules, {jsonType: SFixed32RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 16);\n\n/**\n * SFixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.SFixed64Rules\n */\nexport type SFixed64Rules = Message<\"buf.validate.SFixed64Rules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must equal 42\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed64 const = 1;\n */\n const: bigint;\n\n /**\n * @generated from oneof buf.validate.SFixed64Rules.less_than\n */\n lessThan: {\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be less than 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lt = 2;\n */\n value: bigint;\n case: \"lt\";\n } | {\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be less than or equal to 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lte = 3;\n */\n value: bigint;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.SFixed64Rules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be greater than 5 [sfixed64.gt]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sfixed64.gt_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sfixed64.gt_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gt = 4;\n */\n value: bigint;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be greater than or equal to 5 [sfixed64.gte]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sfixed64.gte_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sfixed64.gte_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gte = 5;\n */\n value: bigint;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 in = 6;\n */\n in: bigint[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must not be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 not_in = 7;\n */\n notIn: bigint[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed64 {\n * sfixed64 value = 1 [\n * (buf.validate.field).sfixed64.example = 1,\n * (buf.validate.field).sfixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 example = 8;\n */\n example: bigint[];\n};\n\n/**\n * SFixed64Rules describes the rules applied to `fixed64` values.\n *\n * @generated from message buf.validate.SFixed64Rules\n */\nexport type SFixed64RulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must equal 42\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.const = 42];\n * }\n * ```\n *\n * @generated from field: optional sfixed64 const = 1;\n */\n const?: string;\n\n /**\n * `lt` requires the field value to be less than the specified value (field <\n * value). If the field value is equal to or greater than the specified value,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be less than 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lt = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lt = 2;\n */\n lt?: string;\n\n /**\n * `lte` requires the field value to be less than or equal to the specified\n * value (field <= value). If the field value is greater than the specified\n * value, an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be less than or equal to 10\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.lte = 10];\n * }\n * ```\n *\n * @generated from field: sfixed64 lte = 3;\n */\n lte?: string;\n\n /**\n * `gt` requires the field value to be greater than the specified value\n * (exclusive). If the value of `gt` is larger than a specified `lt` or\n * `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be greater than 5 [sfixed64.gt]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gt = 5];\n *\n * // value must be greater than 5 and less than 10 [sfixed64.gt_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gt: 5, lt: 10 }];\n *\n * // value must be greater than 10 or less than 5 [sfixed64.gt_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gt: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gt = 4;\n */\n gt?: string;\n\n /**\n * `gte` requires the field value to be greater than or equal to the specified\n * value (exclusive). If the value of `gte` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be greater than or equal to 5 [sfixed64.gte]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64.gte = 5];\n *\n * // value must be greater than or equal to 5 and less than 10 [sfixed64.gte_lt]\n * sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gte: 5, lt: 10 }];\n *\n * // value must be greater than or equal to 10 or less than 5 [sfixed64.gte_lt_exclusive]\n * sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gte: 10, lt: 5 }];\n * }\n * ```\n *\n * @generated from field: sfixed64 gte = 5;\n */\n gte?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified values.\n * If the field value isn't one of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 in = 6;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to not be equal to any of the specified\n * values. If the field value is one of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MySFixed64 {\n * // value must not be in list [1, 2, 3]\n * sfixed64 value = 1 [(buf.validate.field).sfixed64 = { not_in: [1, 2, 3] }];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 not_in = 7;\n */\n notIn?: string[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MySFixed64 {\n * sfixed64 value = 1 [\n * (buf.validate.field).sfixed64.example = 1,\n * (buf.validate.field).sfixed64.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated sfixed64 example = 8;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.SFixed64Rules.\n * Use `create(SFixed64RulesSchema)` to create a new message.\n */\nexport const SFixed64RulesSchema: GenMessage<SFixed64Rules, {jsonType: SFixed64RulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 17);\n\n/**\n * BoolRules describes the rules applied to `bool` values. These rules\n * may also be applied to the `google.protobuf.BoolValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BoolRules\n */\nexport type BoolRules = Message<\"buf.validate.BoolRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified boolean value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBool {\n * // value must equal true\n * bool value = 1 [(buf.validate.field).bool.const = true];\n * }\n * ```\n *\n * @generated from field: optional bool const = 1;\n */\n const: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBool {\n * bool value = 1 [\n * (buf.validate.field).bool.example = 1,\n * (buf.validate.field).bool.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bool example = 2;\n */\n example: boolean[];\n};\n\n/**\n * BoolRules describes the rules applied to `bool` values. These rules\n * may also be applied to the `google.protobuf.BoolValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BoolRules\n */\nexport type BoolRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified boolean value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBool {\n * // value must equal true\n * bool value = 1 [(buf.validate.field).bool.const = true];\n * }\n * ```\n *\n * @generated from field: optional bool const = 1;\n */\n const?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBool {\n * bool value = 1 [\n * (buf.validate.field).bool.example = 1,\n * (buf.validate.field).bool.example = 2\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bool example = 2;\n */\n example?: boolean[];\n};\n\n/**\n * Describes the message buf.validate.BoolRules.\n * Use `create(BoolRulesSchema)` to create a new message.\n */\nexport const BoolRulesSchema: GenMessage<BoolRules, {jsonType: BoolRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 18);\n\n/**\n * StringRules describes the rules applied to `string` values These\n * rules may also be applied to the `google.protobuf.StringValue` Well-Known-Type.\n *\n * @generated from message buf.validate.StringRules\n */\nexport type StringRules = Message<\"buf.validate.StringRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyString {\n * // value must equal `hello`\n * string value = 1 [(buf.validate.field).string.const = \"hello\"];\n * }\n * ```\n *\n * @generated from field: optional string const = 1;\n */\n const: string;\n\n /**\n * `len` dictates that the field value must have the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value does not meet the specified\n * length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 5 characters\n * string value = 1 [(buf.validate.field).string.len = 5];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 19;\n */\n len: bigint;\n\n /**\n * `min_len` specifies that the field value must have at least the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value contains fewer characters, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 3 characters\n * string value = 1 [(buf.validate.field).string.min_len = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen: bigint;\n\n /**\n * `max_len` specifies that the field value must have no more than the specified\n * number of characters (Unicode code points), which may differ from the\n * number of bytes in the string. If the field value contains more characters,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 10 characters\n * string value = 1 [(buf.validate.field).string.max_len = 10];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen: bigint;\n\n /**\n * `len_bytes` dictates that the field value must have the specified number of\n * bytes. If the field value does not match the specified length in bytes,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 6 bytes\n * string value = 1 [(buf.validate.field).string.len_bytes = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 len_bytes = 20;\n */\n lenBytes: bigint;\n\n /**\n * `min_bytes` specifies that the field value must have at least the specified\n * number of bytes. If the field value contains fewer bytes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 4 bytes\n * string value = 1 [(buf.validate.field).string.min_bytes = 4];\n * }\n *\n * ```\n *\n * @generated from field: optional uint64 min_bytes = 4;\n */\n minBytes: bigint;\n\n /**\n * `max_bytes` specifies that the field value must have no more than the\n * specified number of bytes. If the field value contains more bytes, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 8 bytes\n * string value = 1 [(buf.validate.field).string.max_bytes = 8];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_bytes = 5;\n */\n maxBytes: bigint;\n\n /**\n * `pattern` specifies that the field value must match the specified\n * regular expression (RE2 syntax), with the expression provided without any\n * delimiters. If the field value doesn't match the regular expression, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not match regex pattern `^[a-zA-Z]//$`\n * string value = 1 [(buf.validate.field).string.pattern = \"^[a-zA-Z]//$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 6;\n */\n pattern: string;\n\n /**\n * `prefix` specifies that the field value must have the\n * specified substring at the beginning of the string. If the field value\n * doesn't start with the specified prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value does not have prefix `pre`\n * string value = 1 [(buf.validate.field).string.prefix = \"pre\"];\n * }\n * ```\n *\n * @generated from field: optional string prefix = 7;\n */\n prefix: string;\n\n /**\n * `suffix` specifies that the field value must have the\n * specified substring at the end of the string. If the field value doesn't\n * end with the specified suffix, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not have suffix `post`\n * string value = 1 [(buf.validate.field).string.suffix = \"post\"];\n * }\n * ```\n *\n * @generated from field: optional string suffix = 8;\n */\n suffix: string;\n\n /**\n * `contains` specifies that the field value must have the\n * specified substring anywhere in the string. If the field value doesn't\n * contain the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not contain substring `inside`.\n * string value = 1 [(buf.validate.field).string.contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string contains = 9;\n */\n contains: string;\n\n /**\n * `not_contains` specifies that the field value must not have the\n * specified substring anywhere in the string. If the field value contains\n * the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value contains substring `inside`.\n * string value = 1 [(buf.validate.field).string.not_contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string not_contains = 23;\n */\n notContains: string;\n\n /**\n * `in` specifies that the field value must be equal to one of the specified\n * values. If the field value isn't one of the specified values, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be in list [\"apple\", \"banana\"]\n * string value = 1 [(buf.validate.field).string.in = \"apple\", (buf.validate.field).string.in = \"banana\"];\n * }\n * ```\n *\n * @generated from field: repeated string in = 10;\n */\n in: string[];\n\n /**\n * `not_in` specifies that the field value cannot be equal to any\n * of the specified values. If the field value is one of the specified values,\n * an error message will be generated.\n * ```proto\n * message MyString {\n * // value must not be in list [\"orange\", \"grape\"]\n * string value = 1 [(buf.validate.field).string.not_in = \"orange\", (buf.validate.field).string.not_in = \"grape\"];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 11;\n */\n notIn: string[];\n\n /**\n * `WellKnown` rules provide advanced rules against common string\n * patterns.\n *\n * @generated from oneof buf.validate.StringRules.well_known\n */\n wellKnown: {\n /**\n * `email` specifies that the field value must be a valid email address, for\n * example \"foo@example.com\".\n *\n * Conforms to the definition for a valid email address from the [HTML standard](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address).\n * Note that this standard willfully deviates from [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322),\n * which allows many unexpected forms of email addresses and will easily match\n * a typographical error.\n *\n * If the field value isn't a valid email address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid email address\n * string value = 1 [(buf.validate.field).string.email = true];\n * }\n * ```\n *\n * @generated from field: bool email = 12;\n */\n value: boolean;\n case: \"email\";\n } | {\n /**\n * `hostname` specifies that the field value must be a valid hostname, for\n * example \"foo.example.com\".\n *\n * A valid hostname follows the rules below:\n * - The name consists of one or more labels, separated by a dot (\".\").\n * - Each label can be 1 to 63 alphanumeric characters.\n * - A label can contain hyphens (\"-\"), but must not start or end with a hyphen.\n * - The right-most label must not be digits only.\n * - The name can have a trailing dot\u2014for example, \"foo.example.com.\".\n * - The name can be 253 characters at most, excluding the optional trailing dot.\n *\n * If the field value isn't a valid hostname, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid hostname\n * string value = 1 [(buf.validate.field).string.hostname = true];\n * }\n * ```\n *\n * @generated from field: bool hostname = 13;\n */\n value: boolean;\n case: \"hostname\";\n } | {\n /**\n * `ip` specifies that the field value must be a valid IP (v4 or v6) address.\n *\n * IPv4 addresses are expected in the dotted decimal format\u2014for example, \"192.168.5.21\".\n * IPv6 addresses are expected in their text representation\u2014for example, \"::1\",\n * or \"2001:0DB8:ABCD:0012::0\".\n *\n * Both formats are well-defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone identifiers for IPv6 addresses (for example, \"fe80::a%en1\") are supported.\n *\n * If the field value isn't a valid IP address, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP address\n * string value = 1 [(buf.validate.field).string.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 14;\n */\n value: boolean;\n case: \"ip\";\n } | {\n /**\n * `ipv4` specifies that the field value must be a valid IPv4 address\u2014for\n * example \"192.168.5.21\". If the field value isn't a valid IPv4 address, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 address\n * string value = 1 [(buf.validate.field).string.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 15;\n */\n value: boolean;\n case: \"ipv4\";\n } | {\n /**\n * `ipv6` specifies that the field value must be a valid IPv6 address\u2014for\n * example \"::1\", or \"d7a:115c:a1e0:ab12:4843:cd96:626b:430b\". If the field\n * value is not a valid IPv6 address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 address\n * string value = 1 [(buf.validate.field).string.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 16;\n */\n value: boolean;\n case: \"ipv6\";\n } | {\n /**\n * `uri` specifies that the field value must be a valid URI, for example\n * \"https://example.com/foo/bar?baz=quux#frag\".\n *\n * URI is defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid URI\n * string value = 1 [(buf.validate.field).string.uri = true];\n * }\n * ```\n *\n * @generated from field: bool uri = 17;\n */\n value: boolean;\n case: \"uri\";\n } | {\n /**\n * `uri_ref` specifies that the field value must be a valid URI Reference\u2014either\n * a URI such as \"https://example.com/foo/bar?baz=quux#frag\", or a Relative\n * Reference such as \"./foo/bar?query\".\n *\n * URI, URI Reference, and Relative Reference are defined in the internet\n * standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986). Zone\n * Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI Reference, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid URI Reference\n * string value = 1 [(buf.validate.field).string.uri_ref = true];\n * }\n * ```\n *\n * @generated from field: bool uri_ref = 18;\n */\n value: boolean;\n case: \"uriRef\";\n } | {\n /**\n * `address` specifies that the field value must be either a valid hostname\n * (for example, \"example.com\"), or a valid IP (v4 or v6) address (for example,\n * \"192.168.0.1\", or \"::1\"). If the field value isn't a valid hostname or IP,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid hostname, or ip address\n * string value = 1 [(buf.validate.field).string.address = true];\n * }\n * ```\n *\n * @generated from field: bool address = 21;\n */\n value: boolean;\n case: \"address\";\n } | {\n /**\n * `uuid` specifies that the field value must be a valid UUID as defined by\n * [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2). If the\n * field value isn't a valid UUID, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid UUID\n * string value = 1 [(buf.validate.field).string.uuid = true];\n * }\n * ```\n *\n * @generated from field: bool uuid = 22;\n */\n value: boolean;\n case: \"uuid\";\n } | {\n /**\n * `tuuid` (trimmed UUID) specifies that the field value must be a valid UUID as\n * defined by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2) with all dashes\n * omitted. If the field value isn't a valid UUID without dashes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid trimmed UUID\n * string value = 1 [(buf.validate.field).string.tuuid = true];\n * }\n * ```\n *\n * @generated from field: bool tuuid = 33;\n */\n value: boolean;\n case: \"tuuid\";\n } | {\n /**\n * `ip_with_prefixlen` specifies that the field value must be a valid IP\n * (v4 or v6) address with prefix length\u2014for example, \"192.168.5.21/16\" or\n * \"2001:0DB8:ABCD:0012::F1/64\". If the field value isn't a valid IP with\n * prefix length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP with prefix length\n * string value = 1 [(buf.validate.field).string.ip_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ip_with_prefixlen = 26;\n */\n value: boolean;\n case: \"ipWithPrefixlen\";\n } | {\n /**\n * `ipv4_with_prefixlen` specifies that the field value must be a valid\n * IPv4 address with prefix length\u2014for example, \"192.168.5.21/16\". If the\n * field value isn't a valid IPv4 address with prefix length, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 address with prefix length\n * string value = 1 [(buf.validate.field).string.ipv4_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_with_prefixlen = 27;\n */\n value: boolean;\n case: \"ipv4WithPrefixlen\";\n } | {\n /**\n * `ipv6_with_prefixlen` specifies that the field value must be a valid\n * IPv6 address with prefix length\u2014for example, \"2001:0DB8:ABCD:0012::F1/64\".\n * If the field value is not a valid IPv6 address with prefix length,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 address prefix length\n * string value = 1 [(buf.validate.field).string.ipv6_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_with_prefixlen = 28;\n */\n value: boolean;\n case: \"ipv6WithPrefixlen\";\n } | {\n /**\n * `ip_prefix` specifies that the field value must be a valid IP (v4 or v6)\n * prefix\u2014for example, \"192.168.0.0/16\" or \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value isn't a valid IP prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP prefix\n * string value = 1 [(buf.validate.field).string.ip_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ip_prefix = 29;\n */\n value: boolean;\n case: \"ipPrefix\";\n } | {\n /**\n * `ipv4_prefix` specifies that the field value must be a valid IPv4\n * prefix, for example \"192.168.0.0/16\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"192.168.0.0/16\" designates the left-most 16 bits for the prefix,\n * and the remaining 16 bits must be zero.\n *\n * If the field value isn't a valid IPv4 prefix, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 prefix\n * string value = 1 [(buf.validate.field).string.ipv4_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_prefix = 30;\n */\n value: boolean;\n case: \"ipv4Prefix\";\n } | {\n /**\n * `ipv6_prefix` specifies that the field value must be a valid IPv6 prefix\u2014for\n * example, \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value is not a valid IPv6 prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 prefix\n * string value = 1 [(buf.validate.field).string.ipv6_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_prefix = 31;\n */\n value: boolean;\n case: \"ipv6Prefix\";\n } | {\n /**\n * `host_and_port` specifies that the field value must be valid host/port\n * pair\u2014for example, \"example.com:8080\".\n *\n * The host can be one of:\n * - An IPv4 address in dotted decimal format\u2014for example, \"192.168.5.21\".\n * - An IPv6 address enclosed in square brackets\u2014for example, \"[2001:0DB8:ABCD:0012::F1]\".\n * - A hostname\u2014for example, \"example.com\".\n *\n * The port is separated by a colon. It must be non-empty, with a decimal number\n * in the range of 0-65535, inclusive.\n *\n * @generated from field: bool host_and_port = 32;\n */\n value: boolean;\n case: \"hostAndPort\";\n } | {\n /**\n * `well_known_regex` specifies a common well-known pattern\n * defined as a regex. If the field value doesn't match the well-known\n * regex, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid HTTP header value\n * string value = 1 [(buf.validate.field).string.well_known_regex = KNOWN_REGEX_HTTP_HEADER_VALUE];\n * }\n * ```\n *\n * #### KnownRegex\n *\n * `well_known_regex` contains some well-known patterns.\n *\n * | Name | Number | Description |\n * |-------------------------------|--------|-------------------------------------------|\n * | KNOWN_REGEX_UNSPECIFIED | 0 | |\n * | KNOWN_REGEX_HTTP_HEADER_NAME | 1 | HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2) |\n * | KNOWN_REGEX_HTTP_HEADER_VALUE | 2 | HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4) |\n *\n * @generated from field: buf.validate.KnownRegex well_known_regex = 24;\n */\n value: KnownRegex;\n case: \"wellKnownRegex\";\n } | { case: undefined; value?: undefined };\n\n /**\n * This applies to regexes `HTTP_HEADER_NAME` and `HTTP_HEADER_VALUE` to\n * enable strict header validation. By default, this is true, and HTTP header\n * validations are [RFC-compliant](https://datatracker.ietf.org/doc/html/rfc7230#section-3). Setting to false will enable looser\n * validations that only disallow `\\r\\n\\0` characters, which can be used to\n * bypass header matching rules.\n *\n * ```proto\n * message MyString {\n * // The field `value` must have be a valid HTTP headers, but not enforced with strict rules.\n * string value = 1 [(buf.validate.field).string.strict = false];\n * }\n * ```\n *\n * @generated from field: optional bool strict = 25;\n */\n strict: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyString {\n * string value = 1 [\n * (buf.validate.field).string.example = \"hello\",\n * (buf.validate.field).string.example = \"world\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated string example = 34;\n */\n example: string[];\n};\n\n/**\n * StringRules describes the rules applied to `string` values These\n * rules may also be applied to the `google.protobuf.StringValue` Well-Known-Type.\n *\n * @generated from message buf.validate.StringRules\n */\nexport type StringRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified value. If\n * the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyString {\n * // value must equal `hello`\n * string value = 1 [(buf.validate.field).string.const = \"hello\"];\n * }\n * ```\n *\n * @generated from field: optional string const = 1;\n */\n const?: string;\n\n /**\n * `len` dictates that the field value must have the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value does not meet the specified\n * length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 5 characters\n * string value = 1 [(buf.validate.field).string.len = 5];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 19;\n */\n len?: string;\n\n /**\n * `min_len` specifies that the field value must have at least the specified\n * number of characters (Unicode code points), which may differ from the number\n * of bytes in the string. If the field value contains fewer characters, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 3 characters\n * string value = 1 [(buf.validate.field).string.min_len = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen?: string;\n\n /**\n * `max_len` specifies that the field value must have no more than the specified\n * number of characters (Unicode code points), which may differ from the\n * number of bytes in the string. If the field value contains more characters,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 10 characters\n * string value = 1 [(buf.validate.field).string.max_len = 10];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen?: string;\n\n /**\n * `len_bytes` dictates that the field value must have the specified number of\n * bytes. If the field value does not match the specified length in bytes,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be 6 bytes\n * string value = 1 [(buf.validate.field).string.len_bytes = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 len_bytes = 20;\n */\n lenBytes?: string;\n\n /**\n * `min_bytes` specifies that the field value must have at least the specified\n * number of bytes. If the field value contains fewer bytes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at least 4 bytes\n * string value = 1 [(buf.validate.field).string.min_bytes = 4];\n * }\n *\n * ```\n *\n * @generated from field: optional uint64 min_bytes = 4;\n */\n minBytes?: string;\n\n /**\n * `max_bytes` specifies that the field value must have no more than the\n * specified number of bytes. If the field value contains more bytes, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value length must be at most 8 bytes\n * string value = 1 [(buf.validate.field).string.max_bytes = 8];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_bytes = 5;\n */\n maxBytes?: string;\n\n /**\n * `pattern` specifies that the field value must match the specified\n * regular expression (RE2 syntax), with the expression provided without any\n * delimiters. If the field value doesn't match the regular expression, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not match regex pattern `^[a-zA-Z]//$`\n * string value = 1 [(buf.validate.field).string.pattern = \"^[a-zA-Z]//$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 6;\n */\n pattern?: string;\n\n /**\n * `prefix` specifies that the field value must have the\n * specified substring at the beginning of the string. If the field value\n * doesn't start with the specified prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value does not have prefix `pre`\n * string value = 1 [(buf.validate.field).string.prefix = \"pre\"];\n * }\n * ```\n *\n * @generated from field: optional string prefix = 7;\n */\n prefix?: string;\n\n /**\n * `suffix` specifies that the field value must have the\n * specified substring at the end of the string. If the field value doesn't\n * end with the specified suffix, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not have suffix `post`\n * string value = 1 [(buf.validate.field).string.suffix = \"post\"];\n * }\n * ```\n *\n * @generated from field: optional string suffix = 8;\n */\n suffix?: string;\n\n /**\n * `contains` specifies that the field value must have the\n * specified substring anywhere in the string. If the field value doesn't\n * contain the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value does not contain substring `inside`.\n * string value = 1 [(buf.validate.field).string.contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string contains = 9;\n */\n contains?: string;\n\n /**\n * `not_contains` specifies that the field value must not have the\n * specified substring anywhere in the string. If the field value contains\n * the specified substring, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value contains substring `inside`.\n * string value = 1 [(buf.validate.field).string.not_contains = \"inside\"];\n * }\n * ```\n *\n * @generated from field: optional string not_contains = 23;\n */\n notContains?: string;\n\n /**\n * `in` specifies that the field value must be equal to one of the specified\n * values. If the field value isn't one of the specified values, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be in list [\"apple\", \"banana\"]\n * string value = 1 [(buf.validate.field).string.in = \"apple\", (buf.validate.field).string.in = \"banana\"];\n * }\n * ```\n *\n * @generated from field: repeated string in = 10;\n */\n in?: string[];\n\n /**\n * `not_in` specifies that the field value cannot be equal to any\n * of the specified values. If the field value is one of the specified values,\n * an error message will be generated.\n * ```proto\n * message MyString {\n * // value must not be in list [\"orange\", \"grape\"]\n * string value = 1 [(buf.validate.field).string.not_in = \"orange\", (buf.validate.field).string.not_in = \"grape\"];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 11;\n */\n notIn?: string[];\n\n /**\n * `email` specifies that the field value must be a valid email address, for\n * example \"foo@example.com\".\n *\n * Conforms to the definition for a valid email address from the [HTML standard](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address).\n * Note that this standard willfully deviates from [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322),\n * which allows many unexpected forms of email addresses and will easily match\n * a typographical error.\n *\n * If the field value isn't a valid email address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid email address\n * string value = 1 [(buf.validate.field).string.email = true];\n * }\n * ```\n *\n * @generated from field: bool email = 12;\n */\n email?: boolean;\n\n /**\n * `hostname` specifies that the field value must be a valid hostname, for\n * example \"foo.example.com\".\n *\n * A valid hostname follows the rules below:\n * - The name consists of one or more labels, separated by a dot (\".\").\n * - Each label can be 1 to 63 alphanumeric characters.\n * - A label can contain hyphens (\"-\"), but must not start or end with a hyphen.\n * - The right-most label must not be digits only.\n * - The name can have a trailing dot\u2014for example, \"foo.example.com.\".\n * - The name can be 253 characters at most, excluding the optional trailing dot.\n *\n * If the field value isn't a valid hostname, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid hostname\n * string value = 1 [(buf.validate.field).string.hostname = true];\n * }\n * ```\n *\n * @generated from field: bool hostname = 13;\n */\n hostname?: boolean;\n\n /**\n * `ip` specifies that the field value must be a valid IP (v4 or v6) address.\n *\n * IPv4 addresses are expected in the dotted decimal format\u2014for example, \"192.168.5.21\".\n * IPv6 addresses are expected in their text representation\u2014for example, \"::1\",\n * or \"2001:0DB8:ABCD:0012::0\".\n *\n * Both formats are well-defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone identifiers for IPv6 addresses (for example, \"fe80::a%en1\") are supported.\n *\n * If the field value isn't a valid IP address, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP address\n * string value = 1 [(buf.validate.field).string.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 14;\n */\n ip?: boolean;\n\n /**\n * `ipv4` specifies that the field value must be a valid IPv4 address\u2014for\n * example \"192.168.5.21\". If the field value isn't a valid IPv4 address, an\n * error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 address\n * string value = 1 [(buf.validate.field).string.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 15;\n */\n ipv4?: boolean;\n\n /**\n * `ipv6` specifies that the field value must be a valid IPv6 address\u2014for\n * example \"::1\", or \"d7a:115c:a1e0:ab12:4843:cd96:626b:430b\". If the field\n * value is not a valid IPv6 address, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 address\n * string value = 1 [(buf.validate.field).string.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 16;\n */\n ipv6?: boolean;\n\n /**\n * `uri` specifies that the field value must be a valid URI, for example\n * \"https://example.com/foo/bar?baz=quux#frag\".\n *\n * URI is defined in the internet standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).\n * Zone Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid URI\n * string value = 1 [(buf.validate.field).string.uri = true];\n * }\n * ```\n *\n * @generated from field: bool uri = 17;\n */\n uri?: boolean;\n\n /**\n * `uri_ref` specifies that the field value must be a valid URI Reference\u2014either\n * a URI such as \"https://example.com/foo/bar?baz=quux#frag\", or a Relative\n * Reference such as \"./foo/bar?query\".\n *\n * URI, URI Reference, and Relative Reference are defined in the internet\n * standard [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986). Zone\n * Identifiers in IPv6 address literals are supported ([RFC 6874](https://datatracker.ietf.org/doc/html/rfc6874)).\n *\n * If the field value isn't a valid URI Reference, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid URI Reference\n * string value = 1 [(buf.validate.field).string.uri_ref = true];\n * }\n * ```\n *\n * @generated from field: bool uri_ref = 18;\n */\n uriRef?: boolean;\n\n /**\n * `address` specifies that the field value must be either a valid hostname\n * (for example, \"example.com\"), or a valid IP (v4 or v6) address (for example,\n * \"192.168.0.1\", or \"::1\"). If the field value isn't a valid hostname or IP,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid hostname, or ip address\n * string value = 1 [(buf.validate.field).string.address = true];\n * }\n * ```\n *\n * @generated from field: bool address = 21;\n */\n address?: boolean;\n\n /**\n * `uuid` specifies that the field value must be a valid UUID as defined by\n * [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2). If the\n * field value isn't a valid UUID, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid UUID\n * string value = 1 [(buf.validate.field).string.uuid = true];\n * }\n * ```\n *\n * @generated from field: bool uuid = 22;\n */\n uuid?: boolean;\n\n /**\n * `tuuid` (trimmed UUID) specifies that the field value must be a valid UUID as\n * defined by [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.2) with all dashes\n * omitted. If the field value isn't a valid UUID without dashes, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid trimmed UUID\n * string value = 1 [(buf.validate.field).string.tuuid = true];\n * }\n * ```\n *\n * @generated from field: bool tuuid = 33;\n */\n tuuid?: boolean;\n\n /**\n * `ip_with_prefixlen` specifies that the field value must be a valid IP\n * (v4 or v6) address with prefix length\u2014for example, \"192.168.5.21/16\" or\n * \"2001:0DB8:ABCD:0012::F1/64\". If the field value isn't a valid IP with\n * prefix length, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP with prefix length\n * string value = 1 [(buf.validate.field).string.ip_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ip_with_prefixlen = 26;\n */\n ipWithPrefixlen?: boolean;\n\n /**\n * `ipv4_with_prefixlen` specifies that the field value must be a valid\n * IPv4 address with prefix length\u2014for example, \"192.168.5.21/16\". If the\n * field value isn't a valid IPv4 address with prefix length, an error\n * message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 address with prefix length\n * string value = 1 [(buf.validate.field).string.ipv4_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_with_prefixlen = 27;\n */\n ipv4WithPrefixlen?: boolean;\n\n /**\n * `ipv6_with_prefixlen` specifies that the field value must be a valid\n * IPv6 address with prefix length\u2014for example, \"2001:0DB8:ABCD:0012::F1/64\".\n * If the field value is not a valid IPv6 address with prefix length,\n * an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 address prefix length\n * string value = 1 [(buf.validate.field).string.ipv6_with_prefixlen = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_with_prefixlen = 28;\n */\n ipv6WithPrefixlen?: boolean;\n\n /**\n * `ip_prefix` specifies that the field value must be a valid IP (v4 or v6)\n * prefix\u2014for example, \"192.168.0.0/16\" or \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value isn't a valid IP prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IP prefix\n * string value = 1 [(buf.validate.field).string.ip_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ip_prefix = 29;\n */\n ipPrefix?: boolean;\n\n /**\n * `ipv4_prefix` specifies that the field value must be a valid IPv4\n * prefix, for example \"192.168.0.0/16\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"192.168.0.0/16\" designates the left-most 16 bits for the prefix,\n * and the remaining 16 bits must be zero.\n *\n * If the field value isn't a valid IPv4 prefix, an error message\n * will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv4 prefix\n * string value = 1 [(buf.validate.field).string.ipv4_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4_prefix = 30;\n */\n ipv4Prefix?: boolean;\n\n /**\n * `ipv6_prefix` specifies that the field value must be a valid IPv6 prefix\u2014for\n * example, \"2001:0DB8:ABCD:0012::0/64\".\n *\n * The prefix must have all zeros for the unmasked bits. For example,\n * \"2001:0DB8:ABCD:0012::0/64\" designates the left-most 64 bits for the\n * prefix, and the remaining 64 bits must be zero.\n *\n * If the field value is not a valid IPv6 prefix, an error message will be\n * generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid IPv6 prefix\n * string value = 1 [(buf.validate.field).string.ipv6_prefix = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6_prefix = 31;\n */\n ipv6Prefix?: boolean;\n\n /**\n * `host_and_port` specifies that the field value must be valid host/port\n * pair\u2014for example, \"example.com:8080\".\n *\n * The host can be one of:\n * - An IPv4 address in dotted decimal format\u2014for example, \"192.168.5.21\".\n * - An IPv6 address enclosed in square brackets\u2014for example, \"[2001:0DB8:ABCD:0012::F1]\".\n * - A hostname\u2014for example, \"example.com\".\n *\n * The port is separated by a colon. It must be non-empty, with a decimal number\n * in the range of 0-65535, inclusive.\n *\n * @generated from field: bool host_and_port = 32;\n */\n hostAndPort?: boolean;\n\n /**\n * `well_known_regex` specifies a common well-known pattern\n * defined as a regex. If the field value doesn't match the well-known\n * regex, an error message will be generated.\n *\n * ```proto\n * message MyString {\n * // value must be a valid HTTP header value\n * string value = 1 [(buf.validate.field).string.well_known_regex = KNOWN_REGEX_HTTP_HEADER_VALUE];\n * }\n * ```\n *\n * #### KnownRegex\n *\n * `well_known_regex` contains some well-known patterns.\n *\n * | Name | Number | Description |\n * |-------------------------------|--------|-------------------------------------------|\n * | KNOWN_REGEX_UNSPECIFIED | 0 | |\n * | KNOWN_REGEX_HTTP_HEADER_NAME | 1 | HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2) |\n * | KNOWN_REGEX_HTTP_HEADER_VALUE | 2 | HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4) |\n *\n * @generated from field: buf.validate.KnownRegex well_known_regex = 24;\n */\n wellKnownRegex?: KnownRegexJson;\n\n /**\n * This applies to regexes `HTTP_HEADER_NAME` and `HTTP_HEADER_VALUE` to\n * enable strict header validation. By default, this is true, and HTTP header\n * validations are [RFC-compliant](https://datatracker.ietf.org/doc/html/rfc7230#section-3). Setting to false will enable looser\n * validations that only disallow `\\r\\n\\0` characters, which can be used to\n * bypass header matching rules.\n *\n * ```proto\n * message MyString {\n * // The field `value` must have be a valid HTTP headers, but not enforced with strict rules.\n * string value = 1 [(buf.validate.field).string.strict = false];\n * }\n * ```\n *\n * @generated from field: optional bool strict = 25;\n */\n strict?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyString {\n * string value = 1 [\n * (buf.validate.field).string.example = \"hello\",\n * (buf.validate.field).string.example = \"world\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated string example = 34;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.StringRules.\n * Use `create(StringRulesSchema)` to create a new message.\n */\nexport const StringRulesSchema: GenMessage<StringRules, {jsonType: StringRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 19);\n\n/**\n * BytesRules describe the rules applied to `bytes` values. These rules\n * may also be applied to the `google.protobuf.BytesValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BytesRules\n */\nexport type BytesRules = Message<\"buf.validate.BytesRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified bytes\n * value. If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be \"\\x01\\x02\\x03\\x04\"\n * bytes value = 1 [(buf.validate.field).bytes.const = \"\\x01\\x02\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes const = 1;\n */\n const: Uint8Array;\n\n /**\n * `len` requires the field value to have the specified length in bytes.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be 4 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.len = 4];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 13;\n */\n len: bigint;\n\n /**\n * `min_len` requires the field value to have at least the specified minimum\n * length in bytes.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be at least 2 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.min_len = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen: bigint;\n\n /**\n * `max_len` requires the field value to have at most the specified maximum\n * length in bytes.\n * If the field value exceeds the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be at most 6 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.max_len = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen: bigint;\n\n /**\n * `pattern` requires the field value to match the specified regular\n * expression ([RE2 syntax](https://github.com/google/re2/wiki/Syntax)).\n * The value of the field must be valid UTF-8 or validation will fail with a\n * runtime error.\n * If the field value doesn't match the pattern, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must match regex pattern \"^[a-zA-Z0-9]+$\".\n * optional bytes value = 1 [(buf.validate.field).bytes.pattern = \"^[a-zA-Z0-9]+$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 4;\n */\n pattern: string;\n\n /**\n * `prefix` requires the field value to have the specified bytes at the\n * beginning of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have prefix \\x01\\x02\n * optional bytes value = 1 [(buf.validate.field).bytes.prefix = \"\\x01\\x02\"];\n * }\n * ```\n *\n * @generated from field: optional bytes prefix = 5;\n */\n prefix: Uint8Array;\n\n /**\n * `suffix` requires the field value to have the specified bytes at the end\n * of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have suffix \\x03\\x04\n * optional bytes value = 1 [(buf.validate.field).bytes.suffix = \"\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes suffix = 6;\n */\n suffix: Uint8Array;\n\n /**\n * `contains` requires the field value to have the specified bytes anywhere in\n * the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```protobuf\n * message MyBytes {\n * // value does not contain \\x02\\x03\n * optional bytes value = 1 [(buf.validate.field).bytes.contains = \"\\x02\\x03\"];\n * }\n * ```\n *\n * @generated from field: optional bytes contains = 7;\n */\n contains: Uint8Array;\n\n /**\n * `in` requires the field value to be equal to one of the specified\n * values. If the field value doesn't match any of the specified values, an\n * error message is generated.\n *\n * ```protobuf\n * message MyBytes {\n * // value must in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes.in = {\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"}];\n * }\n * ```\n *\n * @generated from field: repeated bytes in = 8;\n */\n in: Uint8Array[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the specified\n * values.\n * If the field value matches any of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyBytes {\n * // value must not in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes.not_in = {\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"}];\n * }\n * ```\n *\n * @generated from field: repeated bytes not_in = 9;\n */\n notIn: Uint8Array[];\n\n /**\n * WellKnown rules provide advanced rules against common byte\n * patterns\n *\n * @generated from oneof buf.validate.BytesRules.well_known\n */\n wellKnown: {\n /**\n * `ip` ensures that the field `value` is a valid IP address (v4 or v6) in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be a valid IP address\n * optional bytes value = 1 [(buf.validate.field).bytes.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 10;\n */\n value: boolean;\n case: \"ip\";\n } | {\n /**\n * `ipv4` ensures that the field `value` is a valid IPv4 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be a valid IPv4 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 11;\n */\n value: boolean;\n case: \"ipv4\";\n } | {\n /**\n * `ipv6` ensures that the field `value` is a valid IPv6 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n * ```proto\n * message MyBytes {\n * // value must be a valid IPv6 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 12;\n */\n value: boolean;\n case: \"ipv6\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBytes {\n * bytes value = 1 [\n * (buf.validate.field).bytes.example = \"\\x01\\x02\",\n * (buf.validate.field).bytes.example = \"\\x02\\x03\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bytes example = 14;\n */\n example: Uint8Array[];\n};\n\n/**\n * BytesRules describe the rules applied to `bytes` values. These rules\n * may also be applied to the `google.protobuf.BytesValue` Well-Known-Type.\n *\n * @generated from message buf.validate.BytesRules\n */\nexport type BytesRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified bytes\n * value. If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be \"\\x01\\x02\\x03\\x04\"\n * bytes value = 1 [(buf.validate.field).bytes.const = \"\\x01\\x02\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes const = 1;\n */\n const?: string;\n\n /**\n * `len` requires the field value to have the specified length in bytes.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be 4 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.len = 4];\n * }\n * ```\n *\n * @generated from field: optional uint64 len = 13;\n */\n len?: string;\n\n /**\n * `min_len` requires the field value to have at least the specified minimum\n * length in bytes.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value length must be at least 2 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.min_len = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_len = 2;\n */\n minLen?: string;\n\n /**\n * `max_len` requires the field value to have at most the specified maximum\n * length in bytes.\n * If the field value exceeds the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be at most 6 bytes.\n * optional bytes value = 1 [(buf.validate.field).bytes.max_len = 6];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_len = 3;\n */\n maxLen?: string;\n\n /**\n * `pattern` requires the field value to match the specified regular\n * expression ([RE2 syntax](https://github.com/google/re2/wiki/Syntax)).\n * The value of the field must be valid UTF-8 or validation will fail with a\n * runtime error.\n * If the field value doesn't match the pattern, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must match regex pattern \"^[a-zA-Z0-9]+$\".\n * optional bytes value = 1 [(buf.validate.field).bytes.pattern = \"^[a-zA-Z0-9]+$\"];\n * }\n * ```\n *\n * @generated from field: optional string pattern = 4;\n */\n pattern?: string;\n\n /**\n * `prefix` requires the field value to have the specified bytes at the\n * beginning of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have prefix \\x01\\x02\n * optional bytes value = 1 [(buf.validate.field).bytes.prefix = \"\\x01\\x02\"];\n * }\n * ```\n *\n * @generated from field: optional bytes prefix = 5;\n */\n prefix?: string;\n\n /**\n * `suffix` requires the field value to have the specified bytes at the end\n * of the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value does not have suffix \\x03\\x04\n * optional bytes value = 1 [(buf.validate.field).bytes.suffix = \"\\x03\\x04\"];\n * }\n * ```\n *\n * @generated from field: optional bytes suffix = 6;\n */\n suffix?: string;\n\n /**\n * `contains` requires the field value to have the specified bytes anywhere in\n * the string.\n * If the field value doesn't meet the requirement, an error message is generated.\n *\n * ```protobuf\n * message MyBytes {\n * // value does not contain \\x02\\x03\n * optional bytes value = 1 [(buf.validate.field).bytes.contains = \"\\x02\\x03\"];\n * }\n * ```\n *\n * @generated from field: optional bytes contains = 7;\n */\n contains?: string;\n\n /**\n * `in` requires the field value to be equal to one of the specified\n * values. If the field value doesn't match any of the specified values, an\n * error message is generated.\n *\n * ```protobuf\n * message MyBytes {\n * // value must in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes.in = {\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"}];\n * }\n * ```\n *\n * @generated from field: repeated bytes in = 8;\n */\n in?: string[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the specified\n * values.\n * If the field value matches any of the specified values, an error message is\n * generated.\n *\n * ```proto\n * message MyBytes {\n * // value must not in [\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"]\n * optional bytes value = 1 [(buf.validate.field).bytes.not_in = {\"\\x01\\x02\", \"\\x02\\x03\", \"\\x03\\x04\"}];\n * }\n * ```\n *\n * @generated from field: repeated bytes not_in = 9;\n */\n notIn?: string[];\n\n /**\n * `ip` ensures that the field `value` is a valid IP address (v4 or v6) in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be a valid IP address\n * optional bytes value = 1 [(buf.validate.field).bytes.ip = true];\n * }\n * ```\n *\n * @generated from field: bool ip = 10;\n */\n ip?: boolean;\n\n /**\n * `ipv4` ensures that the field `value` is a valid IPv4 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n *\n * ```proto\n * message MyBytes {\n * // value must be a valid IPv4 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv4 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv4 = 11;\n */\n ipv4?: boolean;\n\n /**\n * `ipv6` ensures that the field `value` is a valid IPv6 address in byte format.\n * If the field value doesn't meet this rule, an error message is generated.\n * ```proto\n * message MyBytes {\n * // value must be a valid IPv6 address\n * optional bytes value = 1 [(buf.validate.field).bytes.ipv6 = true];\n * }\n * ```\n *\n * @generated from field: bool ipv6 = 12;\n */\n ipv6?: boolean;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyBytes {\n * bytes value = 1 [\n * (buf.validate.field).bytes.example = \"\\x01\\x02\",\n * (buf.validate.field).bytes.example = \"\\x02\\x03\"\n * ];\n * }\n * ```\n *\n * @generated from field: repeated bytes example = 14;\n */\n example?: string[];\n};\n\n/**\n * Describes the message buf.validate.BytesRules.\n * Use `create(BytesRulesSchema)` to create a new message.\n */\nexport const BytesRulesSchema: GenMessage<BytesRules, {jsonType: BytesRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 20);\n\n/**\n * EnumRules describe the rules applied to `enum` values.\n *\n * @generated from message buf.validate.EnumRules\n */\nexport type EnumRules = Message<\"buf.validate.EnumRules\"> & {\n /**\n * `const` requires the field value to exactly match the specified enum value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be exactly MY_ENUM_VALUE1.\n * MyEnum value = 1 [(buf.validate.field).enum.const = 1];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const: number;\n\n /**\n * `defined_only` requires the field value to be one of the defined values for\n * this enum, failing on any undefined value.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be a defined value of MyEnum.\n * MyEnum value = 1 [(buf.validate.field).enum.defined_only = true];\n * }\n * ```\n *\n * @generated from field: optional bool defined_only = 2;\n */\n definedOnly: boolean;\n\n /**\n * `in` requires the field value to be equal to one of the\n * specified enum values. If the field value doesn't match any of the\n * specified values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be equal to one of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 3;\n */\n in: number[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the\n * specified enum values. If the field value matches one of the specified\n * values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must not be equal to any of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { not_in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 4;\n */\n notIn: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * (buf.validate.field).enum.example = 1,\n * (buf.validate.field).enum.example = 2\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 5;\n */\n example: number[];\n};\n\n/**\n * EnumRules describe the rules applied to `enum` values.\n *\n * @generated from message buf.validate.EnumRules\n */\nexport type EnumRulesJson = {\n /**\n * `const` requires the field value to exactly match the specified enum value.\n * If the field value doesn't match, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be exactly MY_ENUM_VALUE1.\n * MyEnum value = 1 [(buf.validate.field).enum.const = 1];\n * }\n * ```\n *\n * @generated from field: optional int32 const = 1;\n */\n const?: number;\n\n /**\n * `defined_only` requires the field value to be one of the defined values for\n * this enum, failing on any undefined value.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be a defined value of MyEnum.\n * MyEnum value = 1 [(buf.validate.field).enum.defined_only = true];\n * }\n * ```\n *\n * @generated from field: optional bool defined_only = 2;\n */\n definedOnly?: boolean;\n\n /**\n * `in` requires the field value to be equal to one of the\n * specified enum values. If the field value doesn't match any of the\n * specified values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must be equal to one of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 in = 3;\n */\n in?: number[];\n\n /**\n * `not_in` requires the field value to be not equal to any of the\n * specified enum values. If the field value matches one of the specified\n * values, an error message is generated.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * // The field `value` must not be equal to any of the specified values.\n * MyEnum value = 1 [(buf.validate.field).enum = { not_in: [1, 2]}];\n * }\n * ```\n *\n * @generated from field: repeated int32 not_in = 4;\n */\n notIn?: number[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * enum MyEnum {\n * MY_ENUM_UNSPECIFIED = 0;\n * MY_ENUM_VALUE1 = 1;\n * MY_ENUM_VALUE2 = 2;\n * }\n *\n * message MyMessage {\n * (buf.validate.field).enum.example = 1,\n * (buf.validate.field).enum.example = 2\n * }\n * ```\n *\n * @generated from field: repeated int32 example = 5;\n */\n example?: number[];\n};\n\n/**\n * Describes the message buf.validate.EnumRules.\n * Use `create(EnumRulesSchema)` to create a new message.\n */\nexport const EnumRulesSchema: GenMessage<EnumRules, {jsonType: EnumRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 21);\n\n/**\n * RepeatedRules describe the rules applied to `repeated` values.\n *\n * @generated from message buf.validate.RepeatedRules\n */\nexport type RepeatedRules = Message<\"buf.validate.RepeatedRules\"> & {\n /**\n * `min_items` requires that this field must contain at least the specified\n * minimum number of items.\n *\n * Note that `min_items = 1` is equivalent to setting a field as `required`.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain at least 2 items\n * repeated string value = 1 [(buf.validate.field).repeated.min_items = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_items = 1;\n */\n minItems: bigint;\n\n /**\n * `max_items` denotes that this field must not exceed a\n * certain number of items as the upper limit. If the field contains more\n * items than specified, an error message will be generated, requiring the\n * field to maintain no more than the specified number of items.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain no more than 3 item(s)\n * repeated string value = 1 [(buf.validate.field).repeated.max_items = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_items = 2;\n */\n maxItems: bigint;\n\n /**\n * `unique` indicates that all elements in this field must\n * be unique. This rule is strictly applicable to scalar and enum\n * types, with message types not being supported.\n *\n * ```proto\n * message MyRepeated {\n * // repeated value must contain unique items\n * repeated string value = 1 [(buf.validate.field).repeated.unique = true];\n * }\n * ```\n *\n * @generated from field: optional bool unique = 3;\n */\n unique: boolean;\n\n /**\n * `items` details the rules to be applied to each item\n * in the field. Even for repeated message fields, validation is executed\n * against each item unless `ignore` is specified.\n *\n * ```proto\n * message MyRepeated {\n * // The items in the field `value` must follow the specified rules.\n * repeated string value = 1 [(buf.validate.field).repeated.items = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Repeated items\n * cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules items = 4;\n */\n items?: FieldRules;\n};\n\n/**\n * RepeatedRules describe the rules applied to `repeated` values.\n *\n * @generated from message buf.validate.RepeatedRules\n */\nexport type RepeatedRulesJson = {\n /**\n * `min_items` requires that this field must contain at least the specified\n * minimum number of items.\n *\n * Note that `min_items = 1` is equivalent to setting a field as `required`.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain at least 2 items\n * repeated string value = 1 [(buf.validate.field).repeated.min_items = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_items = 1;\n */\n minItems?: string;\n\n /**\n * `max_items` denotes that this field must not exceed a\n * certain number of items as the upper limit. If the field contains more\n * items than specified, an error message will be generated, requiring the\n * field to maintain no more than the specified number of items.\n *\n * ```proto\n * message MyRepeated {\n * // value must contain no more than 3 item(s)\n * repeated string value = 1 [(buf.validate.field).repeated.max_items = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_items = 2;\n */\n maxItems?: string;\n\n /**\n * `unique` indicates that all elements in this field must\n * be unique. This rule is strictly applicable to scalar and enum\n * types, with message types not being supported.\n *\n * ```proto\n * message MyRepeated {\n * // repeated value must contain unique items\n * repeated string value = 1 [(buf.validate.field).repeated.unique = true];\n * }\n * ```\n *\n * @generated from field: optional bool unique = 3;\n */\n unique?: boolean;\n\n /**\n * `items` details the rules to be applied to each item\n * in the field. Even for repeated message fields, validation is executed\n * against each item unless `ignore` is specified.\n *\n * ```proto\n * message MyRepeated {\n * // The items in the field `value` must follow the specified rules.\n * repeated string value = 1 [(buf.validate.field).repeated.items = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Repeated items\n * cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules items = 4;\n */\n items?: FieldRulesJson;\n};\n\n/**\n * Describes the message buf.validate.RepeatedRules.\n * Use `create(RepeatedRulesSchema)` to create a new message.\n */\nexport const RepeatedRulesSchema: GenMessage<RepeatedRules, {jsonType: RepeatedRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 22);\n\n/**\n * MapRules describe the rules applied to `map` values.\n *\n * @generated from message buf.validate.MapRules\n */\nexport type MapRules = Message<\"buf.validate.MapRules\"> & {\n /**\n * Specifies the minimum number of key-value pairs allowed. If the field has\n * fewer key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at least 2 key-value pairs.\n * map<string, string> value = 1 [(buf.validate.field).map.min_pairs = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_pairs = 1;\n */\n minPairs: bigint;\n\n /**\n * Specifies the maximum number of key-value pairs allowed. If the field has\n * more key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at most 3 key-value pairs.\n * map<string, string> value = 1 [(buf.validate.field).map.max_pairs = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_pairs = 2;\n */\n maxPairs: bigint;\n\n /**\n * Specifies the rules to be applied to each key in the field.\n *\n * ```proto\n * message MyMap {\n * // The keys in the field `value` must follow the specified rules.\n * map<string, string> value = 1 [(buf.validate.field).map.keys = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Map keys cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules keys = 4;\n */\n keys?: FieldRules;\n\n /**\n * Specifies the rules to be applied to the value of each key in the\n * field. Message values will still have their validations evaluated unless\n * `ignore` is specified.\n *\n * ```proto\n * message MyMap {\n * // The values in the field `value` must follow the specified rules.\n * map<string, string> value = 1 [(buf.validate.field).map.values = {\n * string: {\n * min_len: 5\n * max_len: 20\n * }\n * }];\n * }\n * ```\n * Note that the `required` rule does not apply. Map values cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules values = 5;\n */\n values?: FieldRules;\n};\n\n/**\n * MapRules describe the rules applied to `map` values.\n *\n * @generated from message buf.validate.MapRules\n */\nexport type MapRulesJson = {\n /**\n * Specifies the minimum number of key-value pairs allowed. If the field has\n * fewer key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at least 2 key-value pairs.\n * map<string, string> value = 1 [(buf.validate.field).map.min_pairs = 2];\n * }\n * ```\n *\n * @generated from field: optional uint64 min_pairs = 1;\n */\n minPairs?: string;\n\n /**\n * Specifies the maximum number of key-value pairs allowed. If the field has\n * more key-value pairs than specified, an error message is generated.\n *\n * ```proto\n * message MyMap {\n * // The field `value` must have at most 3 key-value pairs.\n * map<string, string> value = 1 [(buf.validate.field).map.max_pairs = 3];\n * }\n * ```\n *\n * @generated from field: optional uint64 max_pairs = 2;\n */\n maxPairs?: string;\n\n /**\n * Specifies the rules to be applied to each key in the field.\n *\n * ```proto\n * message MyMap {\n * // The keys in the field `value` must follow the specified rules.\n * map<string, string> value = 1 [(buf.validate.field).map.keys = {\n * string: {\n * min_len: 3\n * max_len: 10\n * }\n * }];\n * }\n * ```\n *\n * Note that the `required` rule does not apply. Map keys cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules keys = 4;\n */\n keys?: FieldRulesJson;\n\n /**\n * Specifies the rules to be applied to the value of each key in the\n * field. Message values will still have their validations evaluated unless\n * `ignore` is specified.\n *\n * ```proto\n * message MyMap {\n * // The values in the field `value` must follow the specified rules.\n * map<string, string> value = 1 [(buf.validate.field).map.values = {\n * string: {\n * min_len: 5\n * max_len: 20\n * }\n * }];\n * }\n * ```\n * Note that the `required` rule does not apply. Map values cannot be unset.\n *\n * @generated from field: optional buf.validate.FieldRules values = 5;\n */\n values?: FieldRulesJson;\n};\n\n/**\n * Describes the message buf.validate.MapRules.\n * Use `create(MapRulesSchema)` to create a new message.\n */\nexport const MapRulesSchema: GenMessage<MapRules, {jsonType: MapRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 23);\n\n/**\n * AnyRules describe rules applied exclusively to the `google.protobuf.Any` well-known type.\n *\n * @generated from message buf.validate.AnyRules\n */\nexport type AnyRules = Message<\"buf.validate.AnyRules\"> & {\n /**\n * `in` requires the field's `type_url` to be equal to one of the\n * specified values. If it doesn't match any of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must have a `type_url` equal to one of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * in: [\"type.googleapis.com/MyType1\", \"type.googleapis.com/MyType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string in = 2;\n */\n in: string[];\n\n /**\n * requires the field's type_url to be not equal to any of the specified values. If it matches any of the specified values, an error message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must not have a `type_url` equal to any of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * not_in: [\"type.googleapis.com/ForbiddenType1\", \"type.googleapis.com/ForbiddenType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 3;\n */\n notIn: string[];\n};\n\n/**\n * AnyRules describe rules applied exclusively to the `google.protobuf.Any` well-known type.\n *\n * @generated from message buf.validate.AnyRules\n */\nexport type AnyRulesJson = {\n /**\n * `in` requires the field's `type_url` to be equal to one of the\n * specified values. If it doesn't match any of the specified values, an error\n * message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must have a `type_url` equal to one of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * in: [\"type.googleapis.com/MyType1\", \"type.googleapis.com/MyType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string in = 2;\n */\n in?: string[];\n\n /**\n * requires the field's type_url to be not equal to any of the specified values. If it matches any of the specified values, an error message is generated.\n *\n * ```proto\n * message MyAny {\n * // The `value` field must not have a `type_url` equal to any of the specified values.\n * google.protobuf.Any value = 1 [(buf.validate.field).any = {\n * not_in: [\"type.googleapis.com/ForbiddenType1\", \"type.googleapis.com/ForbiddenType2\"]\n * }];\n * }\n * ```\n *\n * @generated from field: repeated string not_in = 3;\n */\n notIn?: string[];\n};\n\n/**\n * Describes the message buf.validate.AnyRules.\n * Use `create(AnyRulesSchema)` to create a new message.\n */\nexport const AnyRulesSchema: GenMessage<AnyRules, {jsonType: AnyRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 24);\n\n/**\n * DurationRules describe the rules applied exclusively to the `google.protobuf.Duration` well-known type.\n *\n * @generated from message buf.validate.DurationRules\n */\nexport type DurationRules = Message<\"buf.validate.DurationRules\"> & {\n /**\n * `const` dictates that the field must match the specified value of the `google.protobuf.Duration` type exactly.\n * If the field's value deviates from the specified value, an error message\n * will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must equal 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = \"5s\"];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration const = 2;\n */\n const?: Duration;\n\n /**\n * @generated from oneof buf.validate.DurationRules.less_than\n */\n lessThan: {\n /**\n * `lt` stipulates that the field must be less than the specified value of the `google.protobuf.Duration` type,\n * exclusive. If the field's value is greater than or equal to the specified\n * value, an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be less than 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = \"5s\"];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lt = 3;\n */\n value: Duration;\n case: \"lt\";\n } | {\n /**\n * `lte` indicates that the field must be less than or equal to the specified\n * value of the `google.protobuf.Duration` type, inclusive. If the field's value is greater than the specified value,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be less than or equal to 10s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = \"10s\"];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lte = 4;\n */\n value: Duration;\n case: \"lte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.DurationRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the duration field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than 5s [duration.gt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gt = { seconds: 5 }];\n *\n * // duration must be greater than 5s and less than 10s [duration.gt_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gt: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than 10s or less than 5s [duration.gt_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gt: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gt = 5;\n */\n value: Duration;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the duration field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value must\n * be outside the specified range. If the field value doesn't meet the\n * required conditions, an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than or equal to 5s [duration.gte]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gte = { seconds: 5 }];\n *\n * // duration must be greater than or equal to 5s and less than 10s [duration.gte_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gte: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than or equal to 10s or less than 5s [duration.gte_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gte: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gte = 6;\n */\n value: Duration;\n case: \"gte\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `in` asserts that the field must be equal to one of the specified values of the `google.protobuf.Duration` type.\n * If the field's value doesn't correspond to any of the specified values,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = [\"1s\", \"2s\", \"3s\"]];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration in = 7;\n */\n in: Duration[];\n\n /**\n * `not_in` denotes that the field must not be equal to\n * any of the specified values of the `google.protobuf.Duration` type.\n * If the field's value matches any of these values, an error message will be\n * generated.\n *\n * ```proto\n * message MyDuration {\n * // value must not be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.not_in = [\"1s\", \"2s\", \"3s\"]];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration not_in = 8;\n */\n notIn: Duration[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDuration {\n * google.protobuf.Duration value = 1 [\n * (buf.validate.field).duration.example = { seconds: 1 },\n * (buf.validate.field).duration.example = { seconds: 2 },\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration example = 9;\n */\n example: Duration[];\n};\n\n/**\n * DurationRules describe the rules applied exclusively to the `google.protobuf.Duration` well-known type.\n *\n * @generated from message buf.validate.DurationRules\n */\nexport type DurationRulesJson = {\n /**\n * `const` dictates that the field must match the specified value of the `google.protobuf.Duration` type exactly.\n * If the field's value deviates from the specified value, an error message\n * will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must equal 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = \"5s\"];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration const = 2;\n */\n const?: DurationJson;\n\n /**\n * `lt` stipulates that the field must be less than the specified value of the `google.protobuf.Duration` type,\n * exclusive. If the field's value is greater than or equal to the specified\n * value, an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be less than 5s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = \"5s\"];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lt = 3;\n */\n lt?: DurationJson;\n\n /**\n * `lte` indicates that the field must be less than or equal to the specified\n * value of the `google.protobuf.Duration` type, inclusive. If the field's value is greater than the specified value,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be less than or equal to 10s\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = \"10s\"];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration lte = 4;\n */\n lte?: DurationJson;\n\n /**\n * `gt` requires the duration field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than 5s [duration.gt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gt = { seconds: 5 }];\n *\n * // duration must be greater than 5s and less than 10s [duration.gt_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gt: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than 10s or less than 5s [duration.gt_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gt: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gt = 5;\n */\n gt?: DurationJson;\n\n /**\n * `gte` requires the duration field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value must\n * be outside the specified range. If the field value doesn't meet the\n * required conditions, an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be greater than or equal to 5s [duration.gte]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.gte = { seconds: 5 }];\n *\n * // duration must be greater than or equal to 5s and less than 10s [duration.gte_lt]\n * google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gte: { seconds: 5 }, lt: { seconds: 10 } }];\n *\n * // duration must be greater than or equal to 10s or less than 5s [duration.gte_lt_exclusive]\n * google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gte: { seconds: 10 }, lt: { seconds: 5 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Duration gte = 6;\n */\n gte?: DurationJson;\n\n /**\n * `in` asserts that the field must be equal to one of the specified values of the `google.protobuf.Duration` type.\n * If the field's value doesn't correspond to any of the specified values,\n * an error message will be generated.\n *\n * ```proto\n * message MyDuration {\n * // value must be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = [\"1s\", \"2s\", \"3s\"]];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration in = 7;\n */\n in?: DurationJson[];\n\n /**\n * `not_in` denotes that the field must not be equal to\n * any of the specified values of the `google.protobuf.Duration` type.\n * If the field's value matches any of these values, an error message will be\n * generated.\n *\n * ```proto\n * message MyDuration {\n * // value must not be in list [1s, 2s, 3s]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.not_in = [\"1s\", \"2s\", \"3s\"]];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration not_in = 8;\n */\n notIn?: DurationJson[];\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyDuration {\n * google.protobuf.Duration value = 1 [\n * (buf.validate.field).duration.example = { seconds: 1 },\n * (buf.validate.field).duration.example = { seconds: 2 },\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Duration example = 9;\n */\n example?: DurationJson[];\n};\n\n/**\n * Describes the message buf.validate.DurationRules.\n * Use `create(DurationRulesSchema)` to create a new message.\n */\nexport const DurationRulesSchema: GenMessage<DurationRules, {jsonType: DurationRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 25);\n\n/**\n * TimestampRules describe the rules applied exclusively to the `google.protobuf.Timestamp` well-known type.\n *\n * @generated from message buf.validate.TimestampRules\n */\nexport type TimestampRules = Message<\"buf.validate.TimestampRules\"> & {\n /**\n * `const` dictates that this field, of the `google.protobuf.Timestamp` type, must exactly match the specified value. If the field value doesn't correspond to the specified timestamp, an error message will be generated.\n *\n * ```proto\n * message MyTimestamp {\n * // value must equal 2023-05-03T10:00:00Z\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.const = {seconds: 1727998800}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Timestamp const = 2;\n */\n const?: Timestamp;\n\n /**\n * @generated from oneof buf.validate.TimestampRules.less_than\n */\n lessThan: {\n /**\n * requires the duration field value to be less than the specified value (field < value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be less than 'P3D' [duration.lt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 259200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lt = 3;\n */\n value: Timestamp;\n case: \"lt\";\n } | {\n /**\n * requires the timestamp field value to be less than or equal to the specified value (field <= value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be less than or equal to '2023-05-14T00:00:00Z' [timestamp.lte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.lte = { seconds: 1678867200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lte = 4;\n */\n value: Timestamp;\n case: \"lte\";\n } | {\n /**\n * `lt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be less than the current time. `lt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be less than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.lt_now = true];\n * }\n * ```\n *\n * @generated from field: bool lt_now = 7;\n */\n value: boolean;\n case: \"ltNow\";\n } | { case: undefined; value?: undefined };\n\n /**\n * @generated from oneof buf.validate.TimestampRules.greater_than\n */\n greaterThan: {\n /**\n * `gt` requires the timestamp field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than '2023-01-01T00:00:00Z' [timestamp.gt]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gt = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gt_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gt: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gt_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gt: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gt = 5;\n */\n value: Timestamp;\n case: \"gt\";\n } | {\n /**\n * `gte` requires the timestamp field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value\n * must be outside the specified range. If the field value doesn't meet\n * the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' [timestamp.gte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gte = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gte_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gte: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than or equal to '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gte_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gte: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gte = 6;\n */\n value: Timestamp;\n case: \"gte\";\n } | {\n /**\n * `gt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be greater than the current time. `gt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be greater than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.gt_now = true];\n * }\n * ```\n *\n * @generated from field: bool gt_now = 8;\n */\n value: boolean;\n case: \"gtNow\";\n } | { case: undefined; value?: undefined };\n\n /**\n * `within` specifies that this field, of the `google.protobuf.Timestamp` type, must be within the specified duration of the current time. If the field value isn't within the duration, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be within 1 hour of now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.within = {seconds: 3600}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration within = 9;\n */\n within?: Duration;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyTimestamp {\n * google.protobuf.Timestamp value = 1 [\n * (buf.validate.field).timestamp.example = { seconds: 1672444800 },\n * (buf.validate.field).timestamp.example = { seconds: 1672531200 },\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Timestamp example = 10;\n */\n example: Timestamp[];\n};\n\n/**\n * TimestampRules describe the rules applied exclusively to the `google.protobuf.Timestamp` well-known type.\n *\n * @generated from message buf.validate.TimestampRules\n */\nexport type TimestampRulesJson = {\n /**\n * `const` dictates that this field, of the `google.protobuf.Timestamp` type, must exactly match the specified value. If the field value doesn't correspond to the specified timestamp, an error message will be generated.\n *\n * ```proto\n * message MyTimestamp {\n * // value must equal 2023-05-03T10:00:00Z\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.const = {seconds: 1727998800}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Timestamp const = 2;\n */\n const?: TimestampJson;\n\n /**\n * requires the duration field value to be less than the specified value (field < value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyDuration {\n * // duration must be less than 'P3D' [duration.lt]\n * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 259200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lt = 3;\n */\n lt?: TimestampJson;\n\n /**\n * requires the timestamp field value to be less than or equal to the specified value (field <= value). If the field value doesn't meet the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be less than or equal to '2023-05-14T00:00:00Z' [timestamp.lte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.lte = { seconds: 1678867200 }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp lte = 4;\n */\n lte?: TimestampJson;\n\n /**\n * `lt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be less than the current time. `lt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be less than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.lt_now = true];\n * }\n * ```\n *\n * @generated from field: bool lt_now = 7;\n */\n ltNow?: boolean;\n\n /**\n * `gt` requires the timestamp field value to be greater than the specified\n * value (exclusive). If the value of `gt` is larger than a specified `lt`\n * or `lte`, the range is reversed, and the field value must be outside the\n * specified range. If the field value doesn't meet the required conditions,\n * an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than '2023-01-01T00:00:00Z' [timestamp.gt]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gt = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gt_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gt: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gt_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gt: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gt = 5;\n */\n gt?: TimestampJson;\n\n /**\n * `gte` requires the timestamp field value to be greater than or equal to the\n * specified value (exclusive). If the value of `gte` is larger than a\n * specified `lt` or `lte`, the range is reversed, and the field value\n * must be outside the specified range. If the field value doesn't meet\n * the required conditions, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' [timestamp.gte]\n * google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gte = { seconds: 1672444800 }];\n *\n * // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gte_lt]\n * google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gte: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];\n *\n * // timestamp must be greater than or equal to '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gte_lt_exclusive]\n * google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gte: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];\n * }\n * ```\n *\n * @generated from field: google.protobuf.Timestamp gte = 6;\n */\n gte?: TimestampJson;\n\n /**\n * `gt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be greater than the current time. `gt_now` can only be used with the `within` rule.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be greater than now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.gt_now = true];\n * }\n * ```\n *\n * @generated from field: bool gt_now = 8;\n */\n gtNow?: boolean;\n\n /**\n * `within` specifies that this field, of the `google.protobuf.Timestamp` type, must be within the specified duration of the current time. If the field value isn't within the duration, an error message is generated.\n *\n * ```proto\n * message MyTimestamp {\n * // value must be within 1 hour of now\n * google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.within = {seconds: 3600}];\n * }\n * ```\n *\n * @generated from field: optional google.protobuf.Duration within = 9;\n */\n within?: DurationJson;\n\n /**\n * `example` specifies values that the field may have. These values SHOULD\n * conform to other rules. `example` values will not impact validation\n * but may be used as helpful guidance on how to populate the given field.\n *\n * ```proto\n * message MyTimestamp {\n * google.protobuf.Timestamp value = 1 [\n * (buf.validate.field).timestamp.example = { seconds: 1672444800 },\n * (buf.validate.field).timestamp.example = { seconds: 1672531200 },\n * ];\n * }\n * ```\n *\n * @generated from field: repeated google.protobuf.Timestamp example = 10;\n */\n example?: TimestampJson[];\n};\n\n/**\n * Describes the message buf.validate.TimestampRules.\n * Use `create(TimestampRulesSchema)` to create a new message.\n */\nexport const TimestampRulesSchema: GenMessage<TimestampRules, {jsonType: TimestampRulesJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 26);\n\n/**\n * `Violations` is a collection of `Violation` messages. This message type is returned by\n * Protovalidate when a proto message fails to meet the requirements set by the `Rule` validation rules.\n * Each individual violation is represented by a `Violation` message.\n *\n * @generated from message buf.validate.Violations\n */\nexport type Violations = Message<\"buf.validate.Violations\"> & {\n /**\n * `violations` is a repeated field that contains all the `Violation` messages corresponding to the violations detected.\n *\n * @generated from field: repeated buf.validate.Violation violations = 1;\n */\n violations: Violation[];\n};\n\n/**\n * `Violations` is a collection of `Violation` messages. This message type is returned by\n * Protovalidate when a proto message fails to meet the requirements set by the `Rule` validation rules.\n * Each individual violation is represented by a `Violation` message.\n *\n * @generated from message buf.validate.Violations\n */\nexport type ViolationsJson = {\n /**\n * `violations` is a repeated field that contains all the `Violation` messages corresponding to the violations detected.\n *\n * @generated from field: repeated buf.validate.Violation violations = 1;\n */\n violations?: ViolationJson[];\n};\n\n/**\n * Describes the message buf.validate.Violations.\n * Use `create(ViolationsSchema)` to create a new message.\n */\nexport const ViolationsSchema: GenMessage<Violations, {jsonType: ViolationsJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 27);\n\n/**\n * `Violation` represents a single instance where a validation rule, expressed\n * as a `Rule`, was not met. It provides information about the field that\n * caused the violation, the specific rule that wasn't fulfilled, and a\n * human-readable error message.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message User {\n * int32 age = 1 [(buf.validate.field).cel = {\n * id: \"user.age\",\n * expression: \"this < 18 ? 'User must be at least 18 years old' : ''\",\n * }];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```json\n * {\n * \"ruleId\": \"user.age\",\n * \"message\": \"User must be at least 18 years old\",\n * \"field\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 1,\n * \"fieldName\": \"age\",\n * \"fieldType\": \"TYPE_INT32\"\n * }\n * ]\n * },\n * \"rule\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 23,\n * \"fieldName\": \"cel\",\n * \"fieldType\": \"TYPE_MESSAGE\",\n * \"index\": \"0\"\n * }\n * ]\n * }\n * }\n * ```\n *\n * @generated from message buf.validate.Violation\n */\nexport type Violation = Message<\"buf.validate.Violation\"> & {\n /**\n * `field` is a machine-readable path to the field that failed validation.\n * This could be a nested field, in which case the path will include all the parent fields leading to the actual field that caused the violation.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```textproto\n * violation {\n * field { element { field_number: 1, field_name: \"a\", field_type: 8 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath field = 5;\n */\n field?: FieldPath;\n\n /**\n * `rule` is a machine-readable path that points to the specific rule that failed validation.\n * This will be a nested field starting from the FieldRules of the field that failed validation.\n * For custom rules, this will provide the path of the rule, e.g. `cel[0]`.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * bool b = 2 [(buf.validate.field).cel = {\n * id: \"custom_rule\",\n * expression: \"!this ? 'b must be true': ''\"\n * }]\n * }\n * ```\n *\n * It could produce the following violations:\n *\n * ```textproto\n * violation {\n * rule { element { field_number: 25, field_name: \"required\", field_type: 8 } }\n * ...\n * }\n * violation {\n * rule { element { field_number: 23, field_name: \"cel\", field_type: 11, index: 0 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath rule = 6;\n */\n rule?: FieldPath;\n\n /**\n * `rule_id` is the unique identifier of the `Rule` that was not fulfilled.\n * This is the same `id` that was specified in the `Rule` message, allowing easy tracing of which rule was violated.\n *\n * @generated from field: optional string rule_id = 2;\n */\n ruleId: string;\n\n /**\n * `message` is a human-readable error message that describes the nature of the violation.\n * This can be the default error message from the violated `Rule`, or it can be a custom message that gives more context about the violation.\n *\n * @generated from field: optional string message = 3;\n */\n message: string;\n\n /**\n * `for_key` indicates whether the violation was caused by a map key, rather than a value.\n *\n * @generated from field: optional bool for_key = 4;\n */\n forKey: boolean;\n};\n\n/**\n * `Violation` represents a single instance where a validation rule, expressed\n * as a `Rule`, was not met. It provides information about the field that\n * caused the violation, the specific rule that wasn't fulfilled, and a\n * human-readable error message.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message User {\n * int32 age = 1 [(buf.validate.field).cel = {\n * id: \"user.age\",\n * expression: \"this < 18 ? 'User must be at least 18 years old' : ''\",\n * }];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```json\n * {\n * \"ruleId\": \"user.age\",\n * \"message\": \"User must be at least 18 years old\",\n * \"field\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 1,\n * \"fieldName\": \"age\",\n * \"fieldType\": \"TYPE_INT32\"\n * }\n * ]\n * },\n * \"rule\": {\n * \"elements\": [\n * {\n * \"fieldNumber\": 23,\n * \"fieldName\": \"cel\",\n * \"fieldType\": \"TYPE_MESSAGE\",\n * \"index\": \"0\"\n * }\n * ]\n * }\n * }\n * ```\n *\n * @generated from message buf.validate.Violation\n */\nexport type ViolationJson = {\n /**\n * `field` is a machine-readable path to the field that failed validation.\n * This could be a nested field, in which case the path will include all the parent fields leading to the actual field that caused the violation.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * }\n * ```\n *\n * It could produce the following violation:\n *\n * ```textproto\n * violation {\n * field { element { field_number: 1, field_name: \"a\", field_type: 8 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath field = 5;\n */\n field?: FieldPathJson;\n\n /**\n * `rule` is a machine-readable path that points to the specific rule that failed validation.\n * This will be a nested field starting from the FieldRules of the field that failed validation.\n * For custom rules, this will provide the path of the rule, e.g. `cel[0]`.\n *\n * For example, consider the following message:\n *\n * ```proto\n * message Message {\n * bool a = 1 [(buf.validate.field).required = true];\n * bool b = 2 [(buf.validate.field).cel = {\n * id: \"custom_rule\",\n * expression: \"!this ? 'b must be true': ''\"\n * }]\n * }\n * ```\n *\n * It could produce the following violations:\n *\n * ```textproto\n * violation {\n * rule { element { field_number: 25, field_name: \"required\", field_type: 8 } }\n * ...\n * }\n * violation {\n * rule { element { field_number: 23, field_name: \"cel\", field_type: 11, index: 0 } }\n * ...\n * }\n * ```\n *\n * @generated from field: optional buf.validate.FieldPath rule = 6;\n */\n rule?: FieldPathJson;\n\n /**\n * `rule_id` is the unique identifier of the `Rule` that was not fulfilled.\n * This is the same `id` that was specified in the `Rule` message, allowing easy tracing of which rule was violated.\n *\n * @generated from field: optional string rule_id = 2;\n */\n ruleId?: string;\n\n /**\n * `message` is a human-readable error message that describes the nature of the violation.\n * This can be the default error message from the violated `Rule`, or it can be a custom message that gives more context about the violation.\n *\n * @generated from field: optional string message = 3;\n */\n message?: string;\n\n /**\n * `for_key` indicates whether the violation was caused by a map key, rather than a value.\n *\n * @generated from field: optional bool for_key = 4;\n */\n forKey?: boolean;\n};\n\n/**\n * Describes the message buf.validate.Violation.\n * Use `create(ViolationSchema)` to create a new message.\n */\nexport const ViolationSchema: GenMessage<Violation, {jsonType: ViolationJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 28);\n\n/**\n * `FieldPath` provides a path to a nested protobuf field.\n *\n * This message provides enough information to render a dotted field path even without protobuf descriptors.\n * It also provides enough information to resolve a nested field through unknown wire data.\n *\n * @generated from message buf.validate.FieldPath\n */\nexport type FieldPath = Message<\"buf.validate.FieldPath\"> & {\n /**\n * `elements` contains each element of the path, starting from the root and recursing downward.\n *\n * @generated from field: repeated buf.validate.FieldPathElement elements = 1;\n */\n elements: FieldPathElement[];\n};\n\n/**\n * `FieldPath` provides a path to a nested protobuf field.\n *\n * This message provides enough information to render a dotted field path even without protobuf descriptors.\n * It also provides enough information to resolve a nested field through unknown wire data.\n *\n * @generated from message buf.validate.FieldPath\n */\nexport type FieldPathJson = {\n /**\n * `elements` contains each element of the path, starting from the root and recursing downward.\n *\n * @generated from field: repeated buf.validate.FieldPathElement elements = 1;\n */\n elements?: FieldPathElementJson[];\n};\n\n/**\n * Describes the message buf.validate.FieldPath.\n * Use `create(FieldPathSchema)` to create a new message.\n */\nexport const FieldPathSchema: GenMessage<FieldPath, {jsonType: FieldPathJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 29);\n\n/**\n * `FieldPathElement` provides enough information to nest through a single protobuf field.\n *\n * If the selected field is a map or repeated field, the `subscript` value selects a specific element from it.\n * A path that refers to a value nested under a map key or repeated field index will have a `subscript` value.\n * The `field_type` field allows unambiguous resolution of a field even if descriptors are not available.\n *\n * @generated from message buf.validate.FieldPathElement\n */\nexport type FieldPathElement = Message<\"buf.validate.FieldPathElement\"> & {\n /**\n * `field_number` is the field number this path element refers to.\n *\n * @generated from field: optional int32 field_number = 1;\n */\n fieldNumber: number;\n\n /**\n * `field_name` contains the field name this path element refers to.\n * This can be used to display a human-readable path even if the field number is unknown.\n *\n * @generated from field: optional string field_name = 2;\n */\n fieldName: string;\n\n /**\n * `field_type` specifies the type of this field. When using reflection, this value is not needed.\n *\n * This value is provided to make it possible to traverse unknown fields through wire data.\n * When traversing wire data, be mindful of both packed[1] and delimited[2] encoding schemes.\n *\n * [1]: https://protobuf.dev/programming-guides/encoding/#packed\n * [2]: https://protobuf.dev/programming-guides/encoding/#groups\n *\n * N.B.: Although groups are deprecated, the corresponding delimited encoding scheme is not, and\n * can be explicitly used in Protocol Buffers 2023 Edition.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type field_type = 3;\n */\n fieldType: FieldDescriptorProto_Type;\n\n /**\n * `key_type` specifies the map key type of this field. This value is useful when traversing\n * unknown fields through wire data: specifically, it allows handling the differences between\n * different integer encodings.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type key_type = 4;\n */\n keyType: FieldDescriptorProto_Type;\n\n /**\n * `value_type` specifies map value type of this field. This is useful if you want to display a\n * value inside unknown fields through wire data.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type value_type = 5;\n */\n valueType: FieldDescriptorProto_Type;\n\n /**\n * `subscript` contains a repeated index or map key, if this path element nests into a repeated or map field.\n *\n * @generated from oneof buf.validate.FieldPathElement.subscript\n */\n subscript: {\n /**\n * `index` specifies a 0-based index into a repeated field.\n *\n * @generated from field: uint64 index = 6;\n */\n value: bigint;\n case: \"index\";\n } | {\n /**\n * `bool_key` specifies a map key of type bool.\n *\n * @generated from field: bool bool_key = 7;\n */\n value: boolean;\n case: \"boolKey\";\n } | {\n /**\n * `int_key` specifies a map key of type int32, int64, sint32, sint64, sfixed32 or sfixed64.\n *\n * @generated from field: int64 int_key = 8;\n */\n value: bigint;\n case: \"intKey\";\n } | {\n /**\n * `uint_key` specifies a map key of type uint32, uint64, fixed32 or fixed64.\n *\n * @generated from field: uint64 uint_key = 9;\n */\n value: bigint;\n case: \"uintKey\";\n } | {\n /**\n * `string_key` specifies a map key of type string.\n *\n * @generated from field: string string_key = 10;\n */\n value: string;\n case: \"stringKey\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * `FieldPathElement` provides enough information to nest through a single protobuf field.\n *\n * If the selected field is a map or repeated field, the `subscript` value selects a specific element from it.\n * A path that refers to a value nested under a map key or repeated field index will have a `subscript` value.\n * The `field_type` field allows unambiguous resolution of a field even if descriptors are not available.\n *\n * @generated from message buf.validate.FieldPathElement\n */\nexport type FieldPathElementJson = {\n /**\n * `field_number` is the field number this path element refers to.\n *\n * @generated from field: optional int32 field_number = 1;\n */\n fieldNumber?: number;\n\n /**\n * `field_name` contains the field name this path element refers to.\n * This can be used to display a human-readable path even if the field number is unknown.\n *\n * @generated from field: optional string field_name = 2;\n */\n fieldName?: string;\n\n /**\n * `field_type` specifies the type of this field. When using reflection, this value is not needed.\n *\n * This value is provided to make it possible to traverse unknown fields through wire data.\n * When traversing wire data, be mindful of both packed[1] and delimited[2] encoding schemes.\n *\n * [1]: https://protobuf.dev/programming-guides/encoding/#packed\n * [2]: https://protobuf.dev/programming-guides/encoding/#groups\n *\n * N.B.: Although groups are deprecated, the corresponding delimited encoding scheme is not, and\n * can be explicitly used in Protocol Buffers 2023 Edition.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type field_type = 3;\n */\n fieldType?: FieldDescriptorProto_TypeJson;\n\n /**\n * `key_type` specifies the map key type of this field. This value is useful when traversing\n * unknown fields through wire data: specifically, it allows handling the differences between\n * different integer encodings.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type key_type = 4;\n */\n keyType?: FieldDescriptorProto_TypeJson;\n\n /**\n * `value_type` specifies map value type of this field. This is useful if you want to display a\n * value inside unknown fields through wire data.\n *\n * @generated from field: optional google.protobuf.FieldDescriptorProto.Type value_type = 5;\n */\n valueType?: FieldDescriptorProto_TypeJson;\n\n /**\n * `index` specifies a 0-based index into a repeated field.\n *\n * @generated from field: uint64 index = 6;\n */\n index?: string;\n\n /**\n * `bool_key` specifies a map key of type bool.\n *\n * @generated from field: bool bool_key = 7;\n */\n boolKey?: boolean;\n\n /**\n * `int_key` specifies a map key of type int32, int64, sint32, sint64, sfixed32 or sfixed64.\n *\n * @generated from field: int64 int_key = 8;\n */\n intKey?: string;\n\n /**\n * `uint_key` specifies a map key of type uint32, uint64, fixed32 or fixed64.\n *\n * @generated from field: uint64 uint_key = 9;\n */\n uintKey?: string;\n\n /**\n * `string_key` specifies a map key of type string.\n *\n * @generated from field: string string_key = 10;\n */\n stringKey?: string;\n};\n\n/**\n * Describes the message buf.validate.FieldPathElement.\n * Use `create(FieldPathElementSchema)` to create a new message.\n */\nexport const FieldPathElementSchema: GenMessage<FieldPathElement, {jsonType: FieldPathElementJson}> = /*@__PURE__*/\n messageDesc(file_buf_validate_validate, 30);\n\n/**\n * Specifies how `FieldRules.ignore` behaves, depending on the field's value, and\n * whether the field tracks presence.\n *\n * @generated from enum buf.validate.Ignore\n */\nexport enum Ignore {\n /**\n * Ignore rules if the field tracks presence and is unset. This is the default\n * behavior.\n *\n * In proto3, only message fields, members of a Protobuf `oneof`, and fields\n * with the `optional` label track presence. Consequently, the following fields\n * are always validated, whether a value is set or not:\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message RulesApply {\n * string email = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * int32 age = 2 [\n * (buf.validate.field).int32.gt = 0\n * ];\n * repeated string labels = 3 [\n * (buf.validate.field).repeated.min_items = 1\n * ];\n * }\n * ```\n *\n * In contrast, the following fields track presence, and are only validated if\n * a value is set:\n *\n * ```proto\n * syntax=\"proto3\";\n *\n * message RulesApplyIfSet {\n * optional string email = 1 [\n * (buf.validate.field).string.email = true\n * ];\n * oneof ref {\n * string reference = 2 [\n * (buf.validate.field).string.uuid = true\n * ];\n * string name = 3 [\n * (buf.validate.field).string.min_len = 4\n * ];\n * }\n * SomeMessage msg = 4 [\n * (buf.validate.field).cel = {/* ... *\\/}\n * ];\n * }\n * ```\n *\n * To ensure that such a field is set, add the `required` rule.\n *\n * To learn which fields track presence, see the\n * [Field Presence cheat sheet](https://protobuf.dev/programming-guides/field_presence/#cheat).\n *\n * @generated from enum value: IGNORE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Ignore rules if the field is unset, or set to the zero value.\n *\n * The zero value depends on the field type:\n * - For strings, the zero value is the empty string.\n * - For bytes, the zero value is empty bytes.\n * - For bool, the zero value is false.\n * - For numeric types, the zero value is zero.\n * - For enums, the zero value is the first defined enum value.\n * - For repeated fields, the zero is an empty list.\n * - For map fields, the zero is an empty map.\n * - For message fields, absence of the message (typically a null-value) is considered zero value.\n *\n * For fields that track presence (e.g. adding the `optional` label in proto3),\n * this a no-op and behavior is the same as the default `IGNORE_UNSPECIFIED`.\n *\n * @generated from enum value: IGNORE_IF_ZERO_VALUE = 1;\n */\n IF_ZERO_VALUE = 1,\n\n /**\n * Always ignore rules, including the `required` rule.\n *\n * This is useful for ignoring the rules of a referenced message, or to\n * temporarily ignore rules during development.\n *\n * ```proto\n * message MyMessage {\n * // The field's rules will always be ignored, including any validations\n * // on value's fields.\n * MyOtherMessage value = 1 [\n * (buf.validate.field).ignore = IGNORE_ALWAYS\n * ];\n * }\n * ```\n *\n * @generated from enum value: IGNORE_ALWAYS = 3;\n */\n ALWAYS = 3,\n}\n\n/**\n * Specifies how `FieldRules.ignore` behaves, depending on the field's value, and\n * whether the field tracks presence.\n *\n * @generated from enum buf.validate.Ignore\n */\nexport type IgnoreJson = \"IGNORE_UNSPECIFIED\" | \"IGNORE_IF_ZERO_VALUE\" | \"IGNORE_ALWAYS\";\n\n/**\n * Describes the enum buf.validate.Ignore.\n */\nexport const IgnoreSchema: GenEnum<Ignore, IgnoreJson> = /*@__PURE__*/\n enumDesc(file_buf_validate_validate, 0);\n\n/**\n * KnownRegex contains some well-known patterns.\n *\n * @generated from enum buf.validate.KnownRegex\n */\nexport enum KnownRegex {\n /**\n * @generated from enum value: KNOWN_REGEX_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * HTTP header name as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2).\n *\n * @generated from enum value: KNOWN_REGEX_HTTP_HEADER_NAME = 1;\n */\n HTTP_HEADER_NAME = 1,\n\n /**\n * HTTP header value as defined by [RFC 7230](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4).\n *\n * @generated from enum value: KNOWN_REGEX_HTTP_HEADER_VALUE = 2;\n */\n HTTP_HEADER_VALUE = 2,\n}\n\n/**\n * KnownRegex contains some well-known patterns.\n *\n * @generated from enum buf.validate.KnownRegex\n */\nexport type KnownRegexJson = \"KNOWN_REGEX_UNSPECIFIED\" | \"KNOWN_REGEX_HTTP_HEADER_NAME\" | \"KNOWN_REGEX_HTTP_HEADER_VALUE\";\n\n/**\n * Describes the enum buf.validate.KnownRegex.\n */\nexport const KnownRegexSchema: GenEnum<KnownRegex, KnownRegexJson> = /*@__PURE__*/\n enumDesc(file_buf_validate_validate, 1);\n\n/**\n * Rules specify the validations to be performed on this message. By default,\n * no validation is performed against a message.\n *\n * @generated from extension: optional buf.validate.MessageRules message = 1159;\n */\nexport const message: GenExtension<MessageOptions, MessageRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 0);\n\n/**\n * Rules specify the validations to be performed on this oneof. By default,\n * no validation is performed against a oneof.\n *\n * @generated from extension: optional buf.validate.OneofRules oneof = 1159;\n */\nexport const oneof: GenExtension<OneofOptions, OneofRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 1);\n\n/**\n * Rules specify the validations to be performed on this field. By default,\n * no validation is performed against a field.\n *\n * @generated from extension: optional buf.validate.FieldRules field = 1159;\n */\nexport const field: GenExtension<FieldOptions, FieldRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 2);\n\n/**\n * Specifies predefined rules. When extending a standard rule message,\n * this adds additional CEL expressions that apply when the extension is used.\n *\n * ```proto\n * extend buf.validate.Int32Rules {\n * bool is_zero [(buf.validate.predefined).cel = {\n * id: \"int32.is_zero\",\n * message: \"value must be zero\",\n * expression: \"!rule || this == 0\",\n * }];\n * }\n *\n * message Foo {\n * int32 reserved = 1 [(buf.validate.field).int32.(is_zero) = true];\n * }\n * ```\n *\n * @generated from extension: optional buf.validate.PredefinedRules predefined = 1160;\n */\nexport const predefined: GenExtension<FieldOptions, PredefinedRules> = /*@__PURE__*/\n extDesc(file_buf_validate_validate, 3);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/file.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/file.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_file: GenFile = /*@__PURE__*/\n fileDesc(\"Cihtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9maWxlLnByb3RvEh1tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MSJ+CgRGaWxlEisKBG5hbWUYASABKAlCHbpIGnIYEAIYgCAyEV5bXi9dKyhcL1teL10rKSokEhgKBGRhdGEYAiABKAxCCrpIB3oFGIC0iRMSIQoJbWltZV90eXBlGAMgASgJQgm6SAZyBBABGGRIAIgBAUIMCgpfbWltZV90eXBlYgZwcm90bzM\", [file_buf_validate_validate]);\n\n/**\n * File represents a file within a plugin package.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.File\n */\nexport type File = Message<\"mochabugapis.adapt.plugins.v1.File\"> & {\n /**\n * The 'name' or 'path' of the file\n *\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * 'data' contains the actual binary file data.\n *\n * @generated from field: bytes data = 2;\n */\n data: Uint8Array;\n\n /**\n * The mime type of the file\n *\n * @generated from field: optional string mime_type = 3;\n */\n mimeType?: string;\n};\n\n/**\n * File represents a file within a plugin package.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.File\n */\nexport type FileJson = {\n /**\n * The 'name' or 'path' of the file\n *\n * @generated from field: string name = 1;\n */\n name?: string;\n\n /**\n * 'data' contains the actual binary file data.\n *\n * @generated from field: bytes data = 2;\n */\n data?: string;\n\n /**\n * The mime type of the file\n *\n * @generated from field: optional string mime_type = 3;\n */\n mimeType?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.File.\n * Use `create(FileSchema)` to create a new message.\n */\nexport const FileSchema: GenMessage<File, {jsonType: FileJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_file, 0);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/manifest.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { ServiceDefinition, ServiceDefinitionJson } from \"./service_definition_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_service_definition } from \"./service_definition_pb\";\nimport type { Vertex, VertexJson } from \"./vertex_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_vertex } from \"./vertex_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/manifest.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_manifest: GenFile = /*@__PURE__*/\n fileDesc(\"Cixtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9tYW5pZmVzdC5wcm90bxIdbW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEi0QoKCE1hbmlmZXN0EjMKBG5hbWUYASABKAlCJbpIInIgEAEYZDIaXltfJGEtekEtWl1bXyRhLXpBLVowLTldKiQS1AEKB3ZlcnNpb24YAiABKAlCwgG6SL4BcrsBEAUYlgEyswFeKDB8WzEtOV1cZCopXC4oMHxbMS05XVxkKilcLigwfFsxLTldXGQqKSg/Oi0oKD86MHxbMS05XVxkKnxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSg/OlwuKD86MHxbMS05XVxkKnxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSkqKSk/KD86XCsoWzAtOWEtekEtWi1dKyg/OlwuWzAtOWEtekEtWi1dKykqKSk/JBIYCgVsYWJlbBgDIAEoCUIJukgGcgQQARhkEh8KC2Rlc2NyaXB0aW9uGAQgASgJQgq6SAdyBRABGPoBEh4KDG9yZ2FuaXphdGlvbhgFIAEoCUIIukgFcgOwAQESVQoIaG9tZXBhZ2UYBiABKAlCPrpIO3I5EAsYgCAyMl5odHRwczovL1thLXpBLVowLTkuLV0rKD86XC5bYS16QS1aXXsyLH0pKD86Ly4qKT8kSACIAQESVwoKcmVwb3NpdG9yeRgHIAEoCUI+ukg7cjkQCxiAIDIyXmh0dHBzOi8vW2EtekEtWjAtOS4tXSsoPzpcLlthLXpBLVpdezIsfSkoPzovLiopPyRIAYgBARLWAQoEYnVncxgIIAEoCULCAbpIvgG6AboBChJ2YWxpZF9lbWFpbF9vcl91cmwSIWJ1Z3MgbXVzdCBiZSBhIHZhbGlkIGVtYWlsIG9yIFVSTBqAAXNpemUodGhpcykgPj0gMiAmJiBzaXplKHRoaXMpIDw9IDQwOTYgJiYgKHRoaXMuaXNFbWFpbCgpIHx8IHRoaXMubWF0Y2hlcygnXmh0dHBzOi8vW2EtekEtWjAtOS4tXSsoPzpcXC5bYS16QS1aXXsyLH0pKD86Ly4qKT8kJykpSAKIAQESHgoGYXV0aG9yGAkgASgJQgm6SAZyBBABGGRIA4gBARJiCgRsb2dvGAogASgJQk+6SExyShACGIAgMkNeKFteL10rKC9bXi9dKykqKVwuKGdpZnxqcGd8anBlZ3xqZmlmfHBqcGVnfHBqcHxwbmd8c3ZnfHdlYnB8YXZpZikkSASIAQESqQEKCHZlcnRpY2VzGAsgAygLMiUubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuVmVydGV4QnC6SG26AWIKE3ZlcnRleF91bmlxdWVfbmFtZXMSI2EgbmFtZSBjYW5ub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlGiZ0aGlzLm1hcCh2ZXJ0ZXgsIHZlcnRleC5uYW1lKS51bmlxdWUoKZIBBQgBEPQDEsMBChNzZXJ2aWNlX2RlZmluaXRpb25zGAwgAygLMjAubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuU2VydmljZURlZmluaXRpb25CdLpIcboBZgoVc2VydmljZXNfdW5pcXVlX25hbWVzEiNhIG5hbWUgY2Fubm90IGFwcGVhciBtb3JlIHRoYW4gb25jZRoodGhpcy5tYXAoc2VydmljZSwgc2VydmljZS5uYW1lKS51bmlxdWUoKZIBBQgAEPQDEiYKD3N5c3RlbV9zZXJ2aWNlcxgNIAMoCUINukgKkgEHCAAQ9AMYAUILCglfaG9tZXBhZ2VCDQoLX3JlcG9zaXRvcnlCBwoFX2J1Z3NCCQoHX2F1dGhvckIHCgVfbG9nb2IGcHJvdG8z\", [file_buf_validate_validate, file_mochabugapis_adapt_plugins_v1_service_definition, file_mochabugapis_adapt_plugins_v1_vertex]);\n\n/**\n * Manifest describes a plugin and its properties.\n *\n * ## Architecture Overview\n *\n * A plugin consists of:\n * 1. **Vertices**: The actual workflow nodes that users add to automation graphs\n * 2. **Service Definitions**: Flat declarations of services (OAuth2, HTTP Proxy, Variables, Groups, OneOf)\n * 3. **System Services**: String array referencing service definitions used at the plugin level\n *\n * ## Service Architecture\n *\n * **Service definitions are ALWAYS flat** - they exist at the top level of the manifest\n * and are never nested within each other. This includes:\n * - Oauth2Definition\n * - HttpProxyDefinition\n * - VariableDefinition\n * - GroupedDefinition (references other flat definitions)\n * - OneOfDefinition (references other flat definitions)\n *\n * **Services are referenced by name as strings**. Service lists are string arrays where each\n * string must match a ServiceDefinition's `name`. Services exist at two levels:\n * - `system_services`: Plugin-level services configured once for the entire plugin\n * - `user_services` (in Vertex): Vertex-level services configured per vertex instance\n *\n * The `optional` field in ServiceDefinition controls whether a service must be configured:\n * - `optional: false` (default): User MUST configure this service\n * - `optional: true`: User MAY skip configuring this service\n *\n * ## Example Structure\n *\n * ```protobuf\n * Manifest {\n * name: \"stripe_plugin\"\n * version: \"1.0.0\"\n *\n * // Flat service definitions at manifest level\n * service_definitions: [\n * { name: \"stripe_oauth\", oauth2: {...} },\n * { name: \"stripe_api\", http_proxy: {...} },\n * { name: \"webhook_secret\", variable: {...} }\n * ]\n *\n * // System-level services (plugin-wide)\n * // Each string references a service definition name\n * system_services: [\"stripe_oauth\"]\n *\n * // Vertices with their own service references\n * vertices: [\n * {\n * name: \"CreatePayment\",\n * user_services: [\"stripe_api\", \"webhook_secret\"]\n * }\n * ]\n * }\n * ```\n *\n * ## Security Considerations\n *\n * The platform ensures that secrets and certificates are stored and transmitted securely.\n *\n * *** Plugin authors must also ensure that their implementations\n * handle sensitive data appropriately! ***\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Manifest\n */\nexport type Manifest = Message<\"mochabugapis.adapt.plugins.v1.Manifest\"> & {\n /**\n * 'name' is the alpha-numeric identifier of the plugin. Must be conform to a ES variable name\n *\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * 'version' is the plugin's version, following SemVer 2.0: https://semver.org/\n *\n * @generated from field: string version = 2;\n */\n version: string;\n\n /**\n * 'label' is a human-friendly label displayed in the UI.\n *\n * @generated from field: string label = 3;\n */\n label: string;\n\n /**\n * 'description' is a short, human-friendly description displayed in the UI.\n *\n * @generated from field: string description = 4;\n */\n description: string;\n\n /**\n * 'organization' is the id of the organization the user belongs to.\n *\n * @generated from field: string organization = 5;\n */\n organization: string;\n\n /**\n * 'homepage' is the plugin's homepage URL.\n *\n * @generated from field: optional string homepage = 6;\n */\n homepage?: string;\n\n /**\n * 'repository' is the plugin's repository URL.\n *\n * @generated from field: optional string repository = 7;\n */\n repository?: string;\n\n /**\n * 'bugs' is the URL or email for reporting bugs.\n *\n * @generated from field: optional string bugs = 8;\n */\n bugs?: string;\n\n /**\n * 'author' is the name of the plugin's author.\n *\n * @generated from field: optional string author = 9;\n */\n author?: string;\n\n /**\n * 'logo' is an optional path to the plugin logo.\n * The logo will be resized to a maximum of 80x80 pixels.\n * - Supported file formats:\n * - GIF: .gif\n * - JPEG: .jpg, .jpeg, .jfif, .pjpeg, .pjp\n * - PNG: .png\n * - SVG: .svg\n * - WEBP: .webp\n * - AVIF: .avif\n *\n * @generated from field: optional string logo = 10;\n */\n logo?: string;\n\n /**\n * 'vertices' is a list of vertices that constitute the plugin.\n * this is filled in automatically when configurating a project on the filesystem\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.Vertex vertices = 11;\n */\n vertices: Vertex[];\n\n /**\n * 'service_definitions' are flat service definitions that can be referenced by bindings.\n *\n * All service definitions exist at this top level - they are NEVER nested.\n * Definitions can be referenced by:\n * - system_services (plugin-level bindings)\n * - user_services in vertices (vertex-level bindings)\n *\n * Each definition has a unique name used for referencing in bindings.\n * Service types: OAuth2, HTTP Proxy, Variable, Group, OneOf.\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.ServiceDefinition service_definitions = 12;\n */\n serviceDefinitions: ServiceDefinition[];\n\n /**\n * 'system_services' are plugin-level services configured once for the entire plugin.\n *\n * System services are:\n * - Configured by plugin administrators (via PostPluginSettings API)\n * - Shared across all vertices in the plugin\n * - Required to be configured before the plugin can be used (status = ACTIVE), unless marked optional\n *\n * This is a string array where each string directly references a ServiceDefinition by its name.\n * Plugin code accesses these services using the referenced service name.\n *\n * The `optional` field in the ServiceDefinition controls whether configuration is required:\n * - If ServiceDefinition.optional = false (default): MUST be configured\n * - If ServiceDefinition.optional = true: MAY be skipped\n *\n * Example:\n * service_definitions: [\n * { name: \"github_oauth\", oauth2: {...} },\n * { name: \"analytics\", oauth2: {...}, optional: true }\n * ]\n * system_services: [\"github_oauth\", \"analytics\"]\n * Plugin code references: \"github_oauth\", \"analytics\"\n *\n * IMPORTANT: For OAuth2 CODE grant type services, the service definition name is used\n * for callback URL generation.\n *\n * @generated from field: repeated string system_services = 13;\n */\n systemServices: string[];\n};\n\n/**\n * Manifest describes a plugin and its properties.\n *\n * ## Architecture Overview\n *\n * A plugin consists of:\n * 1. **Vertices**: The actual workflow nodes that users add to automation graphs\n * 2. **Service Definitions**: Flat declarations of services (OAuth2, HTTP Proxy, Variables, Groups, OneOf)\n * 3. **System Services**: String array referencing service definitions used at the plugin level\n *\n * ## Service Architecture\n *\n * **Service definitions are ALWAYS flat** - they exist at the top level of the manifest\n * and are never nested within each other. This includes:\n * - Oauth2Definition\n * - HttpProxyDefinition\n * - VariableDefinition\n * - GroupedDefinition (references other flat definitions)\n * - OneOfDefinition (references other flat definitions)\n *\n * **Services are referenced by name as strings**. Service lists are string arrays where each\n * string must match a ServiceDefinition's `name`. Services exist at two levels:\n * - `system_services`: Plugin-level services configured once for the entire plugin\n * - `user_services` (in Vertex): Vertex-level services configured per vertex instance\n *\n * The `optional` field in ServiceDefinition controls whether a service must be configured:\n * - `optional: false` (default): User MUST configure this service\n * - `optional: true`: User MAY skip configuring this service\n *\n * ## Example Structure\n *\n * ```protobuf\n * Manifest {\n * name: \"stripe_plugin\"\n * version: \"1.0.0\"\n *\n * // Flat service definitions at manifest level\n * service_definitions: [\n * { name: \"stripe_oauth\", oauth2: {...} },\n * { name: \"stripe_api\", http_proxy: {...} },\n * { name: \"webhook_secret\", variable: {...} }\n * ]\n *\n * // System-level services (plugin-wide)\n * // Each string references a service definition name\n * system_services: [\"stripe_oauth\"]\n *\n * // Vertices with their own service references\n * vertices: [\n * {\n * name: \"CreatePayment\",\n * user_services: [\"stripe_api\", \"webhook_secret\"]\n * }\n * ]\n * }\n * ```\n *\n * ## Security Considerations\n *\n * The platform ensures that secrets and certificates are stored and transmitted securely.\n *\n * *** Plugin authors must also ensure that their implementations\n * handle sensitive data appropriately! ***\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Manifest\n */\nexport type ManifestJson = {\n /**\n * 'name' is the alpha-numeric identifier of the plugin. Must be conform to a ES variable name\n *\n * @generated from field: string name = 1;\n */\n name?: string;\n\n /**\n * 'version' is the plugin's version, following SemVer 2.0: https://semver.org/\n *\n * @generated from field: string version = 2;\n */\n version?: string;\n\n /**\n * 'label' is a human-friendly label displayed in the UI.\n *\n * @generated from field: string label = 3;\n */\n label?: string;\n\n /**\n * 'description' is a short, human-friendly description displayed in the UI.\n *\n * @generated from field: string description = 4;\n */\n description?: string;\n\n /**\n * 'organization' is the id of the organization the user belongs to.\n *\n * @generated from field: string organization = 5;\n */\n organization?: string;\n\n /**\n * 'homepage' is the plugin's homepage URL.\n *\n * @generated from field: optional string homepage = 6;\n */\n homepage?: string;\n\n /**\n * 'repository' is the plugin's repository URL.\n *\n * @generated from field: optional string repository = 7;\n */\n repository?: string;\n\n /**\n * 'bugs' is the URL or email for reporting bugs.\n *\n * @generated from field: optional string bugs = 8;\n */\n bugs?: string;\n\n /**\n * 'author' is the name of the plugin's author.\n *\n * @generated from field: optional string author = 9;\n */\n author?: string;\n\n /**\n * 'logo' is an optional path to the plugin logo.\n * The logo will be resized to a maximum of 80x80 pixels.\n * - Supported file formats:\n * - GIF: .gif\n * - JPEG: .jpg, .jpeg, .jfif, .pjpeg, .pjp\n * - PNG: .png\n * - SVG: .svg\n * - WEBP: .webp\n * - AVIF: .avif\n *\n * @generated from field: optional string logo = 10;\n */\n logo?: string;\n\n /**\n * 'vertices' is a list of vertices that constitute the plugin.\n * this is filled in automatically when configurating a project on the filesystem\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.Vertex vertices = 11;\n */\n vertices?: VertexJson[];\n\n /**\n * 'service_definitions' are flat service definitions that can be referenced by bindings.\n *\n * All service definitions exist at this top level - they are NEVER nested.\n * Definitions can be referenced by:\n * - system_services (plugin-level bindings)\n * - user_services in vertices (vertex-level bindings)\n *\n * Each definition has a unique name used for referencing in bindings.\n * Service types: OAuth2, HTTP Proxy, Variable, Group, OneOf.\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.ServiceDefinition service_definitions = 12;\n */\n serviceDefinitions?: ServiceDefinitionJson[];\n\n /**\n * 'system_services' are plugin-level services configured once for the entire plugin.\n *\n * System services are:\n * - Configured by plugin administrators (via PostPluginSettings API)\n * - Shared across all vertices in the plugin\n * - Required to be configured before the plugin can be used (status = ACTIVE), unless marked optional\n *\n * This is a string array where each string directly references a ServiceDefinition by its name.\n * Plugin code accesses these services using the referenced service name.\n *\n * The `optional` field in the ServiceDefinition controls whether configuration is required:\n * - If ServiceDefinition.optional = false (default): MUST be configured\n * - If ServiceDefinition.optional = true: MAY be skipped\n *\n * Example:\n * service_definitions: [\n * { name: \"github_oauth\", oauth2: {...} },\n * { name: \"analytics\", oauth2: {...}, optional: true }\n * ]\n * system_services: [\"github_oauth\", \"analytics\"]\n * Plugin code references: \"github_oauth\", \"analytics\"\n *\n * IMPORTANT: For OAuth2 CODE grant type services, the service definition name is used\n * for callback URL generation.\n *\n * @generated from field: repeated string system_services = 13;\n */\n systemServices?: string[];\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Manifest.\n * Use `create(ManifestSchema)` to create a new message.\n */\nexport const ManifestSchema: GenMessage<Manifest, {jsonType: ManifestJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_manifest, 0);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/service_definition.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { GroupedDefinition, GroupedDefinitionJson, OneOfDefinition, OneOfDefinitionJson } from \"./compound_services_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_compound_services } from \"./compound_services_pb\";\nimport type { HttpProxyDefinition, HttpProxyDefinitionJson } from \"./http_proxy_service_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_http_proxy_service } from \"./http_proxy_service_pb\";\nimport type { Oauth2Definition, Oauth2DefinitionJson } from \"./oauth2_service_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_oauth2_service } from \"./oauth2_service_pb\";\nimport type { VariableDefinition, VariableDefinitionJson } from \"./variable_service_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_variable_service } from \"./variable_service_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/service_definition.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_service_definition: GenFile = /*@__PURE__*/\n fileDesc(\"CjZtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9zZXJ2aWNlX2RlZmluaXRpb24ucHJvdG8SHW1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxIqMEChFTZXJ2aWNlRGVmaW5pdGlvbhIzCgRuYW1lGAEgASgJQiW6SCJyIBABGGQyGl5bXyRhLXpBLVpdW18kYS16QS1aMC05XSokEhgKBWxhYmVsGAIgASgJQgm6SAZyBBABGGQSJAoLZGVzY3JpcHRpb24YAyABKAlCCrpIB3IFEAEY+gFIAYgBARIVCghvcHRpb25hbBgEIAEoCEgCiAEBEkUKCHZhcmlhYmxlGAUgASgLMjEubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuVmFyaWFibGVEZWZpbml0aW9uSAASQQoGb2F1dGgyGAYgASgLMi8ubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuT2F1dGgyRGVmaW5pdGlvbkgAEkgKCmh0dHBfcHJveHkYByABKAsyMi5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5IdHRwUHJveHlEZWZpbml0aW9uSAASQQoFZ3JvdXAYCCABKAsyMC5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5Hcm91cGVkRGVmaW5pdGlvbkgAEj8KBW9uZW9mGAkgASgLMi4ubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuT25lT2ZEZWZpbml0aW9uSABCDQoEdHlwZRIFukgCCAFCDgoMX2Rlc2NyaXB0aW9uQgsKCV9vcHRpb25hbGIGcHJvdG8z\", [file_buf_validate_validate, file_mochabugapis_adapt_plugins_v1_compound_services, file_mochabugapis_adapt_plugins_v1_http_proxy_service, file_mochabugapis_adapt_plugins_v1_oauth2_service, file_mochabugapis_adapt_plugins_v1_variable_service]);\n\n/**\n * The service definition - a flat declaration of a service that can be referenced by bindings.\n *\n * ## Architecture Principle: Service Definitions Are Always Flat\n *\n * Service definitions exist ONLY at the Manifest.service_definitions level and are NEVER nested.\n * Each definition has a unique name and a specific type (Variable, OAuth2, HTTP Proxy, Group, OneOf).\n *\n * ## Referencing from Service Lists\n *\n * Service lists (Manifest.system_services and Vertex.user_services) are string arrays that\n * directly reference service definitions by name. Each string must match a ServiceDefinition's `name`.\n *\n * ## Service Types\n *\n * - **VariableDefinition**: JSON variable with schema validation\n * - **Oauth2Definition**: OAuth2 authentication (various grant types)\n * - **HttpProxyDefinition**: HTTP proxy with TLS and header injection\n * - **GroupedDefinition**: References multiple other flat definitions as a group\n * - **OneOfDefinition**: Allows user to choose one from multiple flat definitions\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"api_key\", variable: { schema: {...} } },\n * { name: \"oauth\", oauth2: { grant_type: AUTHORIZATION_CODE, ... } },\n * { name: \"proxy\", http_proxy: { allowed_hosts: [...], ... } }\n * ]\n *\n * // Referenced in service lists (strings matching service definition names)\n * system_services: [\"oauth\"]\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.ServiceDefinition\n */\nexport type ServiceDefinition = Message<\"mochabugapis.adapt.plugins.v1.ServiceDefinition\"> & {\n /**\n * 'name' is the identifier of the service, referenced in code\n *\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * 'label' is a human-friendly label shown in the UI\n *\n * @generated from field: string label = 2;\n */\n label: string;\n\n /**\n * 'description' is an optional detailed description of the service\n *\n * @generated from field: optional string description = 3;\n */\n description?: string;\n\n /**\n * Whether this service is optional.\n *\n * If false (default):\n * - User MUST configure this service during installation\n * - Plugin can safely assume the service exists\n *\n * If true:\n * - User MAY skip configuring this service\n * - Plugin must handle the service being absent\n * - Useful for optional features (analytics, monitoring, etc.)\n *\n * @generated from field: optional bool optional = 4;\n */\n optional?: boolean;\n\n /**\n * The actual type of service that the definition is\n *\n * @generated from oneof mochabugapis.adapt.plugins.v1.ServiceDefinition.type\n */\n type: {\n /**\n * Variable service containing arbitrary JSON\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.VariableDefinition variable = 5;\n */\n value: VariableDefinition;\n case: \"variable\";\n } | {\n /**\n * An OAuth2 service\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.Oauth2Definition oauth2 = 6;\n */\n value: Oauth2Definition;\n case: \"oauth2\";\n } | {\n /**\n * HTTP proxy service with TLS and header injection\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.HttpProxyDefinition http_proxy = 7;\n */\n value: HttpProxyDefinition;\n case: \"httpProxy\";\n } | {\n /**\n * A group definition, requiring it to be submitted as a group\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.GroupedDefinition group = 8;\n */\n value: GroupedDefinition;\n case: \"group\";\n } | {\n /**\n * A oneof definition, allowing one of several sub-definitions to be chosen\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.OneOfDefinition oneof = 9;\n */\n value: OneOfDefinition;\n case: \"oneof\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * The service definition - a flat declaration of a service that can be referenced by bindings.\n *\n * ## Architecture Principle: Service Definitions Are Always Flat\n *\n * Service definitions exist ONLY at the Manifest.service_definitions level and are NEVER nested.\n * Each definition has a unique name and a specific type (Variable, OAuth2, HTTP Proxy, Group, OneOf).\n *\n * ## Referencing from Service Lists\n *\n * Service lists (Manifest.system_services and Vertex.user_services) are string arrays that\n * directly reference service definitions by name. Each string must match a ServiceDefinition's `name`.\n *\n * ## Service Types\n *\n * - **VariableDefinition**: JSON variable with schema validation\n * - **Oauth2Definition**: OAuth2 authentication (various grant types)\n * - **HttpProxyDefinition**: HTTP proxy with TLS and header injection\n * - **GroupedDefinition**: References multiple other flat definitions as a group\n * - **OneOfDefinition**: Allows user to choose one from multiple flat definitions\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"api_key\", variable: { schema: {...} } },\n * { name: \"oauth\", oauth2: { grant_type: AUTHORIZATION_CODE, ... } },\n * { name: \"proxy\", http_proxy: { allowed_hosts: [...], ... } }\n * ]\n *\n * // Referenced in service lists (strings matching service definition names)\n * system_services: [\"oauth\"]\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.ServiceDefinition\n */\nexport type ServiceDefinitionJson = {\n /**\n * 'name' is the identifier of the service, referenced in code\n *\n * @generated from field: string name = 1;\n */\n name?: string;\n\n /**\n * 'label' is a human-friendly label shown in the UI\n *\n * @generated from field: string label = 2;\n */\n label?: string;\n\n /**\n * 'description' is an optional detailed description of the service\n *\n * @generated from field: optional string description = 3;\n */\n description?: string;\n\n /**\n * Whether this service is optional.\n *\n * If false (default):\n * - User MUST configure this service during installation\n * - Plugin can safely assume the service exists\n *\n * If true:\n * - User MAY skip configuring this service\n * - Plugin must handle the service being absent\n * - Useful for optional features (analytics, monitoring, etc.)\n *\n * @generated from field: optional bool optional = 4;\n */\n optional?: boolean;\n\n /**\n * Variable service containing arbitrary JSON\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.VariableDefinition variable = 5;\n */\n variable?: VariableDefinitionJson;\n\n /**\n * An OAuth2 service\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.Oauth2Definition oauth2 = 6;\n */\n oauth2?: Oauth2DefinitionJson;\n\n /**\n * HTTP proxy service with TLS and header injection\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.HttpProxyDefinition http_proxy = 7;\n */\n httpProxy?: HttpProxyDefinitionJson;\n\n /**\n * A group definition, requiring it to be submitted as a group\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.GroupedDefinition group = 8;\n */\n group?: GroupedDefinitionJson;\n\n /**\n * A oneof definition, allowing one of several sub-definitions to be chosen\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.OneOfDefinition oneof = 9;\n */\n oneof?: OneOfDefinitionJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.ServiceDefinition.\n * Use `create(ServiceDefinitionSchema)` to create a new message.\n */\nexport const ServiceDefinitionSchema: GenMessage<ServiceDefinition, {jsonType: ServiceDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_service_definition, 0);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/compound_services.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/compound_services.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_compound_services: GenFile = /*@__PURE__*/\n fileDesc(\"CjVtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9jb21wb3VuZF9zZXJ2aWNlcy5wcm90bxIdbW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEiJQoRR3JvdXBlZERlZmluaXRpb24SEAoIc2VydmljZXMYASADKAkikQMKD09uZU9mRGVmaW5pdGlvbhKFAQoHb3B0aW9ucxgBIAMoCzI7Lm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk9uZU9mRGVmaW5pdGlvbi5PcHRpb25zRW50cnlCN7pINJoBMQgBEDIiInIgEAEYZDIaXltfJGEtekEtWl1bXyRhLXpBLVowLTldKiQqB3IFEAEY+gESOwoHZGVmYXVsdBgCIAEoCUIlukgiciAQARhkMhpeW18kYS16QS1aXVtfJGEtekEtWjAtOV0qJEgAiAEBGi4KDE9wdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBOn26SHoaeAoSZGVmYXVsdF9pbl9vcHRpb25zEi5kZWZhdWx0IG11c3QgZXhpc3QgYXMgYSBrZXkgaW4gdGhlIG9wdGlvbnMgbWFwGjIhaGFzKHRoaXMuZGVmYXVsdCkgfHwgdGhpcy5kZWZhdWx0IGluIHRoaXMub3B0aW9uc0IKCghfZGVmYXVsdGIGcHJvdG8z\", [file_buf_validate_validate]);\n\n/**\n * A grouped service definition that references multiple other flat service definitions.\n *\n * ## Architecture: Groups Reference Flat Definitions\n *\n * GroupedDefinition is itself a flat service definition at the Manifest.service_definitions level.\n * It references OTHER flat service definitions by name as a string array.\n *\n * ## Purpose\n *\n * Groups allow plugin authors to bundle related services together. For example:\n * - Production and sandbox environments for the same API\n * - Multiple related API keys\n * - Primary and backup authentication methods\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"stripe_prod\", label: \"Stripe Production\", oauth2: {...} },\n * { name: \"stripe_sandbox\", label: \"Stripe Sandbox\", oauth2: {...}, optional: true },\n * {\n * name: \"stripe_envs\",\n * label: \"Stripe Environments\",\n * group: {\n * services: [\"stripe_prod\", \"stripe_sandbox\"]\n * }\n * }\n * ]\n *\n * // Referenced in system services list\n * system_services: [\"stripe_envs\"]\n *\n * // Plugin code accesses members with dot notation:\n * \"stripe_envs.stripe_prod\", \"stripe_envs.stripe_sandbox\"\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.GroupedDefinition\n */\nexport type GroupedDefinition = Message<\"mochabugapis.adapt.plugins.v1.GroupedDefinition\"> & {\n /**\n * References to other flat service definitions that comprise this group\n *\n * @generated from field: repeated string services = 1;\n */\n services: string[];\n};\n\n/**\n * A grouped service definition that references multiple other flat service definitions.\n *\n * ## Architecture: Groups Reference Flat Definitions\n *\n * GroupedDefinition is itself a flat service definition at the Manifest.service_definitions level.\n * It references OTHER flat service definitions by name as a string array.\n *\n * ## Purpose\n *\n * Groups allow plugin authors to bundle related services together. For example:\n * - Production and sandbox environments for the same API\n * - Multiple related API keys\n * - Primary and backup authentication methods\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"stripe_prod\", label: \"Stripe Production\", oauth2: {...} },\n * { name: \"stripe_sandbox\", label: \"Stripe Sandbox\", oauth2: {...}, optional: true },\n * {\n * name: \"stripe_envs\",\n * label: \"Stripe Environments\",\n * group: {\n * services: [\"stripe_prod\", \"stripe_sandbox\"]\n * }\n * }\n * ]\n *\n * // Referenced in system services list\n * system_services: [\"stripe_envs\"]\n *\n * // Plugin code accesses members with dot notation:\n * \"stripe_envs.stripe_prod\", \"stripe_envs.stripe_sandbox\"\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.GroupedDefinition\n */\nexport type GroupedDefinitionJson = {\n /**\n * References to other flat service definitions that comprise this group\n *\n * @generated from field: repeated string services = 1;\n */\n services?: string[];\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.GroupedDefinition.\n * Use `create(GroupedDefinitionSchema)` to create a new message.\n */\nexport const GroupedDefinitionSchema: GenMessage<GroupedDefinition, {jsonType: GroupedDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_compound_services, 0);\n\n/**\n * A one-of service definition that allows users to choose from multiple flat service definitions.\n *\n * ## Architecture: One-Of References Flat Definitions\n *\n * OneOfDefinition is itself a flat service definition at the Manifest.service_definitions level.\n * It references OTHER flat service definitions by name.\n *\n * ## Purpose\n *\n * One-of definitions allow plugins to support multiple alternative implementations:\n * - Different payment providers (Stripe, PayPal, Square)\n * - Different authentication methods (OAuth2, API Key, mTLS)\n * - Different deployment environments\n *\n * Users choose ONE option during plugin installation/configuration.\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"stripe_oauth\", label: \"Stripe OAuth\", oauth2: {...} },\n * { name: \"paypal_oauth\", label: \"PayPal OAuth\", oauth2: {...} },\n * { name: \"square_oauth\", label: \"Square OAuth\", oauth2: {...} },\n * {\n * name: \"payment_provider\",\n * label: \"Payment Provider\",\n * oneof: {\n * options: {\n * \"stripe_oauth\": \"Stripe\",\n * \"paypal_oauth\": \"PayPal\",\n * \"square_oauth\": \"Square\"\n * },\n * default: \"stripe_oauth\"\n * }\n * }\n * ]\n *\n * // Referenced in system services list\n * system_services: [\"payment_provider\"]\n *\n * // Plugin code accesses using the service name:\n * \"payment_provider\" (regardless of which provider user chose)\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.OneOfDefinition\n */\nexport type OneOfDefinition = Message<\"mochabugapis.adapt.plugins.v1.OneOfDefinition\"> & {\n /**\n * Map of service definition options users can choose from.\n *\n * Key: Service definition name (from Manifest.service_definitions)\n * Value: Human-friendly label shown to users during selection\n *\n * The map key must reference an existing ServiceDefinition.name.\n * The map value is displayed to users when choosing between options.\n *\n * ## Examples\n *\n * Basic options:\n * options: {\n * \"stripe_oauth\": \"Stripe\",\n * \"paypal_oauth\": \"PayPal\"\n * }\n *\n * Descriptive labels:\n * options: {\n * \"stripe_oauth\": \"Stripe (recommended for production)\",\n * \"paypal_oauth\": \"PayPal (simpler setup)\"\n * }\n *\n * @generated from field: map<string, string> options = 1;\n */\n options: { [key: string]: string };\n\n /**\n * Optional default selection.\n *\n * If specified, this service definition will be pre-selected in the UI during installation.\n * Users can still choose a different option.\n *\n * The default value MUST match one of the keys in the options map.\n *\n * Use this to:\n * - Suggest the most common choice\n * - Indicate the recommended option\n * - Set a safe default for new users\n *\n * ## Default Behavior: System Settings vs User Settings\n *\n * **System Settings** (Manifest.system_services):\n * - Default selection is automatically applied when the plugin is installed\n * - The service is marked as \"configured\" if the default option has all required values\n * - Plugin creators define and approve these defaults\n *\n * **User Settings** (Vertex.user_services):\n * - Default selection is a UI hint only and NOT automatically applied\n * - The service is NOT marked as \"configured\" until the user explicitly submits settings\n * - Users must review and approve the selection, even with a default present\n * - This ensures users actively consent to which option is selected\n *\n * ## Rationale\n *\n * System settings use automatic defaults because the plugin creator (who defines\n * the defaults) is also the one approving them during plugin development.\n *\n * User settings require explicit submission because end users need to review and\n * consciously approve which option is selected and configured.\n *\n * @generated from field: optional string default = 2;\n */\n default?: string;\n};\n\n/**\n * A one-of service definition that allows users to choose from multiple flat service definitions.\n *\n * ## Architecture: One-Of References Flat Definitions\n *\n * OneOfDefinition is itself a flat service definition at the Manifest.service_definitions level.\n * It references OTHER flat service definitions by name.\n *\n * ## Purpose\n *\n * One-of definitions allow plugins to support multiple alternative implementations:\n * - Different payment providers (Stripe, PayPal, Square)\n * - Different authentication methods (OAuth2, API Key, mTLS)\n * - Different deployment environments\n *\n * Users choose ONE option during plugin installation/configuration.\n *\n * ## Example\n *\n * ```protobuf\n * // In Manifest.service_definitions\n * [\n * { name: \"stripe_oauth\", label: \"Stripe OAuth\", oauth2: {...} },\n * { name: \"paypal_oauth\", label: \"PayPal OAuth\", oauth2: {...} },\n * { name: \"square_oauth\", label: \"Square OAuth\", oauth2: {...} },\n * {\n * name: \"payment_provider\",\n * label: \"Payment Provider\",\n * oneof: {\n * options: {\n * \"stripe_oauth\": \"Stripe\",\n * \"paypal_oauth\": \"PayPal\",\n * \"square_oauth\": \"Square\"\n * },\n * default: \"stripe_oauth\"\n * }\n * }\n * ]\n *\n * // Referenced in system services list\n * system_services: [\"payment_provider\"]\n *\n * // Plugin code accesses using the service name:\n * \"payment_provider\" (regardless of which provider user chose)\n * ```\n *\n * @generated from message mochabugapis.adapt.plugins.v1.OneOfDefinition\n */\nexport type OneOfDefinitionJson = {\n /**\n * Map of service definition options users can choose from.\n *\n * Key: Service definition name (from Manifest.service_definitions)\n * Value: Human-friendly label shown to users during selection\n *\n * The map key must reference an existing ServiceDefinition.name.\n * The map value is displayed to users when choosing between options.\n *\n * ## Examples\n *\n * Basic options:\n * options: {\n * \"stripe_oauth\": \"Stripe\",\n * \"paypal_oauth\": \"PayPal\"\n * }\n *\n * Descriptive labels:\n * options: {\n * \"stripe_oauth\": \"Stripe (recommended for production)\",\n * \"paypal_oauth\": \"PayPal (simpler setup)\"\n * }\n *\n * @generated from field: map<string, string> options = 1;\n */\n options?: { [key: string]: string };\n\n /**\n * Optional default selection.\n *\n * If specified, this service definition will be pre-selected in the UI during installation.\n * Users can still choose a different option.\n *\n * The default value MUST match one of the keys in the options map.\n *\n * Use this to:\n * - Suggest the most common choice\n * - Indicate the recommended option\n * - Set a safe default for new users\n *\n * ## Default Behavior: System Settings vs User Settings\n *\n * **System Settings** (Manifest.system_services):\n * - Default selection is automatically applied when the plugin is installed\n * - The service is marked as \"configured\" if the default option has all required values\n * - Plugin creators define and approve these defaults\n *\n * **User Settings** (Vertex.user_services):\n * - Default selection is a UI hint only and NOT automatically applied\n * - The service is NOT marked as \"configured\" until the user explicitly submits settings\n * - Users must review and approve the selection, even with a default present\n * - This ensures users actively consent to which option is selected\n *\n * ## Rationale\n *\n * System settings use automatic defaults because the plugin creator (who defines\n * the defaults) is also the one approving them during plugin development.\n *\n * User settings require explicit submission because end users need to review and\n * consciously approve which option is selected and configured.\n *\n * @generated from field: optional string default = 2;\n */\n default?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.OneOfDefinition.\n * Use `create(OneOfDefinitionSchema)` to create a new message.\n */\nexport const OneOfDefinitionSchema: GenMessage<OneOfDefinition, {jsonType: OneOfDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_compound_services, 1);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/http_proxy_service.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenEnum, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { File, FileJson } from \"./file_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_file } from \"./file_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/http_proxy_service.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_http_proxy_service: GenFile = /*@__PURE__*/\n fileDesc(\"CjZtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9odHRwX3Byb3h5X3NlcnZpY2UucHJvdG8SHW1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxItMFChNIdHRwUHJveHlEZWZpbml0aW9uEo4BCg1hbGxvd2VkX2hvc3RzGAEgAygJQne6SHSSAXEIARBkGAEiaXJnEAEY/wEyYF4oXCpcLik/W2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyhcLlthLXowLTldKFthLXowLTktXXswLDYxfVthLXowLTldKT8pKyg6WzAtOV17MSw1fSk/JBI+CgN0bHMYAiABKAsyLC5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5UbHNEZWZpbml0aW9uSACIAQESjgEKDmluamVjdF9oZWFkZXJzGAMgAygLMkUubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuSHR0cFByb3h5RGVmaW5pdGlvbi5JbmplY3RIZWFkZXJzRW50cnlCL7pILJoBKSInciUQARiAAjIeXlshIyQlJicqK1wtLjAtOUEtWl5fYGEtenx+XSskGmMKEkluamVjdEhlYWRlcnNFbnRyeRILCgNrZXkYASABKAkSPAoFdmFsdWUYAiABKAsyLS5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5IZWFkZXJUZW1wbGF0ZToCOAE67AG6SOgBGuUBCh9odHRwX3Byb3h5X2RlZmluaXRpb24ubm90X2VtcHR5EpABSHR0cFByb3h5RGVmaW5pdGlvbiBtdXN0IGNvbmZpZ3VyZSBlaXRoZXIgVExTICh0bHMgZmllbGQpIG9yIGhlYWRlciBpbmplY3Rpb24gKGluamVjdF9oZWFkZXJzKSwgb3RoZXJ3aXNlIHRoZSBwcm94eSBwcm92aWRlcyBubyBhZGRpdGlvbmFsIHZhbHVlGi9oYXModGhpcy50bHMpIHx8IHRoaXMuaW5qZWN0X2hlYWRlcnMuc2l6ZSgpID4gMEIGCgRfdGxzImoKDkhlYWRlclRlbXBsYXRlEkUKCHRlbXBsYXRlGAEgASgJQjO6SDByLhABGIBAMideKD86W14lXXwlJXwlW0EtWmEtel9dW0EtWmEtejAtOV9dKiUpKyQSEQoJcGxhaW50ZXh0GAIgASgIIv4CCg1UbHNEZWZpbml0aW9uEksKBG1vZGUYASABKA4yMS5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5UbHNEZWZpbml0aW9uLk1vZGVCCrpIB4IBBBABIAASfQoQY2VydGlmaWNhdGVfaG9zdBgCIAEoCUJeukhbclkQARj9ATJSXihcKlwuKT9bYS16MC05XShbYS16MC05LV17MCw2MX1bYS16MC05XSk/KFwuW2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPykqJEgAiAEBEjsKCWNhX2J1bmRsZRgDIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVIAYgBASJBCgRNb2RlEhQKEE1PREVfVU5TUEVDSUZJRUQQABINCglNT0RFX01UTFMQARIUChBNT0RFX1NFUlZFUl9PTkxZEAJCEwoRX2NlcnRpZmljYXRlX2hvc3RCDAoKX2NhX2J1bmRsZSL0AQoJVGxzQ29uZmlnEjsKCWNhX2J1bmRsZRgBIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVIAIgBARI9CgtjZXJ0aWZpY2F0ZRgCIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVIAYgBARI9Cgtwcml2YXRlX2tleRgDIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVIAogBAUIMCgpfY2FfYnVuZGxlQg4KDF9jZXJ0aWZpY2F0ZUIOCgxfcHJpdmF0ZV9rZXkiqgIKD0h0dHBQcm94eUNvbmZpZxJBCgp0bHNfY29uZmlnGAEgASgLMigubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuVGxzQ29uZmlnSACIAQESXQoQaGVhZGVyX3ZhcmlhYmxlcxgCIAMoCzJDLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkh0dHBQcm94eUNvbmZpZy5IZWFkZXJWYXJpYWJsZXNFbnRyeRpmChRIZWFkZXJWYXJpYWJsZXNFbnRyeRILCgNrZXkYASABKAkSPQoFdmFsdWUYAiABKAsyLi5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5IZWFkZXJWYXJpYWJsZXM6AjgBQg0KC190bHNfY29uZmlnIs0BCg9IZWFkZXJWYXJpYWJsZXMShwEKCXZhcmlhYmxlcxgBIAMoCzI9Lm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkhlYWRlclZhcmlhYmxlcy5WYXJpYWJsZXNFbnRyeUI1ukgymgEvEDIiIXIfEAEYgAEyGF5bQS1aYS16X11bQS1aYS16MC05X10qJCoIcgYQARiAgAEaMAoOVmFyaWFibGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AWIGcHJvdG8z\", [file_buf_validate_validate, file_mochabugapis_adapt_plugins_v1_file]);\n\n/**\n * The http proxy service definition\n *\n * This service provides HTTP proxy capabilities with optional TLS configuration\n * and dynamic header injection for outgoing requests.\n *\n * An HTTP proxy configuration must do at least one of the following:\n * - Configure custom TLS settings (self-signed certs, mTLS, CA pinning)\n * - Inject dynamic headers using template variables\n *\n * If neither TLS nor header injection is configured, the proxy provides no value\n * and the plugin should use direct HTTP requests instead.\n *\n * Example use cases:\n * - Adding authentication headers to upstream services (Bearer tokens, API keys)\n * - Injecting custom correlation IDs or tracking headers\n * - Using mutual TLS (mTLS) for B2B API authentication\n * - Connecting to services with self-signed certificates\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HttpProxyDefinition\n */\nexport type HttpProxyDefinition = Message<\"mochabugapis.adapt.plugins.v1.HttpProxyDefinition\"> & {\n /**\n * REQUIRED: Allowed upstream hosts that this proxy can connect to.\n *\n * Plugin authors define which external services the plugin will communicate with.\n * Only publicly accessible hosts are allowed; private IP addresses and non-globally\n * resolvable hostnames are blocked by the platform.\n *\n * ## Transparency & User Visibility\n *\n * IMPORTANT: This list is VISIBLE to users during plugin installation and in plugin settings.\n * Users can see exactly which external endpoints your plugin will connect to.\n *\n * Plugin authors MUST be transparent about:\n * - Which services the plugin connects to\n * - Why the plugin needs to connect to these hosts\n * - What data is sent to these endpoints\n *\n * Plugins that attempt to hide their network activity or connect to undisclosed endpoints\n * will be flagged as malicious and removed from the plugin marketplace.\n *\n * ## Format\n *\n * Each entry must be a valid hostname or publicly routable IP address, optionally with a port:\n * - \"api.example.com\" - Exact hostname match\n * - \"*.example.com\" - Wildcard subdomain match (matches api.example.com, service.example.com, etc.)\n * - \"api.example.com:8443\" - Hostname with specific port\n * - \"*.example.com:8443\" - Wildcard subdomain with specific port\n *\n * ## Wildcard Rules\n *\n * - \"*\" at the start means \"any subdomain\" but NOT the root domain\n * - \"*.example.com\" matches \"api.example.com\" but NOT \"example.com\"\n * - To allow both, add both entries: [\"*.example.com\", \"example.com\"]\n *\n * - Wildcards only supported at the subdomain level\n * - Valid: \"*.example.com\", \"*.api.example.com\"\n * - Invalid: \"api.*.com\", \"*\", \"example.*\"\n *\n * ## Port Matching\n *\n * - If no port specified: matches any port on that host\n * - \"api.example.com\" matches api.example.com:80, api.example.com:443, api.example.com:8080\n *\n * - If port specified: matches only that specific port\n * - \"api.example.com:443\" matches ONLY api.example.com:443\n * - Does NOT match api.example.com:80 or api.example.com:8443\n *\n * ## Restrictions\n *\n * The following are blocked and will cause validation errors:\n * - Private IP ranges (RFC 1918): 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16\n * - Loopback addresses: 127.0.0.0/8, ::1\n * - Link-local addresses: 169.254.0.0/16, fe80::/10\n * - Non-globally resolvable hostnames: localhost, *.local, *.internal\n *\n * ## Examples\n *\n * 1. Single API endpoint:\n * allowed_hosts: [\"api.example.com\"]\n *\n * 2. Multiple environments:\n * allowed_hosts: [\"api.prod.example.com\", \"api.staging.example.com\"]\n *\n * 3. All subdomains of a service:\n * allowed_hosts: [\"*.service.example.com\", \"service.example.com\"]\n *\n * 4. Specific port (e.g., non-standard HTTPS):\n * allowed_hosts: [\"api.example.com:8443\"]\n *\n * @generated from field: repeated string allowed_hosts = 1;\n */\n allowedHosts: string[];\n\n /**\n * Optional TLS configuration for the upstream connection.\n *\n * If not specified:\n * - The protocol (HTTP/HTTPS) is forwarded from the incoming request\n * - HTTP requests are proxied as HTTP\n * - HTTPS requests are proxied as HTTPS using the system's default trust store\n * (publicly trusted Certificate Authorities like Let's Encrypt, DigiCert, etc.)\n *\n * If specified:\n * - For MODE_SERVER_ONLY: Validates the server certificate against the provided ca_bundle\n * - For MODE_MTLS: Performs mutual TLS authentication with client certificate\n *\n * Use this when:\n * - Upstream uses self-signed certificates (provide custom ca_bundle)\n * - Upstream requires mutual TLS (provide client certificate and private key)\n * - Need to pin specific CA certificates for security\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.TlsDefinition tls = 2;\n */\n tls?: TlsDefinition;\n\n /**\n * Dynamic headers to inject into every proxied request using template variables.\n *\n * This field is for headers that require DYNAMIC values resolved from template variables.\n * The caller can always submit static headers directly with each request - this field\n * is specifically for injecting headers that use variable substitution (e.g., %ACCESS_TOKEN%).\n *\n * ## When to Use inject_headers\n *\n * Use this field when you need to inject headers with:\n * - Values that change per request or per user (tokens, session IDs)\n * - Values that come from user configuration (API keys, tenant IDs)\n * - Values that need to be kept secret (credentials, tokens)\n * - Dynamic template substitution using %VARIABLE% syntax\n *\n * ## When NOT to Use inject_headers\n *\n * Do NOT use this field for:\n * - Static headers that never change (use direct headers in the request)\n * - Headers that the caller controls (they can submit these directly)\n * - Constant values like \"Content-Type: application/json\"\n *\n * The caller can always add, modify, or override headers in their individual requests.\n * This field is for headers that the plugin definition requires to be injected with\n * dynamic values before reaching the upstream service.\n *\n * ## Header Processing\n *\n * The map key is the HTTP header name (e.g., \"Authorization\", \"X-Api-Key\").\n * Header names are case-insensitive per RFC 7230 but will be sent as specified.\n *\n * If the same header name appears in both inject_headers and the caller's request:\n * - The inject_headers value takes precedence (overrides caller's value)\n * - This ensures plugin-level authentication/configuration is always applied\n *\n * ## Common Patterns\n *\n * - \"Authorization\": \"Bearer %ACCESS_TOKEN%\" - Dynamic OAuth2 token\n * - \"X-Api-Key\": \"%API_KEY%\" - User-provided API key\n * - \"X-Request-ID\": \"%CORRELATION_ID%\" - Tracing identifier\n * - \"X-Tenant-ID\": \"%TENANT_ID%\" - Multi-tenant identifier\n *\n * @generated from field: map<string, mochabugapis.adapt.plugins.v1.HeaderTemplate> inject_headers = 3;\n */\n injectHeaders: { [key: string]: HeaderTemplate };\n};\n\n/**\n * The http proxy service definition\n *\n * This service provides HTTP proxy capabilities with optional TLS configuration\n * and dynamic header injection for outgoing requests.\n *\n * An HTTP proxy configuration must do at least one of the following:\n * - Configure custom TLS settings (self-signed certs, mTLS, CA pinning)\n * - Inject dynamic headers using template variables\n *\n * If neither TLS nor header injection is configured, the proxy provides no value\n * and the plugin should use direct HTTP requests instead.\n *\n * Example use cases:\n * - Adding authentication headers to upstream services (Bearer tokens, API keys)\n * - Injecting custom correlation IDs or tracking headers\n * - Using mutual TLS (mTLS) for B2B API authentication\n * - Connecting to services with self-signed certificates\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HttpProxyDefinition\n */\nexport type HttpProxyDefinitionJson = {\n /**\n * REQUIRED: Allowed upstream hosts that this proxy can connect to.\n *\n * Plugin authors define which external services the plugin will communicate with.\n * Only publicly accessible hosts are allowed; private IP addresses and non-globally\n * resolvable hostnames are blocked by the platform.\n *\n * ## Transparency & User Visibility\n *\n * IMPORTANT: This list is VISIBLE to users during plugin installation and in plugin settings.\n * Users can see exactly which external endpoints your plugin will connect to.\n *\n * Plugin authors MUST be transparent about:\n * - Which services the plugin connects to\n * - Why the plugin needs to connect to these hosts\n * - What data is sent to these endpoints\n *\n * Plugins that attempt to hide their network activity or connect to undisclosed endpoints\n * will be flagged as malicious and removed from the plugin marketplace.\n *\n * ## Format\n *\n * Each entry must be a valid hostname or publicly routable IP address, optionally with a port:\n * - \"api.example.com\" - Exact hostname match\n * - \"*.example.com\" - Wildcard subdomain match (matches api.example.com, service.example.com, etc.)\n * - \"api.example.com:8443\" - Hostname with specific port\n * - \"*.example.com:8443\" - Wildcard subdomain with specific port\n *\n * ## Wildcard Rules\n *\n * - \"*\" at the start means \"any subdomain\" but NOT the root domain\n * - \"*.example.com\" matches \"api.example.com\" but NOT \"example.com\"\n * - To allow both, add both entries: [\"*.example.com\", \"example.com\"]\n *\n * - Wildcards only supported at the subdomain level\n * - Valid: \"*.example.com\", \"*.api.example.com\"\n * - Invalid: \"api.*.com\", \"*\", \"example.*\"\n *\n * ## Port Matching\n *\n * - If no port specified: matches any port on that host\n * - \"api.example.com\" matches api.example.com:80, api.example.com:443, api.example.com:8080\n *\n * - If port specified: matches only that specific port\n * - \"api.example.com:443\" matches ONLY api.example.com:443\n * - Does NOT match api.example.com:80 or api.example.com:8443\n *\n * ## Restrictions\n *\n * The following are blocked and will cause validation errors:\n * - Private IP ranges (RFC 1918): 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16\n * - Loopback addresses: 127.0.0.0/8, ::1\n * - Link-local addresses: 169.254.0.0/16, fe80::/10\n * - Non-globally resolvable hostnames: localhost, *.local, *.internal\n *\n * ## Examples\n *\n * 1. Single API endpoint:\n * allowed_hosts: [\"api.example.com\"]\n *\n * 2. Multiple environments:\n * allowed_hosts: [\"api.prod.example.com\", \"api.staging.example.com\"]\n *\n * 3. All subdomains of a service:\n * allowed_hosts: [\"*.service.example.com\", \"service.example.com\"]\n *\n * 4. Specific port (e.g., non-standard HTTPS):\n * allowed_hosts: [\"api.example.com:8443\"]\n *\n * @generated from field: repeated string allowed_hosts = 1;\n */\n allowedHosts?: string[];\n\n /**\n * Optional TLS configuration for the upstream connection.\n *\n * If not specified:\n * - The protocol (HTTP/HTTPS) is forwarded from the incoming request\n * - HTTP requests are proxied as HTTP\n * - HTTPS requests are proxied as HTTPS using the system's default trust store\n * (publicly trusted Certificate Authorities like Let's Encrypt, DigiCert, etc.)\n *\n * If specified:\n * - For MODE_SERVER_ONLY: Validates the server certificate against the provided ca_bundle\n * - For MODE_MTLS: Performs mutual TLS authentication with client certificate\n *\n * Use this when:\n * - Upstream uses self-signed certificates (provide custom ca_bundle)\n * - Upstream requires mutual TLS (provide client certificate and private key)\n * - Need to pin specific CA certificates for security\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.TlsDefinition tls = 2;\n */\n tls?: TlsDefinitionJson;\n\n /**\n * Dynamic headers to inject into every proxied request using template variables.\n *\n * This field is for headers that require DYNAMIC values resolved from template variables.\n * The caller can always submit static headers directly with each request - this field\n * is specifically for injecting headers that use variable substitution (e.g., %ACCESS_TOKEN%).\n *\n * ## When to Use inject_headers\n *\n * Use this field when you need to inject headers with:\n * - Values that change per request or per user (tokens, session IDs)\n * - Values that come from user configuration (API keys, tenant IDs)\n * - Values that need to be kept secret (credentials, tokens)\n * - Dynamic template substitution using %VARIABLE% syntax\n *\n * ## When NOT to Use inject_headers\n *\n * Do NOT use this field for:\n * - Static headers that never change (use direct headers in the request)\n * - Headers that the caller controls (they can submit these directly)\n * - Constant values like \"Content-Type: application/json\"\n *\n * The caller can always add, modify, or override headers in their individual requests.\n * This field is for headers that the plugin definition requires to be injected with\n * dynamic values before reaching the upstream service.\n *\n * ## Header Processing\n *\n * The map key is the HTTP header name (e.g., \"Authorization\", \"X-Api-Key\").\n * Header names are case-insensitive per RFC 7230 but will be sent as specified.\n *\n * If the same header name appears in both inject_headers and the caller's request:\n * - The inject_headers value takes precedence (overrides caller's value)\n * - This ensures plugin-level authentication/configuration is always applied\n *\n * ## Common Patterns\n *\n * - \"Authorization\": \"Bearer %ACCESS_TOKEN%\" - Dynamic OAuth2 token\n * - \"X-Api-Key\": \"%API_KEY%\" - User-provided API key\n * - \"X-Request-ID\": \"%CORRELATION_ID%\" - Tracing identifier\n * - \"X-Tenant-ID\": \"%TENANT_ID%\" - Multi-tenant identifier\n *\n * @generated from field: map<string, mochabugapis.adapt.plugins.v1.HeaderTemplate> inject_headers = 3;\n */\n injectHeaders?: { [key: string]: HeaderTemplateJson };\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.HttpProxyDefinition.\n * Use `create(HttpProxyDefinitionSchema)` to create a new message.\n */\nexport const HttpProxyDefinitionSchema: GenMessage<HttpProxyDefinition, {jsonType: HttpProxyDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 0);\n\n/**\n * HeaderTemplate defines a template string using Envoy-style %VAR% syntax\n * for dynamic header value substitution.\n *\n * ## Template Syntax\n *\n * Variables are enclosed in percent signs: %VARIABLE_NAME%\n *\n * Variable names must:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Be case-sensitive\n *\n * ## Examples\n *\n * 1. Bearer Token:\n * template: \"Bearer %ACCESS_TOKEN%\"\n * Result: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n *\n * 2. API Key:\n * template: \"ApiKey %API_KEY%\"\n * Result: \"ApiKey sk_live_51HqG8sKj...\"\n *\n * 3. Multiple Variables:\n * template: \"%TENANT_ID%:%USER_ID%\"\n * Result: \"org_123:user_456\"\n *\n * 4. Mixed Static and Dynamic:\n * template: \"v1.0/%API_VERSION%/client/%CLIENT_ID%\"\n * Result: \"v1.0/2024-01/client/client_abc123\"\n *\n * ## Escaping Literal Percent Signs\n *\n * To include a literal percent sign (%) in the header value, double it:\n *\n * - template: \"100%%\" \u2192 Result: \"100%\"\n * - template: \"Completion: 95%% done\" \u2192 Result: \"Completion: 95% done\"\n * - template: \"%%VAR%%\" \u2192 Result: \"%VAR%\"\n *\n * ## Variable Resolution\n *\n * Template variables are provided by users when they configure or use the plugin.\n * For system services, plugin authors provide the variable values.\n *\n * The resolution process is transparent:\n * - Users see which hostname will receive the request (from allowed_hosts)\n * - Users see which header is being modified\n * - Users are prompted to provide values for each variable\n *\n * This ensures users know exactly what data they are sending and where it goes.\n *\n * If a variable is not provided, the header injection will fail at runtime,\n * and the proxy request will not be sent.\n *\n * ## Security Considerations\n *\n * By default, template variables are treated as SECRETS.\n *\n * Set `plaintext: true` if the variable contains non-sensitive data like:\n * - User IDs (not passwords)\n * - Tenant/Organization IDs\n * - Request correlation IDs\n * - API version numbers\n * - Public configuration values\n *\n * DO NOT set `plaintext: true` for:\n * - Access tokens, API keys, passwords\n * - Session tokens, JWTs\n * - Private keys, certificates\n * - Any credential material\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HeaderTemplate\n */\nexport type HeaderTemplate = Message<\"mochabugapis.adapt.plugins.v1.HeaderTemplate\"> & {\n /**\n * The template string using %VAR% syntax.\n *\n * Pattern: %VARIABLE_NAME% where VARIABLE_NAME matches [A-Za-z_][A-Za-z0-9_]*\n * Escape literal %: use %%\n *\n * @generated from field: string template = 1;\n */\n template: string;\n\n /**\n * If true, variables in this template are NOT treated as secrets.\n *\n * Only set to true for non-sensitive identifiers like user IDs,\n * tenant IDs, request IDs, or public configuration values.\n *\n * Default: false (variables are secrets)\n *\n * @generated from field: bool plaintext = 2;\n */\n plaintext: boolean;\n};\n\n/**\n * HeaderTemplate defines a template string using Envoy-style %VAR% syntax\n * for dynamic header value substitution.\n *\n * ## Template Syntax\n *\n * Variables are enclosed in percent signs: %VARIABLE_NAME%\n *\n * Variable names must:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Be case-sensitive\n *\n * ## Examples\n *\n * 1. Bearer Token:\n * template: \"Bearer %ACCESS_TOKEN%\"\n * Result: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n *\n * 2. API Key:\n * template: \"ApiKey %API_KEY%\"\n * Result: \"ApiKey sk_live_51HqG8sKj...\"\n *\n * 3. Multiple Variables:\n * template: \"%TENANT_ID%:%USER_ID%\"\n * Result: \"org_123:user_456\"\n *\n * 4. Mixed Static and Dynamic:\n * template: \"v1.0/%API_VERSION%/client/%CLIENT_ID%\"\n * Result: \"v1.0/2024-01/client/client_abc123\"\n *\n * ## Escaping Literal Percent Signs\n *\n * To include a literal percent sign (%) in the header value, double it:\n *\n * - template: \"100%%\" \u2192 Result: \"100%\"\n * - template: \"Completion: 95%% done\" \u2192 Result: \"Completion: 95% done\"\n * - template: \"%%VAR%%\" \u2192 Result: \"%VAR%\"\n *\n * ## Variable Resolution\n *\n * Template variables are provided by users when they configure or use the plugin.\n * For system services, plugin authors provide the variable values.\n *\n * The resolution process is transparent:\n * - Users see which hostname will receive the request (from allowed_hosts)\n * - Users see which header is being modified\n * - Users are prompted to provide values for each variable\n *\n * This ensures users know exactly what data they are sending and where it goes.\n *\n * If a variable is not provided, the header injection will fail at runtime,\n * and the proxy request will not be sent.\n *\n * ## Security Considerations\n *\n * By default, template variables are treated as SECRETS.\n *\n * Set `plaintext: true` if the variable contains non-sensitive data like:\n * - User IDs (not passwords)\n * - Tenant/Organization IDs\n * - Request correlation IDs\n * - API version numbers\n * - Public configuration values\n *\n * DO NOT set `plaintext: true` for:\n * - Access tokens, API keys, passwords\n * - Session tokens, JWTs\n * - Private keys, certificates\n * - Any credential material\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HeaderTemplate\n */\nexport type HeaderTemplateJson = {\n /**\n * The template string using %VAR% syntax.\n *\n * Pattern: %VARIABLE_NAME% where VARIABLE_NAME matches [A-Za-z_][A-Za-z0-9_]*\n * Escape literal %: use %%\n *\n * @generated from field: string template = 1;\n */\n template?: string;\n\n /**\n * If true, variables in this template are NOT treated as secrets.\n *\n * Only set to true for non-sensitive identifiers like user IDs,\n * tenant IDs, request IDs, or public configuration values.\n *\n * Default: false (variables are secrets)\n *\n * @generated from field: bool plaintext = 2;\n */\n plaintext?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.HeaderTemplate.\n * Use `create(HeaderTemplateSchema)` to create a new message.\n */\nexport const HeaderTemplateSchema: GenMessage<HeaderTemplate, {jsonType: HeaderTemplateJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 1);\n\n/**\n * TLS configuration defining the security requirements for upstream connections.\n *\n * Supports two authentication modes with flexible CA bundle placement.\n *\n * ## Security Model\n *\n * - Public certificates (CA bundles): Can be in definition OR config\n * - Private keys and client certificates: MUST be in config (secrets)\n *\n * ## Mode Descriptions\n *\n * MODE_SERVER_ONLY: Validate server's certificate (standard HTTPS)\n * - Client verifies server identity\n * - Server does not verify client\n * - Common for public APIs\n *\n * MODE_MTLS: Mutual authentication (both parties verify each other)\n * - Client verifies server identity AND presents its own certificate\n * - Server verifies client identity\n * - Common for B2B integrations, internal services\n *\n * @generated from message mochabugapis.adapt.plugins.v1.TlsDefinition\n */\nexport type TlsDefinition = Message<\"mochabugapis.adapt.plugins.v1.TlsDefinition\"> & {\n /**\n * Select the TLS mode for the connection.\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.TlsDefinition.Mode mode = 1;\n */\n mode: TlsDefinition_Mode;\n\n /**\n * The expected hostname for certificate verification (SNI - Server Name Indication).\n *\n * If present, the client will:\n * 1. Send this hostname in the TLS SNI extension during the handshake\n * 2. Verify that the server's certificate authenticates this specific hostname\n *\n * If not provided:\n * - The hostname is derived from the target upstream address\n * - For IP addresses, certificate verification may fail unless the cert includes the IP as a SAN\n *\n * ## Use Cases\n *\n * 1. **IP-based connections with hostname certificates:**\n * - Upstream address: 192.168.1.100:443\n * - certificate_host: \"api.example.com\"\n * - Server presents cert for api.example.com\n *\n * 2. **Load balancers or proxies:**\n * - Upstream address: lb.internal:443\n * - certificate_host: \"api.example.com\"\n * - Verify against the public hostname, not internal LB name\n *\n * 3. **Shared hosting / Virtual hosting:**\n * - Multiple services on same IP, different certs via SNI\n * - Server selects correct certificate based on SNI hostname\n *\n * ## Certificate Verification\n *\n * The server certificate must contain this hostname in either:\n * - Common Name (CN) field\n * - Subject Alternative Name (SAN) extension\n *\n * ## Format\n *\n * Must be a valid hostname (DNS name), not an IP address.\n * Examples: \"api.example.com\", \"service.internal\", \"*.example.com\" (for wildcard matching)\n *\n * @generated from field: optional string certificate_host = 2;\n */\n certificateHost?: string;\n\n /**\n * Optional CA bundle for server certificate validation.\n *\n * ## Why CA Bundle in Definition?\n *\n * CA bundles contain PUBLIC certificates (not secrets), so they can be safely\n * embedded in the plugin definition. This reduces configuration burden on users\n * when the CA bundle is known ahead of time.\n *\n * ## When to Use This Field\n *\n * Set the CA bundle in the definition when:\n * - The upstream service uses a self-signed certificate\n * - The upstream uses a private/internal Certificate Authority\n * - You want to pin specific CA certificates for security\n * - The CA bundle is static and known at plugin authoring time\n *\n * ## When to Use TlsConfig.ca_bundle Instead\n *\n * Leave this empty and use TlsConfig.ca_bundle when:\n * - Different users need different CA bundles\n * - The CA bundle is dynamic or environment-specific\n * - Users want to override the plugin's default CA bundle\n *\n * ## Configuration Rules\n *\n * For MODE_SERVER_ONLY:\n * - At least one CA bundle must be provided (either here OR in TlsConfig)\n * - If set here: users don't need to provide TlsConfig.ca_bundle\n * - If NOT set here: users MUST provide TlsConfig.ca_bundle\n *\n * For MODE_MTLS:\n * - Same CA bundle rules as MODE_SERVER_ONLY\n * - Users must ALSO provide client certificate and private_key in TlsConfig\n *\n * ## Precedence\n *\n * If CA bundle is provided in both the definition AND TlsConfig:\n * - TlsConfig.ca_bundle takes precedence (config overrides definition)\n * - This allows users to override the plugin's default CA bundle if needed\n *\n * ## Format\n *\n * The CA bundle must be in PEM format (same as TlsConfig.ca_bundle).\n * If a certificate chain is presented, the root CA must be included.\n *\n * IF this points to a file on the disk, then it will be loaded from there.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File ca_bundle = 3;\n */\n caBundle?: File;\n};\n\n/**\n * TLS configuration defining the security requirements for upstream connections.\n *\n * Supports two authentication modes with flexible CA bundle placement.\n *\n * ## Security Model\n *\n * - Public certificates (CA bundles): Can be in definition OR config\n * - Private keys and client certificates: MUST be in config (secrets)\n *\n * ## Mode Descriptions\n *\n * MODE_SERVER_ONLY: Validate server's certificate (standard HTTPS)\n * - Client verifies server identity\n * - Server does not verify client\n * - Common for public APIs\n *\n * MODE_MTLS: Mutual authentication (both parties verify each other)\n * - Client verifies server identity AND presents its own certificate\n * - Server verifies client identity\n * - Common for B2B integrations, internal services\n *\n * @generated from message mochabugapis.adapt.plugins.v1.TlsDefinition\n */\nexport type TlsDefinitionJson = {\n /**\n * Select the TLS mode for the connection.\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.TlsDefinition.Mode mode = 1;\n */\n mode?: TlsDefinition_ModeJson;\n\n /**\n * The expected hostname for certificate verification (SNI - Server Name Indication).\n *\n * If present, the client will:\n * 1. Send this hostname in the TLS SNI extension during the handshake\n * 2. Verify that the server's certificate authenticates this specific hostname\n *\n * If not provided:\n * - The hostname is derived from the target upstream address\n * - For IP addresses, certificate verification may fail unless the cert includes the IP as a SAN\n *\n * ## Use Cases\n *\n * 1. **IP-based connections with hostname certificates:**\n * - Upstream address: 192.168.1.100:443\n * - certificate_host: \"api.example.com\"\n * - Server presents cert for api.example.com\n *\n * 2. **Load balancers or proxies:**\n * - Upstream address: lb.internal:443\n * - certificate_host: \"api.example.com\"\n * - Verify against the public hostname, not internal LB name\n *\n * 3. **Shared hosting / Virtual hosting:**\n * - Multiple services on same IP, different certs via SNI\n * - Server selects correct certificate based on SNI hostname\n *\n * ## Certificate Verification\n *\n * The server certificate must contain this hostname in either:\n * - Common Name (CN) field\n * - Subject Alternative Name (SAN) extension\n *\n * ## Format\n *\n * Must be a valid hostname (DNS name), not an IP address.\n * Examples: \"api.example.com\", \"service.internal\", \"*.example.com\" (for wildcard matching)\n *\n * @generated from field: optional string certificate_host = 2;\n */\n certificateHost?: string;\n\n /**\n * Optional CA bundle for server certificate validation.\n *\n * ## Why CA Bundle in Definition?\n *\n * CA bundles contain PUBLIC certificates (not secrets), so they can be safely\n * embedded in the plugin definition. This reduces configuration burden on users\n * when the CA bundle is known ahead of time.\n *\n * ## When to Use This Field\n *\n * Set the CA bundle in the definition when:\n * - The upstream service uses a self-signed certificate\n * - The upstream uses a private/internal Certificate Authority\n * - You want to pin specific CA certificates for security\n * - The CA bundle is static and known at plugin authoring time\n *\n * ## When to Use TlsConfig.ca_bundle Instead\n *\n * Leave this empty and use TlsConfig.ca_bundle when:\n * - Different users need different CA bundles\n * - The CA bundle is dynamic or environment-specific\n * - Users want to override the plugin's default CA bundle\n *\n * ## Configuration Rules\n *\n * For MODE_SERVER_ONLY:\n * - At least one CA bundle must be provided (either here OR in TlsConfig)\n * - If set here: users don't need to provide TlsConfig.ca_bundle\n * - If NOT set here: users MUST provide TlsConfig.ca_bundle\n *\n * For MODE_MTLS:\n * - Same CA bundle rules as MODE_SERVER_ONLY\n * - Users must ALSO provide client certificate and private_key in TlsConfig\n *\n * ## Precedence\n *\n * If CA bundle is provided in both the definition AND TlsConfig:\n * - TlsConfig.ca_bundle takes precedence (config overrides definition)\n * - This allows users to override the plugin's default CA bundle if needed\n *\n * ## Format\n *\n * The CA bundle must be in PEM format (same as TlsConfig.ca_bundle).\n * If a certificate chain is presented, the root CA must be included.\n *\n * IF this points to a file on the disk, then it will be loaded from there.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File ca_bundle = 3;\n */\n caBundle?: FileJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.TlsDefinition.\n * Use `create(TlsDefinitionSchema)` to create a new message.\n */\nexport const TlsDefinitionSchema: GenMessage<TlsDefinition, {jsonType: TlsDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 2);\n\n/**\n * Mode specifies which TLS configuration to use.\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.TlsDefinition.Mode\n */\nexport enum TlsDefinition_Mode {\n /**\n * Default value. Invalid.\n *\n * @generated from enum value: MODE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Mutual TLS: Both client and server authenticate each other.\n *\n * Configuration requirements:\n * - CA bundle: Set in TlsDefinition.ca_bundle OR TlsConfig.ca_bundle (at least one required)\n * - Client certificate: REQUIRED in TlsConfig.certificate\n * - Client private key: REQUIRED in TlsConfig.private_key\n *\n * Use when:\n * - Upstream service requires client certificate authentication\n * - Both parties need strong cryptographic authentication\n * - Common in B2B APIs, internal microservices, banking/financial APIs\n *\n * @generated from enum value: MODE_MTLS = 1;\n */\n MTLS = 1,\n\n /**\n * Server-only validation: Client verifies server identity.\n *\n * Configuration requirements:\n * - CA bundle: Set in TlsDefinition.ca_bundle OR TlsConfig.ca_bundle (at least one required)\n * - Client certificate: NOT used\n * - Client private key: NOT used\n *\n * Use when:\n * - Standard HTTPS with server authentication only\n * - Upstream uses self-signed or internal CA certificates\n * - Want to pin specific CA certificates for security\n * - Most common mode for external APIs\n *\n * @generated from enum value: MODE_SERVER_ONLY = 2;\n */\n SERVER_ONLY = 2,\n}\n\n/**\n * Mode specifies which TLS configuration to use.\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.TlsDefinition.Mode\n */\nexport type TlsDefinition_ModeJson = \"MODE_UNSPECIFIED\" | \"MODE_MTLS\" | \"MODE_SERVER_ONLY\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.TlsDefinition.Mode.\n */\nexport const TlsDefinition_ModeSchema: GenEnum<TlsDefinition_Mode, TlsDefinition_ModeJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 2, 0);\n\n/**\n * The actual TLS configuration containing runtime secrets.\n *\n * This provides the secret/dynamic parts of the TLS configuration that cannot\n * be embedded in the plugin definition (private keys, user-specific certificates).\n *\n * ## Relationship to TlsDefinition\n *\n * - TlsDefinition: Defines the TLS mode and optionally includes the CA bundle (public cert)\n * - TlsConfig: Provides runtime secrets (private keys, client certificates)\n *\n * ## Configuration Requirements\n *\n * For MODE_SERVER_ONLY:\n * - ca_bundle: Required if NOT provided in TlsDefinition.ca_bundle\n * - certificate: NOT used\n * - private_key: NOT used\n *\n * For MODE_MTLS:\n * - ca_bundle: Required if NOT provided in TlsDefinition.ca_bundle\n * - certificate: REQUIRED (client certificate for mutual TLS)\n * - private_key: REQUIRED (client private key for mutual TLS)\n *\n * @generated from message mochabugapis.adapt.plugins.v1.TlsConfig\n */\nexport type TlsConfig = Message<\"mochabugapis.adapt.plugins.v1.TlsConfig\"> & {\n /**\n * Optional CA bundle for server certificate validation.\n *\n * The CA bundle in PEM format containing one or more trusted Certificate Authorities.\n * The content of the file must be PEM format after decoding.\n * If a certificate chain is presented, the root CA must be included.\n *\n * ## When to Provide This\n *\n * REQUIRED if TlsDefinition.ca_bundle is NOT set.\n * OPTIONAL if TlsDefinition.ca_bundle is set (this will override the definition's CA bundle).\n *\n * ## Override Behavior\n *\n * If both TlsDefinition.ca_bundle and TlsConfig.ca_bundle are provided:\n * - This config value takes precedence\n * - Allows users to override the plugin author's default CA bundle\n *\n * ## Use Cases for Override\n *\n * - User's organization has different root CAs\n * - Testing with different certificate chains\n * - Environment-specific CA requirements\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File ca_bundle = 1;\n */\n caBundle?: File;\n\n /**\n * Optional client certificate for mutual TLS authentication.\n *\n * The certificate in PEM format used to authenticate the client to the server.\n * The content of the file must be PEM format after decoding.\n * If a certificate chain is presented, the client certificate must be the first one.\n *\n * REQUIRED if TlsDefinition.mode is MODE_MTLS.\n * MUST NOT be provided if TlsDefinition.mode is MODE_SERVER_ONLY.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File certificate = 2;\n */\n certificate?: File;\n\n /**\n * Optional client private key for mutual TLS authentication.\n *\n * The private key in PEM format corresponding to the client certificate.\n * The content of the file must be PEM format after decoding.\n * The content must contain a PRIVATE KEY block.\n *\n * REQUIRED if TlsDefinition.mode is MODE_MTLS.\n * MUST NOT be provided if TlsDefinition.mode is MODE_SERVER_ONLY.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File private_key = 3;\n */\n privateKey?: File;\n};\n\n/**\n * The actual TLS configuration containing runtime secrets.\n *\n * This provides the secret/dynamic parts of the TLS configuration that cannot\n * be embedded in the plugin definition (private keys, user-specific certificates).\n *\n * ## Relationship to TlsDefinition\n *\n * - TlsDefinition: Defines the TLS mode and optionally includes the CA bundle (public cert)\n * - TlsConfig: Provides runtime secrets (private keys, client certificates)\n *\n * ## Configuration Requirements\n *\n * For MODE_SERVER_ONLY:\n * - ca_bundle: Required if NOT provided in TlsDefinition.ca_bundle\n * - certificate: NOT used\n * - private_key: NOT used\n *\n * For MODE_MTLS:\n * - ca_bundle: Required if NOT provided in TlsDefinition.ca_bundle\n * - certificate: REQUIRED (client certificate for mutual TLS)\n * - private_key: REQUIRED (client private key for mutual TLS)\n *\n * @generated from message mochabugapis.adapt.plugins.v1.TlsConfig\n */\nexport type TlsConfigJson = {\n /**\n * Optional CA bundle for server certificate validation.\n *\n * The CA bundle in PEM format containing one or more trusted Certificate Authorities.\n * The content of the file must be PEM format after decoding.\n * If a certificate chain is presented, the root CA must be included.\n *\n * ## When to Provide This\n *\n * REQUIRED if TlsDefinition.ca_bundle is NOT set.\n * OPTIONAL if TlsDefinition.ca_bundle is set (this will override the definition's CA bundle).\n *\n * ## Override Behavior\n *\n * If both TlsDefinition.ca_bundle and TlsConfig.ca_bundle are provided:\n * - This config value takes precedence\n * - Allows users to override the plugin author's default CA bundle\n *\n * ## Use Cases for Override\n *\n * - User's organization has different root CAs\n * - Testing with different certificate chains\n * - Environment-specific CA requirements\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File ca_bundle = 1;\n */\n caBundle?: FileJson;\n\n /**\n * Optional client certificate for mutual TLS authentication.\n *\n * The certificate in PEM format used to authenticate the client to the server.\n * The content of the file must be PEM format after decoding.\n * If a certificate chain is presented, the client certificate must be the first one.\n *\n * REQUIRED if TlsDefinition.mode is MODE_MTLS.\n * MUST NOT be provided if TlsDefinition.mode is MODE_SERVER_ONLY.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File certificate = 2;\n */\n certificate?: FileJson;\n\n /**\n * Optional client private key for mutual TLS authentication.\n *\n * The private key in PEM format corresponding to the client certificate.\n * The content of the file must be PEM format after decoding.\n * The content must contain a PRIVATE KEY block.\n *\n * REQUIRED if TlsDefinition.mode is MODE_MTLS.\n * MUST NOT be provided if TlsDefinition.mode is MODE_SERVER_ONLY.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.File private_key = 3;\n */\n privateKey?: FileJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.TlsConfig.\n * Use `create(TlsConfigSchema)` to create a new message.\n */\nexport const TlsConfigSchema: GenMessage<TlsConfig, {jsonType: TlsConfigJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 3);\n\n/**\n * The actual HTTP proxy configuration containing runtime values\n *\n * This message provides the actual configuration values for the HTTP proxy service,\n * including TLS certificates and template variable values for header injection.\n *\n * ## Relationship to HttpProxyDefinition\n *\n * - HttpProxyDefinition: Defines the schema (which headers to inject, template syntax, TLS mode)\n * - HttpProxyConfig: Provides the actual values (certificates, variable values)\n *\n * ## Example\n *\n * Given a definition with:\n * - inject_headers[\"Authorization\"].template.template = \"Bearer %ACCESS_TOKEN%\"\n * - tls.mode = MODE_SERVER_ONLY\n *\n * The config would provide:\n * - tls_config.ca_bundle = <actual CA certificate>\n * - template_variables[\"ACCESS_TOKEN\"] = \"eyJhbGci...\" (the actual token)\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HttpProxyConfig\n */\nexport type HttpProxyConfig = Message<\"mochabugapis.adapt.plugins.v1.HttpProxyConfig\"> & {\n /**\n * The actual TLS configuration with certificates and private keys.\n *\n * REQUIRED if HttpProxyDefinition.tls is set.\n * MUST NOT be set if HttpProxyDefinition.tls is not set.\n *\n * For MODE_SERVER_ONLY:\n * - Provide only ca_bundle\n * - Leave certificate and private_key empty\n *\n * For MODE_MTLS:\n * - Provide ca_bundle, certificate, AND private_key\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.TlsConfig tls_config = 1;\n */\n tlsConfig?: TlsConfig;\n\n /**\n * Template variable values for dynamic header injection, organized by header name.\n *\n * This provides the actual values for template variables used in HttpProxyDefinition.inject_headers.\n * Each header that uses template variables needs its variables resolved here.\n *\n * ## Structure\n *\n * Outer map key: HTTP header name (must match a key in HttpProxyDefinition.inject_headers)\n * Outer map value: Map of variable names to their actual values for that specific header\n *\n * This structure mirrors HttpProxyDefinition.inject_headers, making it clear\n * which variables belong to which header template.\n *\n * ## Variable Name Requirements\n *\n * Variable names must match the %VARIABLE% patterns used in the header's template:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Case-sensitive (e.g., %ACCESS_TOKEN% requires variable name \"ACCESS_TOKEN\")\n *\n * ## Examples\n *\n * Given a definition with:\n * - inject_headers[\"Authorization\"].template = \"Bearer %ACCESS_TOKEN%\"\n * - inject_headers[\"X-Correlation\"].template = \"%TENANT_ID%:%USER_ID%\"\n *\n * The config must provide:\n * - header_variables[\"Authorization\"][\"ACCESS_TOKEN\"] = \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n * - header_variables[\"X-Correlation\"][\"TENANT_ID\"] = \"org_123\"\n * - header_variables[\"X-Correlation\"][\"USER_ID\"] = \"user_456\"\n *\n * ## Security\n *\n * All values are stored securely and encrypted at rest.\n * The HeaderTemplate.plaintext flag (in the definition) controls whether\n * the variable value is treated as a secret or shown in logs/UI.\n *\n * ## Variable Resolution Process\n *\n * Users of the plugin are prompted to provide values for all template variables.\n * For system services, the plugin author provides the values programmatically.\n *\n * During configuration, it is fully transparent to users:\n * - Which hostname the request will be sent to (from allowed_hosts)\n * - Which headers are being injected\n * - What template variables are required\n * - Whether each variable is a secret or plaintext\n *\n * Users see exactly what data they are providing and where it will be sent.\n *\n * ## Runtime Behavior\n *\n * If a variable referenced in a header template is missing from this config,\n * the header injection will fail at runtime and the request will not be sent.\n *\n * ## Validation\n *\n * - Header names in this map MUST match headers in HttpProxyDefinition.inject_headers\n * - All variables referenced in each header's template must be provided\n * - Extra variables (not referenced in the template) are ignored\n *\n * @generated from field: map<string, mochabugapis.adapt.plugins.v1.HeaderVariables> header_variables = 2;\n */\n headerVariables: { [key: string]: HeaderVariables };\n};\n\n/**\n * The actual HTTP proxy configuration containing runtime values\n *\n * This message provides the actual configuration values for the HTTP proxy service,\n * including TLS certificates and template variable values for header injection.\n *\n * ## Relationship to HttpProxyDefinition\n *\n * - HttpProxyDefinition: Defines the schema (which headers to inject, template syntax, TLS mode)\n * - HttpProxyConfig: Provides the actual values (certificates, variable values)\n *\n * ## Example\n *\n * Given a definition with:\n * - inject_headers[\"Authorization\"].template.template = \"Bearer %ACCESS_TOKEN%\"\n * - tls.mode = MODE_SERVER_ONLY\n *\n * The config would provide:\n * - tls_config.ca_bundle = <actual CA certificate>\n * - template_variables[\"ACCESS_TOKEN\"] = \"eyJhbGci...\" (the actual token)\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HttpProxyConfig\n */\nexport type HttpProxyConfigJson = {\n /**\n * The actual TLS configuration with certificates and private keys.\n *\n * REQUIRED if HttpProxyDefinition.tls is set.\n * MUST NOT be set if HttpProxyDefinition.tls is not set.\n *\n * For MODE_SERVER_ONLY:\n * - Provide only ca_bundle\n * - Leave certificate and private_key empty\n *\n * For MODE_MTLS:\n * - Provide ca_bundle, certificate, AND private_key\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.TlsConfig tls_config = 1;\n */\n tlsConfig?: TlsConfigJson;\n\n /**\n * Template variable values for dynamic header injection, organized by header name.\n *\n * This provides the actual values for template variables used in HttpProxyDefinition.inject_headers.\n * Each header that uses template variables needs its variables resolved here.\n *\n * ## Structure\n *\n * Outer map key: HTTP header name (must match a key in HttpProxyDefinition.inject_headers)\n * Outer map value: Map of variable names to their actual values for that specific header\n *\n * This structure mirrors HttpProxyDefinition.inject_headers, making it clear\n * which variables belong to which header template.\n *\n * ## Variable Name Requirements\n *\n * Variable names must match the %VARIABLE% patterns used in the header's template:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Case-sensitive (e.g., %ACCESS_TOKEN% requires variable name \"ACCESS_TOKEN\")\n *\n * ## Examples\n *\n * Given a definition with:\n * - inject_headers[\"Authorization\"].template = \"Bearer %ACCESS_TOKEN%\"\n * - inject_headers[\"X-Correlation\"].template = \"%TENANT_ID%:%USER_ID%\"\n *\n * The config must provide:\n * - header_variables[\"Authorization\"][\"ACCESS_TOKEN\"] = \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n * - header_variables[\"X-Correlation\"][\"TENANT_ID\"] = \"org_123\"\n * - header_variables[\"X-Correlation\"][\"USER_ID\"] = \"user_456\"\n *\n * ## Security\n *\n * All values are stored securely and encrypted at rest.\n * The HeaderTemplate.plaintext flag (in the definition) controls whether\n * the variable value is treated as a secret or shown in logs/UI.\n *\n * ## Variable Resolution Process\n *\n * Users of the plugin are prompted to provide values for all template variables.\n * For system services, the plugin author provides the values programmatically.\n *\n * During configuration, it is fully transparent to users:\n * - Which hostname the request will be sent to (from allowed_hosts)\n * - Which headers are being injected\n * - What template variables are required\n * - Whether each variable is a secret or plaintext\n *\n * Users see exactly what data they are providing and where it will be sent.\n *\n * ## Runtime Behavior\n *\n * If a variable referenced in a header template is missing from this config,\n * the header injection will fail at runtime and the request will not be sent.\n *\n * ## Validation\n *\n * - Header names in this map MUST match headers in HttpProxyDefinition.inject_headers\n * - All variables referenced in each header's template must be provided\n * - Extra variables (not referenced in the template) are ignored\n *\n * @generated from field: map<string, mochabugapis.adapt.plugins.v1.HeaderVariables> header_variables = 2;\n */\n headerVariables?: { [key: string]: HeaderVariablesJson };\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.HttpProxyConfig.\n * Use `create(HttpProxyConfigSchema)` to create a new message.\n */\nexport const HttpProxyConfigSchema: GenMessage<HttpProxyConfig, {jsonType: HttpProxyConfigJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 4);\n\n/**\n * Variable values for a specific header's template substitution.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HeaderVariables\n */\nexport type HeaderVariables = Message<\"mochabugapis.adapt.plugins.v1.HeaderVariables\"> & {\n /**\n * Map of variable name to value.\n *\n * Key: Variable name matching %VAR_NAME% in the header's template\n * Value: The actual value to substitute\n *\n * @generated from field: map<string, string> variables = 1;\n */\n variables: { [key: string]: string };\n};\n\n/**\n * Variable values for a specific header's template substitution.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.HeaderVariables\n */\nexport type HeaderVariablesJson = {\n /**\n * Map of variable name to value.\n *\n * Key: Variable name matching %VAR_NAME% in the header's template\n * Value: The actual value to substitute\n *\n * @generated from field: map<string, string> variables = 1;\n */\n variables?: { [key: string]: string };\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.HeaderVariables.\n * Use `create(HeaderVariablesSchema)` to create a new message.\n */\nexport const HeaderVariablesSchema: GenMessage<HeaderVariables, {jsonType: HeaderVariablesJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_http_proxy_service, 5);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/oauth2_service.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenEnum, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { File, FileJson } from \"./file_pb\";\nimport { file_mochabugapis_adapt_plugins_v1_file } from \"./file_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/oauth2_service.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_oauth2_service: GenFile = /*@__PURE__*/\n fileDesc(\"CjJtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS9vYXV0aDJfc2VydmljZS5wcm90bxIdbW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEisgsKEE9hdXRoMkRlZmluaXRpb24STgoKZ3JhbnRfdHlwZRgBIAEoDjIuLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk9hdXRoMkdyYW50VHlwZUIKukgHggEEEAEgABIlCgZzY29wZXMYAiADKAlCFbpIEpIBDwgAEPQDGAEiBnIEEAEYZBJTCgthdXRoX21ldGhvZBgDIAEoDjItLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk9hdXRoMkF1dGhUeXBlQgq6SAeCAQQQASAASACIAQESSgoDYWxnGAQgASgOMiwubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuUHJpdmF0ZUtleUFsZ0IKukgHggEEEAEgAEgBiAEBEiIKCWNsaWVudF9pZBgFIAEoCUIKukgHcgUQARj6AUgCiAEBElYKDnRva2VuX2VuZHBvaW50GAYgASgJQj66SDtyORALGIAgMjJeaHR0cHM6Ly9bYS16QS1aMC05Li1dKyg/OlwuW2EtekEtWl17Mix9KSg/Oi8uKik/JBI8CgRjb2RlGAcgASgLMikubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuT2F1dGgyQ29kZUgDiAEBOpwHukiYBxrnAQoSb2F1dGgyLmF1dGhfbWV0aG9kEocBVGhlIGF1dGhfbWV0aG9kIHByb3BlcnR5IG11c3QgYmUgc2V0IGluIGNhc2Ugb2YgZ3JhbnRfdHlwZSBPQVVUSDJfR1JBTlRfVFlQRV9BVVRIT1JJWkFUSU9OX0NPREUgb3IgT0FVVEgyX0dSQU5UX1RZUEVfQ0xJRU5UX0NSRURFTlRJQUxTGkdoYXModGhpcy5hdXRoX21ldGhvZCkgPT0gKHRoaXMuZ3JhbnRfdHlwZSA9PSAxIHx8IHRoaXMuZ3JhbnRfdHlwZSA9PSAyKRrAAgoKb2F1dGgyLmFsZxK+AVRoZSBhbGcgcHJvcGVydHkgbXVzdCBiZSBzZXQgaW4gY2FzZSBvZiBncmFudF90eXBlIE9BVVRIMl9HUkFOVF9UWVBFX0pXVF9CRUFSRVIsIE9BVVRIMl9HUkFOVF9UWVBFX1NBTUwyX0JFQVJFUiBvciBhdXRoX21ldGhvZCBPQVVUSDJfQVVUSF9UWVBFX1BSSVZBVEVfS0VZX0pXVCwgT0FVVEgyX0FVVEhfVFlQRV9TQU1MMl9CRUFSRVIacWhhcyh0aGlzLmFsZykgPT0gKHRoaXMuZ3JhbnRfdHlwZSA9PSAzIHx8IHRoaXMuZ3JhbnRfdHlwZSA9PSA0IHx8IHRoaXMuYXV0aF9tZXRob2QgPT0gMyB8fCB0aGlzLmF1dGhfbWV0aG9kID09IDUpGtQBChBvYXV0aDIuY2xpZW50X2lkEl1UaGUgY2xpZW50X2lkIHByb3BlcnR5IG11c3QgYmUgc2V0IGluIGNhc2Ugb2YgZ3JhbnRfdHlwZSBPQVVUSDJfR1JBTlRfVFlQRV9BVVRIT1JJWkFUSU9OX0NPREUaYShoYXModGhpcy5jbGllbnRfaWQpID09ICh0aGlzLmdyYW50X3R5cGUgPT0gMSkpIHx8ICh0aGlzLmdyYW50X3R5cGUgIT0gMSAmJiAhaGFzKHRoaXMuY2xpZW50X2lkKSkakQEKC29hdXRoMi5jb2RlElhUaGUgY29kZSBwcm9wZXJ0eSBtdXN0IGJlIHNldCBpbiBjYXNlIG9mIGdyYW50X3R5cGUgT0FVVEgyX0dSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFGihoYXModGhpcy5jb2RlKSA9PSAodGhpcy5ncmFudF90eXBlID09IDEpQg4KDF9hdXRoX21ldGhvZEIGCgRfYWxnQgwKCl9jbGllbnRfaWRCBwoFX2NvZGUiqAIKCk9hdXRoMkNvZGUSVQoNYXV0aF9lbmRwb2ludBgBIAEoCUI+ukg7cjkQCxiAIDIyXmh0dHBzOi8vW2EtekEtWjAtOS4tXSsoPzpcLlthLXpBLVpdezIsfSkoPzovLiopPyQSeAoRYWRkaXRpb25hbF9wYXJhbXMYAiADKAsyPy5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5PYXV0aDJDb2RlLkFkZGl0aW9uYWxQYXJhbXNFbnRyeUIcukgZmgEWCAAQMiIHcgUQARj6ASoHcgUQARj6ARIQCgh1c2VfcGtjZRgDIAEoCBo3ChVBZGRpdGlvbmFsUGFyYW1zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKuAwoMT2F1dGgyQ29uZmlnEiIKCWNsaWVudF9pZBgBIAEoCUIKukgHcgUQARiAAkgBiAEBEj4KCmJhc2ljX2F1dGgYAiABKAsyKC5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5CYXNpY0F1dGhIABI8Cglmb3JtX2F1dGgYAyABKAsyJy5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5Gb3JtQXV0aEgAEkkKEHByaXZhdGVfand0X2F1dGgYBCABKAsyLS5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5Qcml2YXRlSldUQXV0aEgAEjwKCW10bHNfYXV0aBgFIAEoCzInLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLk1UTFNBdXRoSAASPAoJc2FtbF9hdXRoGAYgASgLMicubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuU0FNTEF1dGhIABIRCgdjb25zZW50GAcgASgISABCFAoLYXV0aF9tZXRob2QSBbpIAggBQgwKCl9jbGllbnRfaWQiLgoJQmFzaWNBdXRoEiEKDWNsaWVudF9zZWNyZXQYASABKAlCCrpIB3IFEAUYgAIiLQoIRm9ybUF1dGgSIQoNY2xpZW50X3NlY3JldBgBIAEoCUIKukgHcgUQBRiAAiKAAQoOUHJpdmF0ZUpXVEF1dGgSQAoLcHJpdmF0ZV9rZXkYASABKAsyIy5tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MS5GaWxlQga6SAPIAQESIAoHc3ViamVjdBgCIAEoCUIKukgHcgUQARiAAkgAiAEBQgoKCF9zdWJqZWN0IucCCghNVExTQXV0aBJACgtjZXJ0aWZpY2F0ZRgBIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVCBrpIA8gBARJACgtwcml2YXRlX2tleRgCIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVCBrpIA8gBARJDCg5jYV9jZXJ0aWZpY2F0ZRgDIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkZpbGVCBrpIA8gBARJ9ChBjZXJ0aWZpY2F0ZV9ob3N0GAQgASgJQl66SFtyWRABGP0BMlJeKFwqXC4pP1thLXowLTldKFthLXowLTktXXswLDYxfVthLXowLTldKT8oXC5bYS16MC05XShbYS16MC05LV17MCw2MX1bYS16MC05XSk/KSokSACIAQFCEwoRX2NlcnRpZmljYXRlX2hvc3QijgEKCFNBTUxBdXRoEkAKC3ByaXZhdGVfa2V5GAEgASgLMiMubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuRmlsZUIGukgDyAEBEkAKC2NlcnRpZmljYXRlGAIgASgLMiMubW9jaGFidWdhcGlzLmFkYXB0LnBsdWdpbnMudjEuRmlsZUIGukgDyAEBKksKDVByaXZhdGVLZXlBbGcSHwobUFJJVkFURV9LRVlfQUxHX1VOU1BFQ0lGSUVEEAASGQoVUFJJVkFURV9LRVlfQUxHX1JTMjU2EAEqzgEKD09hdXRoMkdyYW50VHlwZRIhCh1PQVVUSDJfR1JBTlRfVFlQRV9VTlNQRUNJRklFRBAAEigKJE9BVVRIMl9HUkFOVF9UWVBFX0FVVEhPUklaQVRJT05fQ09ERRABEigKJE9BVVRIMl9HUkFOVF9UWVBFX0NMSUVOVF9DUkVERU5USUFMUxACEiAKHE9BVVRIMl9HUkFOVF9UWVBFX0pXVF9CRUFSRVIQAxIiCh5PQVVUSDJfR1JBTlRfVFlQRV9TQU1MMl9CRUFSRVIQBCrNAQoOT2F1dGgyQXV0aFR5cGUSIAocT0FVVEgyX0FVVEhfVFlQRV9VTlNQRUNJRklFRBAAEhoKFk9BVVRIMl9BVVRIX1RZUEVfQkFTSUMQARIZChVPQVVUSDJfQVVUSF9UWVBFX0ZPUk0QAhIkCiBPQVVUSDJfQVVUSF9UWVBFX1BSSVZBVEVfS0VZX0pXVBADEhkKFU9BVVRIMl9BVVRIX1RZUEVfTVRMUxAEEiEKHU9BVVRIMl9BVVRIX1RZUEVfU0FNTDJfQkVBUkVSEAViBnByb3RvMw\", [file_buf_validate_validate, file_mochabugapis_adapt_plugins_v1_file]);\n\n/**\n * OAuth2 service configuration\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Definition\n */\nexport type Oauth2Definition = Message<\"mochabugapis.adapt.plugins.v1.Oauth2Definition\"> & {\n /**\n * The OAuth2 grant type to be used.\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.Oauth2GrantType grant_type = 1;\n */\n grantType: Oauth2GrantType;\n\n /**\n * The requested scopes (OPTIONAL per RFC 6749 Section 3.3).\n * If omitted, the authorization server will use a pre-defined default or fail.\n *\n * @generated from field: repeated string scopes = 2;\n */\n scopes: string[];\n\n /**\n * The client authentication method.\n * REQUIRED when grant_type is:\n * - OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE\n * - OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS\n *\n * MUST NOT be set when grant_type is:\n * - OAUTH2_GRANT_TYPE_JWT_BEARER\n * - OAUTH2_GRANT_TYPE_SAML2_BEARER\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.Oauth2AuthType auth_method = 3;\n */\n authMethod?: Oauth2AuthType;\n\n /**\n * Algorithm used for signing assertions.\n * REQUIRED when:\n * - grant_type is OAUTH2_GRANT_TYPE_JWT_BEARER\n * - grant_type is OAUTH2_GRANT_TYPE_SAML2_BEARER\n * - auth_method is OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT\n * - auth_method is OAUTH2_AUTH_TYPE_SAML2_BEARER\n *\n * MUST NOT be set otherwise.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.PrivateKeyAlg alg = 4;\n */\n alg?: PrivateKeyAlg;\n\n /**\n * Client ID.\n * This is required when used as plugin_oauth2, but not onto a vertex => oauth2\n *\n * @generated from field: optional string client_id = 5;\n */\n clientId?: string;\n\n /**\n * The token endpoint URL.\n *\n * @generated from field: string token_endpoint = 6;\n */\n tokenEndpoint: string;\n\n /**\n * Configuration specific to the Authorization Code grant type.\n * REQUIRED when grant_type is OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE.\n * MUST NOT be set otherwise.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.Oauth2Code code = 7;\n */\n code?: Oauth2Code;\n};\n\n/**\n * OAuth2 service configuration\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Definition\n */\nexport type Oauth2DefinitionJson = {\n /**\n * The OAuth2 grant type to be used.\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.Oauth2GrantType grant_type = 1;\n */\n grantType?: Oauth2GrantTypeJson;\n\n /**\n * The requested scopes (OPTIONAL per RFC 6749 Section 3.3).\n * If omitted, the authorization server will use a pre-defined default or fail.\n *\n * @generated from field: repeated string scopes = 2;\n */\n scopes?: string[];\n\n /**\n * The client authentication method.\n * REQUIRED when grant_type is:\n * - OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE\n * - OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS\n *\n * MUST NOT be set when grant_type is:\n * - OAUTH2_GRANT_TYPE_JWT_BEARER\n * - OAUTH2_GRANT_TYPE_SAML2_BEARER\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.Oauth2AuthType auth_method = 3;\n */\n authMethod?: Oauth2AuthTypeJson;\n\n /**\n * Algorithm used for signing assertions.\n * REQUIRED when:\n * - grant_type is OAUTH2_GRANT_TYPE_JWT_BEARER\n * - grant_type is OAUTH2_GRANT_TYPE_SAML2_BEARER\n * - auth_method is OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT\n * - auth_method is OAUTH2_AUTH_TYPE_SAML2_BEARER\n *\n * MUST NOT be set otherwise.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.PrivateKeyAlg alg = 4;\n */\n alg?: PrivateKeyAlgJson;\n\n /**\n * Client ID.\n * This is required when used as plugin_oauth2, but not onto a vertex => oauth2\n *\n * @generated from field: optional string client_id = 5;\n */\n clientId?: string;\n\n /**\n * The token endpoint URL.\n *\n * @generated from field: string token_endpoint = 6;\n */\n tokenEndpoint?: string;\n\n /**\n * Configuration specific to the Authorization Code grant type.\n * REQUIRED when grant_type is OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE.\n * MUST NOT be set otherwise.\n *\n * @generated from field: optional mochabugapis.adapt.plugins.v1.Oauth2Code code = 7;\n */\n code?: Oauth2CodeJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Oauth2Definition.\n * Use `create(Oauth2DefinitionSchema)` to create a new message.\n */\nexport const Oauth2DefinitionSchema: GenMessage<Oauth2Definition, {jsonType: Oauth2DefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 0);\n\n/**\n * The code grant type\n * IMPORTANT: it has to be configured with refresh token in order to work correctly\n * this is not needed for client credentials of course since we are owning the client\n * WE ONLY SUPPORT OIDC since we need the sub claim to distinguish between different users\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Code\n */\nexport type Oauth2Code = Message<\"mochabugapis.adapt.plugins.v1.Oauth2Code\"> & {\n /**\n * The auth endpoint (i.e. where it gets redirected for login)\n *\n * @generated from field: string auth_endpoint = 1;\n */\n authEndpoint: string;\n\n /**\n * Additional parameters used for the oauth2 login endpoint\n * Do not include state or nonce here since we're generating them\n * in the backend. All params will be encoded in the URL\n *\n * @generated from field: map<string, string> additional_params = 2;\n */\n additionalParams: { [key: string]: string };\n\n /**\n * Whether or not to use the PKCE extension\n *\n * @generated from field: bool use_pkce = 3;\n */\n usePkce: boolean;\n};\n\n/**\n * The code grant type\n * IMPORTANT: it has to be configured with refresh token in order to work correctly\n * this is not needed for client credentials of course since we are owning the client\n * WE ONLY SUPPORT OIDC since we need the sub claim to distinguish between different users\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Code\n */\nexport type Oauth2CodeJson = {\n /**\n * The auth endpoint (i.e. where it gets redirected for login)\n *\n * @generated from field: string auth_endpoint = 1;\n */\n authEndpoint?: string;\n\n /**\n * Additional parameters used for the oauth2 login endpoint\n * Do not include state or nonce here since we're generating them\n * in the backend. All params will be encoded in the URL\n *\n * @generated from field: map<string, string> additional_params = 2;\n */\n additionalParams?: { [key: string]: string };\n\n /**\n * Whether or not to use the PKCE extension\n *\n * @generated from field: bool use_pkce = 3;\n */\n usePkce?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Oauth2Code.\n * Use `create(Oauth2CodeSchema)` to create a new message.\n */\nexport const Oauth2CodeSchema: GenMessage<Oauth2Code, {jsonType: Oauth2CodeJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 1);\n\n/**\n * The actual oauth2 config\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Config\n */\nexport type Oauth2Config = Message<\"mochabugapis.adapt.plugins.v1.Oauth2Config\"> & {\n /**\n * The client id, required for client credentials on vertices only\n *\n * @generated from field: optional string client_id = 1;\n */\n clientId?: string;\n\n /**\n * The auth method is required to be set\n *\n * @generated from oneof mochabugapis.adapt.plugins.v1.Oauth2Config.auth_method\n */\n authMethod: {\n /**\n * Use basic authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.BasicAuth basic_auth = 2;\n */\n value: BasicAuth;\n case: \"basicAuth\";\n } | {\n /**\n * Use form authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.FormAuth form_auth = 3;\n */\n value: FormAuth;\n case: \"formAuth\";\n } | {\n /**\n * Use private JWT authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.PrivateJWTAuth private_jwt_auth = 4;\n */\n value: PrivateJWTAuth;\n case: \"privateJwtAuth\";\n } | {\n /**\n * Use mTLS authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.MTLSAuth mtls_auth = 5;\n */\n value: MTLSAuth;\n case: \"mtlsAuth\";\n } | {\n /**\n * Use SAML bearer authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.SAMLAuth saml_auth = 6;\n */\n value: SAMLAuth;\n case: \"samlAuth\";\n } | {\n /**\n * In case we have code flow with consent\n *\n * @generated from field: bool consent = 7;\n */\n value: boolean;\n case: \"consent\";\n } | { case: undefined; value?: undefined };\n};\n\n/**\n * The actual oauth2 config\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Oauth2Config\n */\nexport type Oauth2ConfigJson = {\n /**\n * The client id, required for client credentials on vertices only\n *\n * @generated from field: optional string client_id = 1;\n */\n clientId?: string;\n\n /**\n * Use basic authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.BasicAuth basic_auth = 2;\n */\n basicAuth?: BasicAuthJson;\n\n /**\n * Use form authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.FormAuth form_auth = 3;\n */\n formAuth?: FormAuthJson;\n\n /**\n * Use private JWT authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.PrivateJWTAuth private_jwt_auth = 4;\n */\n privateJwtAuth?: PrivateJWTAuthJson;\n\n /**\n * Use mTLS authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.MTLSAuth mtls_auth = 5;\n */\n mtlsAuth?: MTLSAuthJson;\n\n /**\n * Use SAML bearer authentication for the client\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.SAMLAuth saml_auth = 6;\n */\n samlAuth?: SAMLAuthJson;\n\n /**\n * In case we have code flow with consent\n *\n * @generated from field: bool consent = 7;\n */\n consent?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Oauth2Config.\n * Use `create(Oauth2ConfigSchema)` to create a new message.\n */\nexport const Oauth2ConfigSchema: GenMessage<Oauth2Config, {jsonType: Oauth2ConfigJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 2);\n\n/**\n * Basic auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.BasicAuth\n */\nexport type BasicAuth = Message<\"mochabugapis.adapt.plugins.v1.BasicAuth\"> & {\n /**\n * The password\n *\n * @generated from field: string client_secret = 1;\n */\n clientSecret: string;\n};\n\n/**\n * Basic auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.BasicAuth\n */\nexport type BasicAuthJson = {\n /**\n * The password\n *\n * @generated from field: string client_secret = 1;\n */\n clientSecret?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.BasicAuth.\n * Use `create(BasicAuthSchema)` to create a new message.\n */\nexport const BasicAuthSchema: GenMessage<BasicAuth, {jsonType: BasicAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 3);\n\n/**\n * Form auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.FormAuth\n */\nexport type FormAuth = Message<\"mochabugapis.adapt.plugins.v1.FormAuth\"> & {\n /**\n * The password\n *\n * @generated from field: string client_secret = 1;\n */\n clientSecret: string;\n};\n\n/**\n * Form auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.FormAuth\n */\nexport type FormAuthJson = {\n /**\n * The password\n *\n * @generated from field: string client_secret = 1;\n */\n clientSecret?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.FormAuth.\n * Use `create(FormAuthSchema)` to create a new message.\n */\nexport const FormAuthSchema: GenMessage<FormAuth, {jsonType: FormAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 4);\n\n/**\n * Private JWT auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.PrivateJWTAuth\n */\nexport type PrivateJWTAuth = Message<\"mochabugapis.adapt.plugins.v1.PrivateJWTAuth\"> & {\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 1;\n */\n privateKey?: File;\n\n /**\n * Optional subject for impersonation\n * If not provided, the client_id will be used as the subject\n *\n * @generated from field: optional string subject = 2;\n */\n subject?: string;\n};\n\n/**\n * Private JWT auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.PrivateJWTAuth\n */\nexport type PrivateJWTAuthJson = {\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 1;\n */\n privateKey?: FileJson;\n\n /**\n * Optional subject for impersonation\n * If not provided, the client_id will be used as the subject\n *\n * @generated from field: optional string subject = 2;\n */\n subject?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.PrivateJWTAuth.\n * Use `create(PrivateJWTAuthSchema)` to create a new message.\n */\nexport const PrivateJWTAuthSchema: GenMessage<PrivateJWTAuth, {jsonType: PrivateJWTAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 5);\n\n/**\n * mTLS auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.MTLSAuth\n */\nexport type MTLSAuth = Message<\"mochabugapis.adapt.plugins.v1.MTLSAuth\"> & {\n /**\n * The certificate in PEM format\n * The content of the file must be PEM format after decoding\n * If a certificate chain is presented. The server certificate must be the first one\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File certificate = 1;\n */\n certificate?: File;\n\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 2;\n */\n privateKey?: File;\n\n /**\n * The CA certificate in PEM format. Trusted server authority file\n * The content of the file must be PEM format after decoding\n * The content must contain a CERTIFICATE block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File ca_certificate = 3;\n */\n caCertificate?: File;\n\n /**\n * The expected hostname for certificate verification (SNI - Server Name Indication).\n *\n * If present, the client will:\n * 1. Send this hostname in the TLS SNI extension during the handshake\n * 2. Verify that the server's certificate authenticates this specific hostname\n *\n * If not provided:\n * - The hostname is derived from the target upstream address\n * - For IP addresses, certificate verification may fail unless the cert includes the IP as a SAN\n *\n * ## Use Cases\n *\n * 1. **IP-based connections with hostname certificates:**\n * - Upstream address: 192.168.1.100:443\n * - certificate_host: \"api.example.com\"\n * - Server presents cert for api.example.com\n *\n * 2. **Load balancers or proxies:**\n * - Upstream address: lb.internal:443\n * - certificate_host: \"api.example.com\"\n * - Verify against the public hostname, not internal LB name\n *\n * 3. **Shared hosting / Virtual hosting:**\n * - Multiple services on same IP, different certs via SNI\n * - Server selects correct certificate based on SNI hostname\n *\n * ## Certificate Verification\n *\n * The server certificate must contain this hostname in either:\n * - Common Name (CN) field\n * - Subject Alternative Name (SAN) extension\n *\n * ## Format\n *\n * Must be a valid hostname (DNS name), not an IP address.\n * Examples: \"api.example.com\", \"service.internal\", \"*.example.com\" (for wildcard matching)\n *\n * @generated from field: optional string certificate_host = 4;\n */\n certificateHost?: string;\n};\n\n/**\n * mTLS auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.MTLSAuth\n */\nexport type MTLSAuthJson = {\n /**\n * The certificate in PEM format\n * The content of the file must be PEM format after decoding\n * If a certificate chain is presented. The server certificate must be the first one\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File certificate = 1;\n */\n certificate?: FileJson;\n\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 2;\n */\n privateKey?: FileJson;\n\n /**\n * The CA certificate in PEM format. Trusted server authority file\n * The content of the file must be PEM format after decoding\n * The content must contain a CERTIFICATE block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File ca_certificate = 3;\n */\n caCertificate?: FileJson;\n\n /**\n * The expected hostname for certificate verification (SNI - Server Name Indication).\n *\n * If present, the client will:\n * 1. Send this hostname in the TLS SNI extension during the handshake\n * 2. Verify that the server's certificate authenticates this specific hostname\n *\n * If not provided:\n * - The hostname is derived from the target upstream address\n * - For IP addresses, certificate verification may fail unless the cert includes the IP as a SAN\n *\n * ## Use Cases\n *\n * 1. **IP-based connections with hostname certificates:**\n * - Upstream address: 192.168.1.100:443\n * - certificate_host: \"api.example.com\"\n * - Server presents cert for api.example.com\n *\n * 2. **Load balancers or proxies:**\n * - Upstream address: lb.internal:443\n * - certificate_host: \"api.example.com\"\n * - Verify against the public hostname, not internal LB name\n *\n * 3. **Shared hosting / Virtual hosting:**\n * - Multiple services on same IP, different certs via SNI\n * - Server selects correct certificate based on SNI hostname\n *\n * ## Certificate Verification\n *\n * The server certificate must contain this hostname in either:\n * - Common Name (CN) field\n * - Subject Alternative Name (SAN) extension\n *\n * ## Format\n *\n * Must be a valid hostname (DNS name), not an IP address.\n * Examples: \"api.example.com\", \"service.internal\", \"*.example.com\" (for wildcard matching)\n *\n * @generated from field: optional string certificate_host = 4;\n */\n certificateHost?: string;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.MTLSAuth.\n * Use `create(MTLSAuthSchema)` to create a new message.\n */\nexport const MTLSAuthSchema: GenMessage<MTLSAuth, {jsonType: MTLSAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 6);\n\n/**\n * SAML bearer auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.SAMLAuth\n */\nexport type SAMLAuth = Message<\"mochabugapis.adapt.plugins.v1.SAMLAuth\"> & {\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 1;\n */\n privateKey?: File;\n\n /**\n * The certificate in PEM format\n * The content of the file must be PEM format after decoding\n * If a certificate chain is presented. The server certificate must be the first one\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File certificate = 2;\n */\n certificate?: File;\n};\n\n/**\n * SAML bearer auth\n *\n * @generated from message mochabugapis.adapt.plugins.v1.SAMLAuth\n */\nexport type SAMLAuthJson = {\n /**\n * The private key in PEM format\n * The content of the file must be PEM format after decoding\n * The content must contain a PRIVATE KEY block\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File private_key = 1;\n */\n privateKey?: FileJson;\n\n /**\n * The certificate in PEM format\n * The content of the file must be PEM format after decoding\n * If a certificate chain is presented. The server certificate must be the first one\n *\n * @generated from field: mochabugapis.adapt.plugins.v1.File certificate = 2;\n */\n certificate?: FileJson;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.SAMLAuth.\n * Use `create(SAMLAuthSchema)` to create a new message.\n */\nexport const SAMLAuthSchema: GenMessage<SAMLAuth, {jsonType: SAMLAuthJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 7);\n\n/**\n * The algorithm used for signing JWT or SAML assertions\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.PrivateKeyAlg\n */\nexport enum PrivateKeyAlg {\n /**\n * Unknown algorithm (invalid)\n *\n * @generated from enum value: PRIVATE_KEY_ALG_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * RS256 algorithm\n *\n * @generated from enum value: PRIVATE_KEY_ALG_RS256 = 1;\n */\n RS256 = 1,\n}\n\n/**\n * The algorithm used for signing JWT or SAML assertions\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.PrivateKeyAlg\n */\nexport type PrivateKeyAlgJson = \"PRIVATE_KEY_ALG_UNSPECIFIED\" | \"PRIVATE_KEY_ALG_RS256\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.PrivateKeyAlg.\n */\nexport const PrivateKeyAlgSchema: GenEnum<PrivateKeyAlg, PrivateKeyAlgJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 0);\n\n/**\n * The OAuth2 grant type\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Oauth2GrantType\n */\nexport enum Oauth2GrantType {\n /**\n * Not specified (invalid)\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Authorization Code Grant\n * grant_type=authorization_code\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE = 1;\n */\n AUTHORIZATION_CODE = 1,\n\n /**\n * Client Credentials Grant\n * grant_type=client_credentials\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS = 2;\n */\n CLIENT_CREDENTIALS = 2,\n\n /**\n * JWT Bearer Assertion Grant\n * grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_JWT_BEARER = 3;\n */\n JWT_BEARER = 3,\n\n /**\n * SAML 2.0 Bearer Assertion Grant\n * grant_type=urn:ietf:params:oauth:grant-type:saml2-bearer\n *\n * @generated from enum value: OAUTH2_GRANT_TYPE_SAML2_BEARER = 4;\n */\n SAML2_BEARER = 4,\n}\n\n/**\n * The OAuth2 grant type\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Oauth2GrantType\n */\nexport type Oauth2GrantTypeJson = \"OAUTH2_GRANT_TYPE_UNSPECIFIED\" | \"OAUTH2_GRANT_TYPE_AUTHORIZATION_CODE\" | \"OAUTH2_GRANT_TYPE_CLIENT_CREDENTIALS\" | \"OAUTH2_GRANT_TYPE_JWT_BEARER\" | \"OAUTH2_GRANT_TYPE_SAML2_BEARER\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.Oauth2GrantType.\n */\nexport const Oauth2GrantTypeSchema: GenEnum<Oauth2GrantType, Oauth2GrantTypeJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 1);\n\n/**\n * The OAuth2 client authentication method\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Oauth2AuthType\n */\nexport enum Oauth2AuthType {\n /**\n * Not specified (invalid)\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Basic Authentication (client ID and secret in Authorization header)\n * client_secret_basic\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_BASIC = 1;\n */\n BASIC = 1,\n\n /**\n * Form Authentication (client ID and secret in form body)\n * client_secret_post\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_FORM = 2;\n */\n FORM = 2,\n\n /**\n * Private Key JWT Authentication\n * client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT = 3;\n */\n PRIVATE_KEY_JWT = 3,\n\n /**\n * Mutual TLS Authentication\n * tls_client_auth / self_signed_tls_client_auth\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_MTLS = 4;\n */\n MTLS = 4,\n\n /**\n * SAML 2.0 Bearer Assertion for Client Authentication\n * client_assertion_type=urn:ietf:params:oauth:client-assertion-type:saml2-bearer\n *\n * @generated from enum value: OAUTH2_AUTH_TYPE_SAML2_BEARER = 5;\n */\n SAML2_BEARER = 5,\n}\n\n/**\n * The OAuth2 client authentication method\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Oauth2AuthType\n */\nexport type Oauth2AuthTypeJson = \"OAUTH2_AUTH_TYPE_UNSPECIFIED\" | \"OAUTH2_AUTH_TYPE_BASIC\" | \"OAUTH2_AUTH_TYPE_FORM\" | \"OAUTH2_AUTH_TYPE_PRIVATE_KEY_JWT\" | \"OAUTH2_AUTH_TYPE_MTLS\" | \"OAUTH2_AUTH_TYPE_SAML2_BEARER\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.Oauth2AuthType.\n */\nexport const Oauth2AuthTypeSchema: GenEnum<Oauth2AuthType, Oauth2AuthTypeJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_oauth2_service, 2);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/variable_service.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { Value, ValueJson } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_struct } from \"@bufbuild/protobuf/wkt\";\nimport type { JTDSchema, JTDSchemaJson } from \"../../graph/jtd_schema_pb\";\nimport { file_mochabugapis_adapt_graph_jtd_schema } from \"../../graph/jtd_schema_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/variable_service.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_variable_service: GenFile = /*@__PURE__*/\n fileDesc(\"CjRtb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS92YXJpYWJsZV9zZXJ2aWNlLnByb3RvEh1tb2NoYWJ1Z2FwaXMuYWRhcHQucGx1Z2lucy52MSKeAQoSVmFyaWFibGVEZWZpbml0aW9uEjsKBnNjaGVtYRgBIAEoCzIjLm1vY2hhYnVnYXBpcy5hZGFwdC5ncmFwaC5KVERTY2hlbWFCBrpIA8gBARIsCgdkZWZhdWx0GAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlSACIAQESEQoJcGxhaW50ZXh0GAMgASgIQgoKCF9kZWZhdWx0YgZwcm90bzM\", [file_buf_validate_validate, file_google_protobuf_struct, file_mochabugapis_adapt_graph_jtd_schema]);\n\n/**\n * A definition of a JSON variable\n *\n * This message represents a variable used within the hosting platform.\n * Variables are essential for configuring applications and services hosted on the platform.\n * They store values that can be accessed by the application or service during runtime.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.VariableDefinition\n */\nexport type VariableDefinition = Message<\"mochabugapis.adapt.plugins.v1.VariableDefinition\"> & {\n /**\n * The schema that the variable must adhere to\n *\n * @generated from field: mochabugapis.adapt.graph.JTDSchema schema = 1;\n */\n schema?: JTDSchema;\n\n /**\n * The optional default value.\n *\n * ## Default Behavior: System Settings vs User Settings\n *\n * **System Settings** (Manifest.system_services):\n * - Defaults are automatically applied when the plugin is installed\n * - The service is marked as \"configured\" if all required bindings have defaults\n * - Plugin creators define and approve these defaults\n *\n * **User Settings** (Vertex.user_services):\n * - Defaults are UI hints only and NOT automatically applied\n * - The service is NOT marked as \"configured\" until the user explicitly submits settings\n * - Users must review and approve all settings, even with defaults present\n * - This ensures users actively consent to configuration values\n *\n * ## Rationale\n *\n * System settings use automatic defaults because the plugin creator (who defines\n * the defaults) is also the one approving them during plugin development.\n *\n * User settings require explicit submission because end users need to review and\n * consciously approve configuration values, even if reasonable defaults exist.\n *\n * IF the default value is pointing to a file with .json ending it's content will be\n * loaded and parsed as JSON.\n *\n * @generated from field: optional google.protobuf.Value default = 2;\n */\n default?: Value;\n\n /**\n * If true, the variable value is NOT treated as a secret.\n *\n * ## When plaintext = false (default):\n * - Values are encrypted at rest\n * - Values are treated as sensitive secrets\n *\n * ## When plaintext = true:\n * - Values are stored normally (not encrypted)\n * - Values are treated as non-sensitive data\n *\n * ## Use Cases for plaintext = false (default):\n * - API keys, access tokens, passwords\n * - Database connection strings with credentials\n * - Encryption keys, signing secrets\n * - OAuth client secrets\n * - Any credential material\n *\n * ## Use Cases for plaintext = true:\n * - Public configuration values\n * - Feature flags\n * - API endpoints (URLs without credentials)\n * - User IDs, tenant IDs, organization IDs\n * - Public identifiers\n *\n * ## Security Best Practices\n *\n * ALWAYS leave plaintext = false (default) for:\n * - Anything that grants access or authorization\n * - Anything that could be used to impersonate a user or service\n * - Any sensitive user-provided data\n *\n * Only set plaintext = true when the value contains non-sensitive\n * user-provided information.\n *\n * Default: false (variables are secrets by default)\n *\n * @generated from field: bool plaintext = 3;\n */\n plaintext: boolean;\n};\n\n/**\n * A definition of a JSON variable\n *\n * This message represents a variable used within the hosting platform.\n * Variables are essential for configuring applications and services hosted on the platform.\n * They store values that can be accessed by the application or service during runtime.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.VariableDefinition\n */\nexport type VariableDefinitionJson = {\n /**\n * The schema that the variable must adhere to\n *\n * @generated from field: mochabugapis.adapt.graph.JTDSchema schema = 1;\n */\n schema?: JTDSchemaJson;\n\n /**\n * The optional default value.\n *\n * ## Default Behavior: System Settings vs User Settings\n *\n * **System Settings** (Manifest.system_services):\n * - Defaults are automatically applied when the plugin is installed\n * - The service is marked as \"configured\" if all required bindings have defaults\n * - Plugin creators define and approve these defaults\n *\n * **User Settings** (Vertex.user_services):\n * - Defaults are UI hints only and NOT automatically applied\n * - The service is NOT marked as \"configured\" until the user explicitly submits settings\n * - Users must review and approve all settings, even with defaults present\n * - This ensures users actively consent to configuration values\n *\n * ## Rationale\n *\n * System settings use automatic defaults because the plugin creator (who defines\n * the defaults) is also the one approving them during plugin development.\n *\n * User settings require explicit submission because end users need to review and\n * consciously approve configuration values, even if reasonable defaults exist.\n *\n * IF the default value is pointing to a file with .json ending it's content will be\n * loaded and parsed as JSON.\n *\n * @generated from field: optional google.protobuf.Value default = 2;\n */\n default?: ValueJson;\n\n /**\n * If true, the variable value is NOT treated as a secret.\n *\n * ## When plaintext = false (default):\n * - Values are encrypted at rest\n * - Values are treated as sensitive secrets\n *\n * ## When plaintext = true:\n * - Values are stored normally (not encrypted)\n * - Values are treated as non-sensitive data\n *\n * ## Use Cases for plaintext = false (default):\n * - API keys, access tokens, passwords\n * - Database connection strings with credentials\n * - Encryption keys, signing secrets\n * - OAuth client secrets\n * - Any credential material\n *\n * ## Use Cases for plaintext = true:\n * - Public configuration values\n * - Feature flags\n * - API endpoints (URLs without credentials)\n * - User IDs, tenant IDs, organization IDs\n * - Public identifiers\n *\n * ## Security Best Practices\n *\n * ALWAYS leave plaintext = false (default) for:\n * - Anything that grants access or authorization\n * - Anything that could be used to impersonate a user or service\n * - Any sensitive user-provided data\n *\n * Only set plaintext = true when the value contains non-sensitive\n * user-provided information.\n *\n * Default: false (variables are secrets by default)\n *\n * @generated from field: bool plaintext = 3;\n */\n plaintext?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.VariableDefinition.\n * Use `create(VariableDefinitionSchema)` to create a new message.\n */\nexport const VariableDefinitionSchema: GenMessage<VariableDefinition, {jsonType: VariableDefinitionJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_variable_service, 0);\n\n", "// Copyright 2023, mochabug AB\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// @generated by protoc-gen-es v2.10.1 with parameter \"target=ts,json_types=true,ts_nocheck=true\"\n// @generated from file mochabugapis/adapt/plugins/v1/vertex.proto (package mochabugapis.adapt.plugins.v1, syntax proto3)\n/* eslint-disable */\n// @ts-nocheck\n\nimport type { GenEnum, GenFile, GenMessage } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport { file_buf_validate_validate } from \"../../../../buf/validate/validate_pb\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file mochabugapis/adapt/plugins/v1/vertex.proto.\n */\nexport const file_mochabugapis_adapt_plugins_v1_vertex: GenFile = /*@__PURE__*/\n fileDesc(\"Ciptb2NoYWJ1Z2FwaXMvYWRhcHQvcGx1Z2lucy92MS92ZXJ0ZXgucHJvdG8SHW1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxIpMECgZWZXJ0ZXgSMwoEbmFtZRgBIAEoCUIlukgiciAQARhkMhpeW18kYS16QS1aXVtfJGEtekEtWjAtOV0qJBIYCgVsYWJlbBgCIAEoCUIJukgGcgQQARhkEiQKC2Rlc2NyaXB0aW9uGAMgASgJQgq6SAdyBRABGPoBSACIAQESYgoEbG9nbxgEIAEoCUJPukhMckoQAhiAIDJDXihbXi9dKygvW14vXSspKilcLihnaWZ8anBnfGpwZWd8amZpZnxwanBlZ3xwanB8cG5nfHN2Z3x3ZWJwfGF2aWYpJEgBiAEBElIKDGNhcGFiaWxpdGllcxgFIAMoDjIpLm1vY2hhYnVnYXBpcy5hZGFwdC5wbHVnaW5zLnYxLkNhcGFiaWxpdHlCEbpIDpIBCxgBIgeCAQQQASAAEjIKBmNvbmZpZxgGIAEoCUIdukgachgQBRiAIDIRXihbXi9dKygvW14vXSspKilIAogBARI2CghtZXRhZGF0YRgHIAEoCUIkukghch8QBRiAIDIYXihbXi9dKygvW14vXSspKilcLmpzb24kEiQKDXVzZXJfc2VydmljZXMYCCADKAlCDbpICpIBBwgAEPQDGAESFwoKZGVwcmVjYXRlZBgJIAEoCEgDiAEBQg4KDF9kZXNjcmlwdGlvbkIHCgVfbG9nb0IJCgdfY29uZmlnQg0KC19kZXByZWNhdGVkKosBCgpDYXBhYmlsaXR5EhoKFkNBUEFCSUxJVFlfVU5TUEVDSUZJRUQQABITCg9DQVBBQklMSVRZX0NST04QARIXChNDQVBBQklMSVRZX0VYVEVSTkFMEAISGwoXQ0FQQUJJTElUWV9DT05GSUdVUkFUT1IQAxIWChJDQVBBQklMSVRZX0JST1dTRVIQBGIGcHJvdG8z\", [file_buf_validate_validate]);\n\n/**\n * Vertex represents a graph vertex that defines a plugin.\n * Note: Be aware of potential security implications when dealing with\n * user-provided data, such as file paths, and ensure proper input validation\n * and sanitization.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Vertex\n */\nexport type Vertex = Message<\"mochabugapis.adapt.plugins.v1.Vertex\"> & {\n /**\n * 'name' represents the vertex name.\n *\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * 'label' is a human-friendly label displayed in the UI.\n *\n * @generated from field: string label = 2;\n */\n label: string;\n\n /**\n * 'description' is a human-friendly short description of the vertex displayed\n * in UI.\n *\n * @generated from field: optional string description = 3;\n */\n description?: string;\n\n /**\n * 'logo' is the file path to the vertex logo, which will be resized to a\n * maximum of 40x40 pixels. Ensure that the logo files are from trusted\n * sources to avoid security risks.\n * - Supported file formats:\n * - GIF: .gif\n * - JPEG: .jpg, .jpeg, .jfif, .pjpeg, .pjp\n * - PNG: .png\n * - SVG: .svg\n * - WEBP: .webp\n * - AVIF: .avif\n *\n * @generated from field: optional string logo = 4;\n */\n logo?: string;\n\n /**\n * 'capabilities' specifies the capabilities of the vertex\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.Capability capabilities = 5;\n */\n capabilities: Capability[];\n\n /**\n * 'config' is an field that contains a Unix file path.\n * This can be any type of file, this is only intepreted for the vertex itself\n * Restrictions:\n *\n *\n * @generated from field: optional string config = 6;\n */\n config?: string;\n\n /**\n * 'metadata' is an field that contains a Unix file path.\n * This determines which receivers, transmitters etc... the vertex has to begin with\n * Restrictions:\n *\n *\n * @generated from field: string metadata = 7;\n */\n metadata: string;\n\n /**\n * 'user_services' are vertex-level services configured per vertex instance.\n *\n * This is a string array where each string directly references a ServiceDefinition by its name\n * from Manifest.service_definitions. These services are configured by end users for each\n * specific vertex instance in their workflow.\n *\n * The `optional` field in the ServiceDefinition controls whether configuration is required:\n * - If ServiceDefinition.optional = false (default): User MUST configure this service\n * - If ServiceDefinition.optional = true: User MAY skip configuring this service\n *\n * Example:\n * service_definitions: [\n * { name: \"api_key\", variable: {...} },\n * { name: \"webhook_url\", variable: {...}, optional: true }\n * ]\n * user_services: [\"api_key\", \"webhook_url\"]\n *\n * @generated from field: repeated string user_services = 8;\n */\n userServices: string[];\n\n /**\n * 'deprecated' is a boolean that indicates if the vertex is deprecated\n * this means that it will be removed in the next major version\n * and should be migrated asap\n *\n * @generated from field: optional bool deprecated = 9;\n */\n deprecated?: boolean;\n};\n\n/**\n * Vertex represents a graph vertex that defines a plugin.\n * Note: Be aware of potential security implications when dealing with\n * user-provided data, such as file paths, and ensure proper input validation\n * and sanitization.\n *\n * @generated from message mochabugapis.adapt.plugins.v1.Vertex\n */\nexport type VertexJson = {\n /**\n * 'name' represents the vertex name.\n *\n * @generated from field: string name = 1;\n */\n name?: string;\n\n /**\n * 'label' is a human-friendly label displayed in the UI.\n *\n * @generated from field: string label = 2;\n */\n label?: string;\n\n /**\n * 'description' is a human-friendly short description of the vertex displayed\n * in UI.\n *\n * @generated from field: optional string description = 3;\n */\n description?: string;\n\n /**\n * 'logo' is the file path to the vertex logo, which will be resized to a\n * maximum of 40x40 pixels. Ensure that the logo files are from trusted\n * sources to avoid security risks.\n * - Supported file formats:\n * - GIF: .gif\n * - JPEG: .jpg, .jpeg, .jfif, .pjpeg, .pjp\n * - PNG: .png\n * - SVG: .svg\n * - WEBP: .webp\n * - AVIF: .avif\n *\n * @generated from field: optional string logo = 4;\n */\n logo?: string;\n\n /**\n * 'capabilities' specifies the capabilities of the vertex\n *\n * @generated from field: repeated mochabugapis.adapt.plugins.v1.Capability capabilities = 5;\n */\n capabilities?: CapabilityJson[];\n\n /**\n * 'config' is an field that contains a Unix file path.\n * This can be any type of file, this is only intepreted for the vertex itself\n * Restrictions:\n *\n *\n * @generated from field: optional string config = 6;\n */\n config?: string;\n\n /**\n * 'metadata' is an field that contains a Unix file path.\n * This determines which receivers, transmitters etc... the vertex has to begin with\n * Restrictions:\n *\n *\n * @generated from field: string metadata = 7;\n */\n metadata?: string;\n\n /**\n * 'user_services' are vertex-level services configured per vertex instance.\n *\n * This is a string array where each string directly references a ServiceDefinition by its name\n * from Manifest.service_definitions. These services are configured by end users for each\n * specific vertex instance in their workflow.\n *\n * The `optional` field in the ServiceDefinition controls whether configuration is required:\n * - If ServiceDefinition.optional = false (default): User MUST configure this service\n * - If ServiceDefinition.optional = true: User MAY skip configuring this service\n *\n * Example:\n * service_definitions: [\n * { name: \"api_key\", variable: {...} },\n * { name: \"webhook_url\", variable: {...}, optional: true }\n * ]\n * user_services: [\"api_key\", \"webhook_url\"]\n *\n * @generated from field: repeated string user_services = 8;\n */\n userServices?: string[];\n\n /**\n * 'deprecated' is a boolean that indicates if the vertex is deprecated\n * this means that it will be removed in the next major version\n * and should be migrated asap\n *\n * @generated from field: optional bool deprecated = 9;\n */\n deprecated?: boolean;\n};\n\n/**\n * Describes the message mochabugapis.adapt.plugins.v1.Vertex.\n * Use `create(VertexSchema)` to create a new message.\n */\nexport const VertexSchema: GenMessage<Vertex, {jsonType: VertexJson}> = /*@__PURE__*/\n messageDesc(file_mochabugapis_adapt_plugins_v1_vertex, 0);\n\n/**\n * The capabilities of a vertex defines how the vertex is interracted with\n * If the vertex has the cron capabilitiy, then a cron-scheduler will call the\n * cron endpoint periodically until the vertex has finished or stopped\n * If the vertex has external browser capabiltity, there will be an external endpoint\n * where a third-party can communicate with the vertex\n * If the vertex has a configurator, then the vertex will be able to be configured dynamically\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Capability\n */\nexport enum Capability {\n /**\n * Unspecified capability (default value, should not be used).\n *\n * @generated from enum value: CAPABILITY_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * Cron capability, indicating that the vertex can be triggered at specific\n * intervals.\n *\n * @generated from enum value: CAPABILITY_CRON = 1;\n */\n CRON = 1,\n\n /**\n * The external capability, indicating that the vertex can be accessed via a\n * publicly routable address.\n *\n * @generated from enum value: CAPABILITY_EXTERNAL = 2;\n */\n EXTERNAL = 2,\n\n /**\n * Configurator capability, indicating that the vertex can be configured\n * dynamically by a vertex-defined interface.\n *\n * @generated from enum value: CAPABILITY_CONFIGURATOR = 3;\n */\n CONFIGURATOR = 3,\n\n /**\n * Browser capability, indicating that the vertex can be accessed via a\n * browser context.\n *\n * @generated from enum value: CAPABILITY_BROWSER = 4;\n */\n BROWSER = 4,\n}\n\n/**\n * The capabilities of a vertex defines how the vertex is interracted with\n * If the vertex has the cron capabilitiy, then a cron-scheduler will call the\n * cron endpoint periodically until the vertex has finished or stopped\n * If the vertex has external browser capabiltity, there will be an external endpoint\n * where a third-party can communicate with the vertex\n * If the vertex has a configurator, then the vertex will be able to be configured dynamically\n *\n * @generated from enum mochabugapis.adapt.plugins.v1.Capability\n */\nexport type CapabilityJson = \"CAPABILITY_UNSPECIFIED\" | \"CAPABILITY_CRON\" | \"CAPABILITY_EXTERNAL\" | \"CAPABILITY_CONFIGURATOR\" | \"CAPABILITY_BROWSER\";\n\n/**\n * Describes the enum mochabugapis.adapt.plugins.v1.Capability.\n */\nexport const CapabilitySchema: GenEnum<Capability, CapabilityJson> = /*@__PURE__*/\n enumDesc(file_mochabugapis_adapt_plugins_v1_vertex, 0);\n\n"],
5
+ "mappings": ";AAAA,SAAS,QAAQ,UAAU,gBAAgB,cAAc;AACzD,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC;AAAA,EAEE;AAAA,OACK;AACP,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,SAAuB,SAAS,SAAS,eAAe;AACxD,SAAS,QAAQ,YAAY;AAC7B,OAAOA,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,SAAS;;;ACZhB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;;;ACH9B,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AACjB,OAAO,QAAQ;;;ACKR,SAAS,mBAAmB,UAA0C;AAC3E,QAAM,UAAU,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,GAAG,WAAW;AAAA,IAC1E,aAAa;AAAA,IACb,aAAa,KAAK,KAAK;AAAA;AAAA,IACvB;AAAA,EACF,EAAE;AAGF,QAAM,mBAAmB,QACtB;AAAA,IACC,CAAC,EAAE,aAAa,WAAW,MACzB,UAAU,WAAW,UAAU,UAAU;AAAA,EAC7C,EACC,KAAK,IAAI;AAIZ,QAAM,iBAAiB,QACpB,IAAI,CAAC,EAAE,aAAa,YAAY,MAAM,IAAI,WAAW,MAAM,WAAW,EAAE,EACxE,KAAK,IAAI;AAIZ,QAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BjC,SAAO;AAAA,IACL,gBAAgB;AAAA;AAAA,IAEhB,yBAAyB,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,mDAIgB,cAAc;AAAA;AAAA;AAAA;AAIjE;;;AD5DO,SAAS,qBACd,YACA,WACQ;AACR,QAAM,SAAS,IAAI,OAAO,IAAI,UAAU,EAAE;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAMC,QAAO;AACX,MAAAA,OAAM,UAAU,EAAE,QAAQ,OAAO,GAAG,CAAC,SAAS;AAC5C,eAAO,EAAE,MAAM,KAAK,MAAM,WAAW,UAAU;AAAA,MACjD,CAAC;AAGD,MAAAA,OAAM,OAAO,EAAE,QAAQ,QAAQ,WAAW,UAAU,GAAG,MAAM;AAC3D,cAAM,WAAW,mBAAmB,SAAS;AAC7C,eAAO,EAAE,UAAU,QAAQ,MAAM,YAAY,QAAQ,IAAI,EAAE;AAAA,MAC7D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,UAAU,KAAK,QAAQA,SAAQ,QAAQ,mBAAmB,CAAC;AAC1D,SAAS,iBAAiB,OAAuC;AACtE,QAAM,eAAe,OAAO,QAAQ,KAAK,EAAE;AAAA,IACzC,CAAC,CAAC,EAAE,KAAK,MACP,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW,0BAA0B;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAMD,QAAO;AACX,iBAAW,CAAC,UAAU,UAAU,KAAK,cAAc;AACjD,QAAAA,OAAM,UAAU,EAAE,QAAQ,IAAI,OAAO,IAAI,QAAQ,GAAG,EAAE,GAAG,MAAM;AAC7D,gBAAM,WAAWC,SAAQ,QAAQ,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AACjE,iBAAO,EAAE,MAAM,SAAS;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,mBAAmB,SAAoC;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAMD,QAAO;AACX,YAAM,YAAY,oBAAI,IAAoB;AAC1C,YAAMC,WAAU,cAAc,YAAY,GAAG;AAE7C,MAAAD,OAAM,UAAU,EAAE,QAAQ,kBAAkB,GAAG,CAAC,SAAS;AACvD,YAAI;AACF,cAAI;AAEJ,cAAI,KAAK,KAAK,WAAW,GAAG,GAAG;AAC7B,2BAAe,KAAK,QAAQ,KAAK,YAAY,KAAK,IAAI;AAAA,UACxD,OAAO;AACL,2BAAeC,SAAQ,QAAQ,KAAK,MAAM;AAAA,cACxC,OAAO,CAAC,KAAK,UAAU;AAAA,YACzB,CAAC;AAAA,UACH;AAGA,cAAI,CAAC,aAAa,SAAS,OAAO,GAAG;AACnC,mBAAO;AAAA,UACT;AAEA,cAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,kBAAM,IAAI,MAAM,wBAAwB,YAAY,EAAE;AAAA,UACxD;AAEA,gBAAM,eAAe,KAAK,SAAS,YAAY;AAC/C,oBAAU,IAAI,cAAc,YAAY;AAExC,kBAAQ,IAAI,eAAe,KAAK,IAAI,OAAO,YAAY,EAAE;AAEzD,iBAAO;AAAA,YACL,MAAM,KAAK,YAAY;AAAA,YACvB,UAAU;AAAA,UACZ;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,2BAA2B,KAAK,IAAI,IAAI,KAAK;AAC3D,gBAAM;AAAA,QACR;AAAA,MACF,CAAC;AAED,MAAAD,OAAM,MAAM,MAAM;AAChB,kBAAU,QAAQ,CAAC,YAAY,aAAa;AAC1C,gBAAM,WAAW,KAAK,KAAK,QAAQ,QAAQ,QAAQ;AACnD,gBAAM,WAAW,GAAG,aAAa,UAAU;AAG3C,cAAI,SAAS,SAAS,GAAG;AACvB,kBAAM,IAAI;AAAA,cACR,GAAG,QAAQ,0CAA0C,SAAS,MAAM;AAAA,YACtE;AAAA,UACF;AAEA,gBAAM,YAAY,OAAO,KAAK,CAAC,GAAM,IAAM,KAAM,GAAI,CAAC;AACtD,cAAI,CAAC,SAAS,SAAS,GAAG,CAAC,EAAE,OAAO,SAAS,GAAG;AAC9C,kBAAM,cAAc,SAAS,SAAS,GAAG,CAAC,EAAE,SAAS,KAAK;AAC1D,kBAAM,IAAI;AAAA,cACR,GAAG,QAAQ,uCAAuC,WAAW;AAAA,YAC/D;AAAA,UACF;AAEA,aAAG,cAAc,UAAU,QAAQ;AACnC,kBAAQ;AAAA,YACN,gBAAgB,QAAQ,MAAM,SAAS,SAAS,MAAM;AAAA,cACpD;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AD1HA,SAAS,2BAA2B;AAE7B,IAAM,eAAe,KAAK;AAAA,EAC/BE,IAAG,aAAa,gBAAgB,OAAO;AACzC;AACO,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAC1B,IAAM,eAAe;AACrB,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAC1B,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB,CAAC,OAAO,MAAM,MAAM,KAAK;AAGxD,IAAM,gBAA8B;AAAA,EAClC,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAGO,IAAM,0BAAwC;AAAA,EACnD,GAAG;AAAA,EACH,QAAQC,MAAK,KAAK,aAAa,SAAS;AAAA,EACxC,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,IACN,GAAG,cAAc;AAAA,IACjB,SAAS;AAAA,EACX;AACF;AAGO,IAAM,sBAAoC;AAAA,EAC/C,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,KAAK;AAAA,EACrC,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,cAAc;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,GAAG,cAAc;AAAA,IACjB,SAAS;AAAA,EACX;AACF;AAEA,IAAM,EAAE,KAAK,UAAU,IAAI,UAAU;AAAA,EACnC,YAAY;AAAA,EACZ,SAAS;AAAA,IACP,oBAAoB;AAAA,MAClB,mBAAmB;AAAA,MACnB,oBAAoB,CAAC,eAAe;AAAA,IACtC,CAAC;AAAA,EACH;AACF,CAAC;AAGD,IAAM,sBAAoC;AAAA,EACxC,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU,CAAC,GAAG,UAAU,QAAQ;AAAA,EAChC,SAAS,CAAC,iBAAiB,UAAU,KAAK,CAAC;AAAA,EAC3C,OAAO,UAAU;AACnB;AAGO,IAAM,sCAAoD;AAAA,EAC/D,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,WAAW;AAAA,EAC3C,QAAQ;AAAA,EACR,QAAQ;AAAA,IACNA,MAAK;AAAA,MACHA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,CAAC,UAAU,MAAM;AAC/B;AAGO,IAAM,sCAAoD;AAAA,EAC/D,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,WAAW;AAAA,EAC3C,QAAQ;AAAA,EACR,QAAQ;AAAA,IACNA,MAAK;AAAA,MACHA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,CAAC,QAAQ,QAAQ;AAAA,EAC7B,cAAc;AAAA,IACZ,OAAO;AAAA,EACT;AACF;AAGO,IAAM,0CAAwD;AAAA,EACnE,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,eAAe;AAAA,EAC/C,QAAQ;AAAA,EACR,QAAQ;AAAA,IACNA,MAAK;AAAA,MACHA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,CAAC,UAAU,MAAM;AAC/B;AAGO,IAAM,0CAAwD;AAAA,EACnE,GAAG;AAAA,EACH,QAAQA,MAAK,KAAK,cAAc,eAAe;AAAA,EAC/C,QAAQ;AAAA,EACR,QAAQ;AAAA,IACNA,MAAK;AAAA,MACHA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY,CAAC,QAAQ,QAAQ;AAAA,EAC7B,cAAc;AAAA,IACZ,OAAO;AAAA,EACT;AACF;;;AGnKA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAWV,SAAS,sBAAsB,OAKlC;AACF,QAAM,SAKA,CAAC;AACP,aAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC7C,QAAI;AACJ,eAAW,OAAO,iBAAiB;AACjC,YAAM,WAAWC,MAAK,KAAK,GAAG,MAAM,GAAG,iBAAiB,IAAI,GAAG,EAAE;AACjE,UAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AACA,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AACA,UAAM,OAAOD,MAAK,KAAK,GAAG,MAAM,iBAAiB;AACjD,QAAI,CAACC,IAAG,WAAW,IAAI,GAAG;AACxB,YAAM,IAAI;AAAA,QACR,OAAO,OAAO,2CAA2C,iBAAiB;AAAA,MAC5E;AAAA,IACF;AAEA,QAAI,MAAM;AACV,eAAW,OAAO,iBAAiB;AACjC,YAAM,WAAWD,MAAK,KAAK,GAAG,MAAM,GAAG,gBAAgB,IAAI,GAAG,EAAE;AAChE,UAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,cAAM;AACN;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,QAAW;AACrB,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,OAKnC;AACF,QAAM,SAKA,CAAC;AACP,aAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC7C,QAAI;AACJ,eAAW,OAAO,iBAAiB;AACjC,YAAM,WAAWD,MAAK,KAAK,GAAG,MAAM,GAAG,aAAa,IAAI,GAAG,EAAE;AAC7D,UAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AACA,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AACA,UAAM,OAAOD,MAAK,KAAK,GAAG,MAAM,aAAa;AAC7C,QAAI,CAACC,IAAG,WAAW,IAAI,GAAG;AACxB,YAAM,IAAI;AAAA,QACR,OAAO,OAAO,2CAA2C,aAAa;AAAA,MACxE;AAAA,IACF;AAEA,QAAI,MAAM;AACV,eAAW,OAAO,iBAAiB;AACjC,YAAM,WAAWD,MAAK,KAAK,GAAG,MAAM,GAAG,YAAY,IAAI,GAAG,EAAE;AAC5D,UAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,cAAM;AACN;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,QAAW;AACrB,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AC1GA,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;;;ACAtC,SAAS,UAAU,SAAS,UAAU,mBAAmB;AAEzD,SAAS,iCAAiC,+BAA+B,sCAAsC;AAMxG,IAAM,6BACX,yBAAS,orqEAAorqE,CAAC,iCAAiC,+BAA+B,8BAA8B,CAAC;;;ADN/xqE,SAAS,mCAAmC;AAMrC,IAAM,2CACX,gBAAAC,UAAS,g3JAAg3J,CAAC,4BAA4B,2BAA2B,CAAC;AAkZ76J,IAAM,kBACX,gBAAAC,aAAY,0CAA0C,CAAC;;;AE7ZzD,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;AAO/B,IAAM,0CACX,gBAAAC,UAAS,2RAA2R,CAAC,0BAA0B,CAAC;AA8D3T,IAAM,aACX,gBAAAC,aAAY,yCAAyC,CAAC;;;ACvExD,SAAS,YAAAC,YAAU,eAAAC,qBAAmB;;;ACAtC,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;;;ACAtC,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;AAO/B,IAAM,uDACX,gBAAAC,UAAS,gtBAAgtB,CAAC,0BAA0B,CAAC;;;ACRvvB,SAAS,YAAAC,WAAU,YAAAC,WAAU,eAAAC,oBAAmB;AASzC,IAAM,wDACX,gBAAAC,UAAS,4sFAA4sF,CAAC,4BAA4B,uCAAuC,CAAC;;;ACV5xF,SAAS,YAAAC,WAAU,YAAAC,WAAU,eAAAC,oBAAmB;AASzC,IAAM,oDACX,gBAAAC,UAAS,8kJAA8kJ,CAAC,4BAA4B,uCAAuC,CAAC;;;ACV9pJ,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;AAGtC,SAAS,+BAAAC,oCAAmC;AAQrC,IAAM,sDACX,gBAAAC,UAAS,uVAAuV,CAAC,4BAA4BC,8BAA6B,wCAAwC,CAAC;;;AJG9b,IAAM,wDACX,gBAAAC,UAAS,g2BAAg2B,CAAC,4BAA4B,sDAAsD,uDAAuD,mDAAmD,mDAAmD,CAAC;;;AKhB5lC,SAAS,YAAAC,WAAU,YAAAC,WAAU,eAAAC,oBAAmB;AAOzC,IAAM,4CACX,gBAAAC,UAAS,w/BAAw/B,CAAC,0BAA0B,CAAC;AA0NxhC,IAAM,eACX,gBAAAC,aAAY,2CAA2C,CAAC;;;ANxNnD,IAAM,8CACX,gBAAAC,WAAS,g5DAAg5D,CAAC,4BAA4B,uDAAuD,yCAAyC,CAAC;AAoZlhE,IAAM,iBACX,gBAAAC,cAAY,6CAA6C,CAAC;;;ARnW5D,IAAM,MAAM,IAAI,IAAI;AACpB,IAAM,YAAY,gBAAgB;AAElC,eAAsB,MAAM,MAAmC;AAC7D,UAAQ,IAAI,MAAM,KAAK,KAAK,sQAA+C,CAAC;AAC5E,UAAQ,IAAI,MAAM,KAAK,KAAK,6DAA4C,CAAC;AACzE,UAAQ,IAAI,MAAM,KAAK,KAAK,sQAA+C,CAAC;AAG5E,QAAM,kBAAkB,IAAI;AAAA,IAC1B,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,WAAW;AAAA,IACf;AAAA,IACAC,IAAG,aAAa,eAAe,MAAM;AAAA,EACvC;AAEA,kBAAgB;AAAA,IACd,aAAa,MAAM;AAAA,MACjB,GAAG,SAAS,YAAY,IAAI,SAAS,IAAI;AAAA,IAC3C,CAAC,IAAI,MAAM,IAAI,IAAI,SAAS,OAAO,EAAE,CAAC;AAAA,EACxC;AAEA,QAAM,UAAU,GAAG,MAAM,WAAW,eAAe,IACjD,SAAS,YACX,IAAI,SAAS,IAAI,IAAI,SAAS,OAAO;AACrC,UAAQ,IAAI,MAAM,IAAI,SAAI,IAAI,MAAM,KAAK,QAAQ,OAAO;AAAA,CAAI,CAAC;AAE7D,QAAM,WAAW,iBAAiB,SAAS,IAAI;AAG/C,QAAM,gBAAgB,IAAI;AAAA,IACxB,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,aAAqC,CAAC;AAC5C,WAAS,WAAW,KAAKC,MAAK,KAAK,SAAS,KAAK,gBAAgB,CAAC,EAAE;AAAA,IAClE,CAAC,SAAS;AACR,YAAM,MAAM,eAAe,cAAcD,IAAG,aAAa,MAAM,MAAM,CAAC;AACtE,iBAAW,IAAI,IAAI,IAAIC,MAAK,QAAQ,IAAI;AACxC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,WAAW,GAAG;AAClC,kBAAc,KAAK,mBAAmB;AACtC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,aAAW,OAAO,SAAS,oBAAoB;AAC7C,UAAM,8BAA8B,KAAK,GAAG;AAAA,EAC9C;AAEA,gBAAc;AAAA,IACZ,SAAS,MAAM,KAAK,SAAS,SAAS,MAAM,CAAC,IAC3C,SAAS,SAAS,WAAW,IAAI,WAAW,UAC9C,KAAK,SAAS,SAAS,IAAI,CAAC,MAAM,MAAM,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EAClE;AACA,UAAQ,IAAI,EAAE;AAEd,QAAM,SAAS,UAAU,SAAS,gBAAgB,QAAQ;AAC1D,MAAI,OAAO,SAAS,SAAS;AAC3B,YAAQ,MAAM,MAAM,KAAK,IAAI,sCAAiC,CAAC;AAC/D,YAAQ,MAAM,OAAO,KAAK;AAC1B,YAAQ,MAAM,OAAO,UAAU;AAC/B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,UAAU,YAAY,QAAQ;AACjD,QAAM,YAAY,UAAU,YAAY,QAAQ;AAEhD,UAAQ,IAAI,MAAM,KAAK,MAAM,0CAAqC,CAAC;AACrE;AAYA,eAAsB,IAAI,MAAmB;AAC3C,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,MAAM,MAAM,OAAO;AAEzB,UAAQ,IAAI,MAAM,KAAK,KAAK,sQAA+C,CAAC;AAC5E,UAAQ,IAAI,MAAM,KAAK,KAAK,8DAA6C,CAAC;AAC1E,UAAQ,IAAI,MAAM,KAAK,KAAK,sQAA+C,CAAC;AAG5E,QAAM,WAAW;AAAA,IACf;AAAA,IACAD,IAAG,aAAa,eAAe,MAAM;AAAA,EACvC;AACA,UAAQ;AAAA,IACN,MAAM,IAAI,SAAI,IACZ,WAAW,MAAM;AAAA,MACf,GAAG,SAAS,YAAY,IAAI,SAAS,IAAI;AAAA,IAC3C,CAAC,IAAI,MAAM,IAAI,IAAI,SAAS,OAAO,EAAE,CAAC;AAAA,EAC1C;AAGA,QAAM,aAAqC,CAAC;AAC5C,WAAS,WAAW,KAAKC,MAAK,KAAK,KAAK,gBAAgB,CAAC,EAAE,IAAI,CAAC,SAAS;AACvE,UAAM,MAAM,eAAe,cAAcD,IAAG,aAAa,MAAM,MAAM,CAAC;AACtE,eAAW,IAAI,IAAI,IAAIC,MAAK,QAAQ,IAAI;AACxC,WAAO;AAAA,EACT,CAAC;AAED,MAAI,SAAS,SAAS,WAAW,GAAG;AAClC,YAAQ,IAAI,MAAM,OAAO,iDAA4C,CAAC;AACtE;AAAA,EACF;AAGA,QAAM,QAAQ,CAAC,MACbD,IAAG,WAAWC,MAAK,KAAK,WAAW,EAAE,IAAI,GAAI,IAAI,CAAC;AACpD,QAAM,iBAAiB,SAAS,SAAS;AAAA,IACvC,CAAC,MACC,QAAQ,EAAE,aAAa,KAAK,CAAC,MAAM,0BAA6B,CAAC,KACjE,MAAM,CAAC;AAAA,EACX;AACA,QAAM,kBAAkB,SAAS,SAAS;AAAA,IACxC,CAAC,MACC,QAAQ,EAAE,aAAa,KAAK,CAAC,MAAM,qBAAwB,CAAC,KAAK,MAAM,CAAC;AAAA,EAC5E;AAEA,QAAM,UAAU,eAAe,SAAS,gBAAgB;AACxD,MAAI,YAAY,GAAG;AACjB,YAAQ;AAAA,MACN,MAAM,OAAO,sDAAiD;AAAA,IAChE;AACA;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,MAAM,IAAI,SAAI,IACZ,SAAS,MAAM,KAAK,OAAO,CAAC,gBAAgB,YAAY,IAAI,KAAK,GAAG;AAAA;AAAA,EACxE;AAEA,QAAM,UAAU,OAAO;AAAA,IACrB,eAAe,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,WAAW,EAAE,IAAI,CAAE,CAAC;AAAA,EACzD;AACA,QAAM,WAAW,OAAO;AAAA,IACtB,gBAAgB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,WAAW,EAAE,IAAI,CAAE,CAAC;AAAA,EAC1D;AAEA,QAAM,oBAAoB,sBAAsB,OAAO;AACvD,QAAM,qBAAqB,uBAAuB,QAAQ;AAG1D,QAAM,gBAAqE,CAAC;AAC5E,QAAM,iBAAiB,CAAC,GAAG,mBAAmB,GAAG,kBAAkB,EAChE,OAAO,CAAC,OAAO,GAAG,QAAQ,MAAS,EACnC,IAAI,CAAC,OAAO;AACX,kBAAc,GAAG,GAAI,IAAI;AAAA,MACvB,QAAQ,GAAG;AAAA,MACX,QAAQ,kBAAkB,SAAS,EAAE;AAAA,IACvC;AACA,WAAO,GAAG;AAAA,EACZ,CAAC;AAEH,QAAM,cAAsC,CAAC;AAC7C,QAAM,gBAAwC,CAAC;AAE/C,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,aAAa,IAAI;AAAA,MACrB,MAAM;AAAA,MACN,YAAY,MAAM,IAAI,QAAG;AAAA,IAC3B,CAAC,EAAE,MAAM;AAET,UAAM,YAAYA,MAAK,KAAK,QAAQ,SAAS;AAC7C,sBAAkB,SAAS;AAE3B,QAAI;AACF,YAAM,YAAY,MAAM,QAAQ;AAAA,QAC9B,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,aAAa;AAAA,MACf,CAAC;AAED,iBAAW,CAAC,YAAY,UAAU,KAAK,OAAO;AAAA,QAC5C,UAAU,SAAU;AAAA,MACtB,GAAG;AACD,YAAI,CAAC,WAAW,WAAY;AAC5B,cAAM,UAAU,cAAc,WAAW,UAAU;AACnD,YAAI,CAAC,QAAS;AAEd,cAAM,EAAE,SAAS,OAAO,IAAI,MAAM,OAChC,UAAUA,MAAK,QAAQ,UAAU,CAAC;AAEpC,YAAI,QAAQ,QAAQ;AAClB,wBAAc,QAAQ,MAAM,IAAI,OAAO,QAAQ;AAAA,QACjD,OAAO;AACL,sBAAY,QAAQ,MAAM,IAAI,OAAO,QAAQ;AAAA,QAC/C;AAAA,MACF;AACA,iBAAW,QAAQ,eAAe;AAAA,IACpC,SAAS,KAAK;AACZ,iBAAW,KAAK,+CAA+C;AAAA,IACjE;AAAA,EACF;AAGA,QAAM,SAASA,MAAK,KAAK,aAAa,SAAS;AAC/C,oBAAkB,MAAM;AAExB,QAAM,aAAa,oBAAoB,IAAI;AAE3C,QAAM,YAAqC;AAAA,IACzC,GAAG,mBAAmB,IAA2B,CAAC,OAAO;AAAA,MACvD,aAAa,CAAC,EAAE,OAAO;AAAA,MACvB,UAAUA,MAAK,KAAK,EAAE,MAAM,aAAa;AAAA,MACzC,cAAcD,IAAG,aAAa,EAAE,MAAM,MAAM;AAAA,MAC5C,eAAe;AAAA,MACf,QAAQ;AAAA,QACN,GAAI,YAAY,EAAE,IAAI,IAAI,EAAE,SAAS,YAAY,EAAE,IAAI,EAAG,IAAI,CAAC;AAAA,QAC/D,SAAS;AAAA,MACX;AAAA,IACF,EAAE;AAAA,IACF,GAAG,kBAAkB,IAA2B,CAAC,OAAO;AAAA,MACtD,aAAa,CAAC,EAAE,OAAO;AAAA,MACvB,UAAUC,MAAK,KAAK,EAAE,MAAM,iBAAiB;AAAA,MAC7C,cAAcD,IAAG,aAAa,EAAE,MAAM,MAAM;AAAA,MAC5C,eAAe;AAAA,MACf,QAAQ;AAAA,QACN,GAAI,cAAc,EAAE,IAAI,IAAI,EAAE,SAAS,cAAc,EAAE,IAAI,EAAG,IAAI,CAAC;AAAA,QACnE,SAAS;AAAA,MACX;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,eAAe,IAAI;AAAA,IACvB,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,MAAM,MAAM,QAAQ;AAAA,IACxB,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,MACX,GAAG,kBAAkB,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,MACzC,GAAG,mBAAmB,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,IAC5C;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,wBAAwB;AAAA,MAC3B,GAAG,MAAM,SAAS,OAAO;AAAA,IAC3B;AAAA,IACA,QAAQ;AAAA,MACN,IAAI;AAAA,IACN;AAAA,IACA,SAAS,CAAC,WAAW,EAAE,OAAO,UAAU,CAAC,CAAC;AAAA,EAC5C,CAAC;AAED,QAAM,IAAI,MAAM;AAChB,QAAM,EAAE,MAAM,UAAU,IAAI,MAAM,IAAI,MAAM;AAAA,IAC1C,UAAU;AAAA,IACV;AAAA,EACF,CAAC;AAED,eAAa,QAAQ,oBAAoB;AAEzC,UAAQ,IAAI,MAAM,KAAK,MAAM,gCAA2B,CAAC;AACzD,UAAQ;AAAA,IACN,MAAM,IAAI,SAAI,IAAI,WAAW,MAAM,KAAK,oBAAoB,SAAS,GAAG,CAAC;AAAA,EAC3E;AACA,UAAQ,IAAI,MAAM,IAAI,QAAG,CAAC;AAC1B,UAAQ,IAAI,MAAM,IAAI,SAAI,IAAI,MAAM,KAAK,kBAAkB,CAAC;AAC5D,aAAW,KAAK,oBAAoB;AAClC,YAAQ;AAAA,MACN,MAAM,IAAI,WAAM,IACd,GAAG,MAAM,KAAK,EAAE,IAAI,CAAC,sBAAsB,SAAS,IAClD,EAAE,IACJ,IAAI,aAAa;AAAA,IACrB;AAAA,EACF;AACA,aAAW,KAAK,mBAAmB;AACjC,YAAQ;AAAA,MACN,MAAM,IAAI,WAAM,IACd,GAAG,MAAM,QAAQ,EAAE,IAAI,CAAC,+BAA+B,SAAS,IAC9D,EAAE,IACJ,IAAI,iBAAiB;AAAA,IACzB;AAAA,EACF;AACA,UAAQ,IAAI,MAAM,IAAI,QAAG,CAAC;AAC1B,UAAQ,IAAI,MAAM,IAAI,SAAI,IAAI,MAAM,KAAK,wBAAwB,CAAC;AACpE;AAGA,eAAsB,8BACpB,UACA,KACA;AACA,UAAQ,IAAI,KAAK,MAAM;AAAA,IACrB,KAAK,YAAY;AAEf,UAAI;AACF,cAAM,SAAS,OAAO,iBAAiB,IAAI,KAAK,MAAM,MAAO;AAC7D,cAAM,IAAI,eAAe,QAAQ,IAAI;AACrC,YAAI,IAAI,KAAK,MAAM,SAAS;AAC1B,cAAI,eAAe,OAAO,aAAa,IAAI,KAAK,MAAM,OAAO;AAI7D,cACE,OAAO,iBAAiB,YACxB,aAAa,SAAS,OAAO,GAC7B;AACA,kBAAM,WAAWC,MAAK,KAAK,UAAU,YAAY;AACjD,gBAAID,IAAG,WAAW,QAAQ,GAAG;AAC3B,oBAAM,cAAcA,IAAG,aAAa,UAAU,OAAO;AACrD,6BAAe,KAAK,MAAM,WAAW;AACrC,kBAAI,KAAK,MAAM,UAAU,SAAS,aAAa,YAAY;AAAA,YAC7D,OAAO;AACL,oBAAM,IAAI,MAAM,mCAAmC,QAAQ,EAAE;AAAA,YAC/D;AAAA,UACF;AAEA,cAAI,CAAC,IAAI,SAAS,QAAQ,YAAY,GAAG;AACvC,kBAAM,IAAI;AAAA,cACR,+BAA+B,IAAI,WAAW,IAAI,MAAM,CAAC;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAY;AACnB,cAAM,IAAI;AAAA,UACR,6CAA6C,IAAI,IAAI,MAAM,MAAM,OAAO;AAAA,QAC1E;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,UAAI;AACF,YAAI,IAAI,KAAK,MAAM,KAAK,UAAU;AAChC,gBAAM,eAAeC,MAAK;AAAA,YACxB;AAAA,YACA,IAAI,KAAK,MAAM,IAAI,SAAS;AAAA,UAC9B;AACA,cAAID,IAAG,WAAW,YAAY,GAAG;AAC/B,gBAAI,KAAK,MAAM,IAAI,WAAW,OAAO,YAAY;AAAA,cAC/C,MAAM,IAAI,KAAK,MAAM,IAAI,SAAS;AAAA,cAClC,MAAMA,IAAG,aAAa,YAAY;AAAA,YACpC,CAAC;AAAA,UACH,OAAO;AACL,kBAAM,IAAI,MAAM,+BAA+B,YAAY,EAAE;AAAA,UAC/D;AAAA,QACF;AAAA,MACF,SAAS,OAAY;AACnB,cAAM,IAAI;AAAA,UACR,6CAA6C,IAAI,IAAI,MAAM,MAAM,OAAO;AAAA,QAC1E;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,YACpB,UACA,aACA,MACA;AACA,UAAQ,IAAI,MAAM,KAAK,QAAQ,wBAAiB,CAAC;AACjD,UAAQ,IAAI,MAAM,IAAI,gQAA8C,CAAC;AAGrE,QAAM,cAAc,IAAI;AAAA,IACtB,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,cAAc,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AACzE,UAAM,MAAM,iBAAiB,YAAY,UAAU;AACnD,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,uDAAuD;AACzE,WAAO,CAAC,KAAK,GAAG;AAAA,EAClB,CAAC;AAED,MAAI,YAAY,WAAW,GAAG;AAC5B,gBAAY,KAAK,yBAAyB;AAC1C,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,OAAK,OAAO,SAAS,UAAU;AAAA,IAC7B,GAAI,KAAK,OAAO,SAAS,WAAW,CAAC;AAAA,IACrC;AAAA,MACE;AAAA,MACA,OAAO,YAAY,WAAW;AAAA,IAChC;AAAA,IACA,mBAAmB,EAAE,QAAQ,KAAK,OAAO,SAAS,OAAQ,CAAC;AAAA,EAC7D;AACA,OAAK,OAAO,SAAS,cAAc;AAAA,IACjC;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,IACP;AAAA,EACF;AAEA,cAAY,OAAO,YAAY,YAAY,MAAM,YAC/C,YAAY,WAAW,IAAI,KAAK,GAClC;AACA,QAAM,QAAQ,KAAK,OAAO,QAAQ;AAClC,cAAY;AAAA,IACV,mBAAmB,MAAM;AAAA,MACvB,IAAI,YAAY,MAAM,IAAI,YAAY,WAAW,IAAI,SAAS,OAAO;AAAA,IACvE,CAAC;AAAA,EACH;AAGA,QAAM,gBAAgB,IAAI;AAAA,IACxB,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,gBAAgB,SAAS,SAC5B;AAAA,IAAO,CAAC,MACP,QAAQ,EAAE,aAAa,KAAK,CAAC,MAAM,0BAA6B,CAAC;AAAA,EACnE,EACC,IAAI,CAAC,MAAM;AACV,UAAM,cAAc,YAAY,EAAE,IAAI;AACtC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,4BAA4B,EAAE,IAAI,EAAE;AAAA,IACtD;AACA,UAAM,MAAM,iBAAiB,aAAa,cAAc;AACxD,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,WAAO,CAAC,EAAE,MAAM,GAAG;AAAA,EACrB,CAAC;AAEH,OAAK,OAAO,aAAa,UAAU;AAAA,IACjC,GAAI,KAAK,OAAO,aAAa,WAAW,CAAC;AAAA,IACzC;AAAA,MACE;AAAA,MACA,OAAO,YAAY,aAAa;AAAA,IAClC;AAAA,IACA,mBAAmB,EAAE,QAAQ,KAAK,OAAO,aAAa,OAAQ,CAAC;AAAA,EACjE;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,SAAK,OAAO,aAAa,cAAc;AAAA,MACrC;AAAA,QACE,IAAI;AAAA,QACJ,KAAK;AAAA,MACP;AAAA,IACF;AACA,kBAAc,OAAO,YAAY,cAAc,MAAM,gBACnD,cAAc,WAAW,IAAI,KAAK,GACpC;AACA,UAAM,QAAQ,KAAK,OAAO,YAAY;AACtC,kBAAc;AAAA,MACZ,uBAAuB,MAAM;AAAA,QAC3B,IAAI,cAAc,MAAM,IACtB,cAAc,WAAW,IAAI,SAAS,OACxC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,kBAAc,KAAK,gCAAgC;AAAA,EACrD;AAEA,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAe,aACb,UACA,aACA,MACA;AACA,UAAQ,IAAI,MAAM,KAAK,KAAK,yBAAkB,CAAC;AAC/C,UAAQ,IAAI,MAAM,IAAI,gQAA8C,CAAC;AAErE,QAAM,mBAAmB,IAAI;AAAA,IAC3B,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,QAAM,QAAQ,CAAC,MACbA,IAAG,WAAWC,MAAK,KAAK,YAAY,EAAE,IAAI,GAAI,IAAI,CAAC;AACrD,QAAM,iBAAiB,SAAS,SAAS;AAAA,IACvC,CAAC,MACC,QAAQ,EAAE,aAAa,KAAK,CAAC,MAAM,0BAA6B,CAAC,KACjE,MAAM,CAAC;AAAA,EACX;AACA,QAAM,kBAAkB,SAAS,SAAS;AAAA,IACxC,CAAC,MACC,QAAQ,EAAE,aAAa,KAAK,CAAC,MAAM,qBAAwB,CAAC,KAAK,MAAM,CAAC;AAAA,EAC5E;AAEA,QAAM,UAAU,eAAe,SAAS,gBAAgB;AACxD,mBAAiB;AAAA,IACf,SAAS,MAAM,KAAK,OAAO,CAAC,gBAC1B,YAAY,IAAI,KAAK,GACvB,IAAI,MAAM;AAAA,MACR,IAAI,gBAAgB,MAAM,aAAa,eAAe,MAAM;AAAA,IAC9D,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,OAAO;AAAA,IACrB,eAAe,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,YAAY,EAAE,IAAI,CAAE,CAAC;AAAA,EAC1D;AACA,QAAM,WAAW,OAAO;AAAA,IACtB,gBAAgB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,YAAY,EAAE,IAAI,CAAE,CAAC;AAAA,EAC3D;AAEA,QAAM,oBAAoB,sBAAsB,OAAO;AACvD,QAAM,qBAAqB,uBAAuB,QAAQ;AAE1D,QAAM,gBAAqE,CAAC;AAC5E,OAAK,IAAI,cAAc,CAAC,GAAG,mBAAmB,GAAG,kBAAkB,EAChE,OAAO,CAAC,OAAO,GAAG,QAAQ,MAAS,EACnC,IAAI,CAAC,OAAO;AACX,kBAAc,GAAG,GAAI,IAAI;AAAA,MACvB,QAAQ,GAAG;AAAA,MACX,QAAQ,kBAAkB,SAAS,EAAE;AAAA,IACvC;AACA,WAAO,GAAG;AAAA,EACZ,CAAC;AAGH,QAAM,cAAsC,CAAC;AAC7C,QAAM,gBAAwC,CAAC;AAE/C,MAAI,KAAK,IAAI,YAAY,SAAS,GAAG;AACnC,UAAM,aAAa,IAAI;AAAA,MACrB,MAAM,mBAAmB,KAAK,IAAI,YAAY,MAAM,aAClD,KAAK,IAAI,YAAY,WAAW,IAAI,KAAK,GAC3C;AAAA,MACA,YAAY,MAAM,IAAI,QAAG;AAAA,IAC3B,CAAC,EAAE,MAAM;AAET,UAAM,YAAY,MAAM,QAAQ,KAAK,GAAG;AACxC,eAAW,CAAC,YAAY,UAAU,KAAK,OAAO;AAAA,MAC5C,UAAU,SAAU;AAAA,IACtB,GAAG;AACD,UAAI,CAAC,WAAW,WAAY;AAE5B,YAAM,WAAW,WAAW;AAC5B,YAAM,UAAU,cAAc,QAAQ;AACtC,UAAI,CAAC,QAAS;AAEd,YAAM,EAAE,SAAS,OAAO,IAAI,MAAM,OAChC,UAAUA,MAAK,QAAQ,UAAU,CAAC;AAEpC,UAAI,QAAQ,QAAQ;AAClB,sBAAc,QAAQ,MAAM,IAAI,OAAO,QAAQ;AAAA,MACjD,OAAO;AACL,oBAAY,QAAQ,MAAM,IAAI,OAAO,QAAQ;AAAA,MAC/C;AAAA,IACF;AACA,eAAW;AAAA,MACT,iBAAiB,MAAM;AAAA,QACrB,IAAI,KAAK,IAAI,YAAY,MAAM,IAC7B,KAAK,IAAI,YAAY,WAAW,IAAI,SAAS,OAC/C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,QAAI;AAAA,MACF,MAAM;AAAA,MACN,YAAY,MAAM,IAAI,QAAG;AAAA,IAC3B,CAAC,EAAE,KAAK;AAAA,EACV;AAGA,QAAM,gBAAgB,IAAI;AAAA,IACxB,MAAM;AAAA,IACN,YAAY,MAAM,IAAI,QAAG;AAAA,EAC3B,CAAC,EAAE,MAAM;AAET,OAAK,QAAQ,MAAM,cAAc;AAAA,IAC/B,GAAG,kBAAkB,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,IACzC,GAAG,mBAAmB,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,EAC5C;AAEA,QAAM,YAAqC;AAAA,IACzC,GAAG,mBAAmB,IAA2B,CAAC,OAAO;AAAA,MACvD,aAAa,CAAC,EAAE,OAAO;AAAA,MACvB,UAAUA,MAAK,KAAK,EAAE,MAAM,aAAa;AAAA,MACzC,cAAcD,IAAG,aAAa,EAAE,MAAM,MAAM;AAAA,MAC5C,eAAe;AAAA,MACf,QAAQ;AAAA,QACN,GAAI,YAAY,EAAE,IAAI,IAAI,EAAE,SAAS,YAAY,EAAE,IAAI,EAAG,IAAI,CAAC;AAAA,QAC/D,SAAS,KAAK,QAAQ,MAAM,cAAc;AAAA,MAC5C;AAAA,IACF,EAAE;AAAA,IACF,GAAG,kBAAkB,IAA2B,CAAC,OAAO;AAAA,MACtD,aAAa,CAAC,EAAE,OAAO;AAAA,MACvB,UAAUC,MAAK,KAAK,EAAE,MAAM,iBAAiB;AAAA,MAC7C,cAAcD,IAAG,aAAa,EAAE,MAAM,MAAM;AAAA,MAC5C,eAAe;AAAA,MACf,QAAQ;AAAA,QACN,GAAI,cAAc,EAAE,IAAI,IAAI,EAAE,SAAS,cAAc,EAAE,IAAI,EAAG,IAAI,CAAC;AAAA,QACnE,SAAS,KAAK,QAAQ,MAAM,cAAc;AAAA,MAC5C;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,OAAK,QAAQ,MAAM,UAAU;AAAA,IAC3B,GAAI,KAAK,QAAQ,MAAM,WAAW,CAAC;AAAA,IACnC,WAAW,EAAE,OAAO,UAAU,CAAC;AAAA,EACjC;AAEA,QAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,gBAAc;AAAA,IACZ,wBAAwB,MAAM;AAAA,MAC5B,IAAI,KAAK,QAAQ,MAAM,YAAY,MAAM,cACvC,KAAK,QAAQ,MAAM,YAAY,WAAW,IAAI,KAAK,GACrD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,KAAK,QAAQ,kBAAkB;AACjC,UAAM,cAAc,IAAI;AAAA,MACtB,MAAM;AAAA,MACN,YAAY,MAAM,IAAI,QAAG;AAAA,IAC3B,CAAC,EAAE,MAAM;AAET,eAAW,QAAQ,WAAW;AAC5B,YAAM,UAAUC,MAAK,KAAK,KAAK,QAAQ,MAAM,QAAS,KAAK,QAAQ;AACnE,YAAM,WAAWA,MAAK,KAAK,KAAK,QAAQ,QAAQ,KAAK,QAAQ;AAC7D,MAAAD,IAAG,UAAUC,MAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,MAAAD,IAAG,aAAa,SAAS,QAAQ;AACjC,MAAAA,IAAG,OAAO,OAAO;AAAA,IACnB;AACA,gBAAY;AAAA,MACV,oBAAoB,MAAM;AAAA,QACxB,IAAI,UAAU,MAAM,IAAI,UAAU,WAAW,IAAI,SAAS,OAAO;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,kBAAkB,KAAa;AACtC,MAAIA,IAAG,WAAW,GAAG,GAAG;AACtB,IAAAA,IAAG,OAAO,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACF;AAEA,SAAS,iBAAiB,KAAa,UAAsC;AAC3E,aAAW,OAAO,iBAAiB;AACjC,UAAM,WAAW,OAAOC,MAAK,KAAK,KAAK,GAAG,QAAQ,IAAI,GAAG,EAAE;AAC3D,QAAID,IAAG,WAAW,QAAQ,EAAG,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,iBACP,SACA,MACoB;AACpB,QAAM,aAAa,MAAM,OAAO;AAChC,WAAS,qBACP,SACA,WAAW,OACG;AACd,sBAAkB,QAAQ,MAAO;AACjC,QAAI,YAAY;AACd,cAAQ,SAAS;AACjB,UAAI,CAAC,UAAU;AACb,gBAAQ,YAAY;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,wBACP,aACA,YACc;AACd,UAAM,SAAuB,EAAE,GAAG,aAAa,GAAG,WAAW;AAC7D,QAAI,YAAY,OAAO;AACrB,aAAO,QAAQ,EAAE,GAAG,WAAW,OAAO,GAAG,YAAY,MAAM;AAAA,IAC7D;AACA,QAAI,YAAY,QAAQ;AACtB,aAAO,SAAS,CAAC,GAAG,WAAW,QAAQ,GAAI,YAAY,UAAU,CAAC,CAAE;AAAA,IACtE;AACA,QAAI,YAAY,UAAU;AACxB,aAAO,WAAW;AAAA,QAChB,GAAG,WAAW;AAAA,QACd,GAAI,YAAY,YAAY,CAAC;AAAA,MAC/B;AAAA,IACF;AACA,QAAI,YAAY,SAAS;AACvB,aAAO,UAAU,CAAC,GAAG,WAAW,SAAS,GAAI,YAAY,WAAW,CAAC,CAAE;AAAA,IACzE;AACA,WAAO,eAAe;AAAA,MACpB,GAAI,OAAO,gBAAgB,CAAC;AAAA,MAC5B,OAAO,OAAO,WAAW,QAAQ,SAAS;AAAA,IAC5C;AACA,WAAO,qBAAqB,QAAQ,IAAI;AAAA,EAC1C;AAEA,WAAS,oBACPE,iBACAC,UACqB;AACrB,IAAAD,gBAAe,MAAM,SAASD,MAAK;AAAA,MACjCC,gBAAe;AAAA,MACfA,gBAAe;AAAA,IACjB;AACA,IAAAA,gBAAe,MAAM,aAAa,IAAI;AAAA,MACpCA,gBAAe;AAAA,MACfC;AAAA,IACF,EAAE;AACF,yBAAqBD,gBAAe,OAAO,KAAK;AAChD,WAAOA;AAAA,EACT;AAGA,QAAM,iBAAiB;AAAA,IACrB;AAAA,MACE,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG,MAAM,SAAS;AAAA;AAAA,QAElB,QAAQ;AAAA,UACN,GAAG,wBAAwB;AAAA,UAC3B,GAAG,MAAM,SAAS,OAAO;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,QAAQD,MAAK,KAAK,MAAM,SAAS,UAAU,gBAAgB,SAAS;AAAA,MACpE,KAAK,MAAM,SAAS,OAAO;AAAA,MAC3B,WAAW,MAAM,SAAS,aAAa;AAAA,MACvC,kBAAkB,MAAM,SAAS,oBAAoB;AAAA,IACvD;AAAA,IACA;AAAA,EACF;AAGA,QAAM,aAAa;AAAA,IACjB;AAAA,MACE,GAAG;AAAA,MACH,GAAG,MAAM;AAAA,MACT,YAAY,eAAe,MAAM;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AAGA,QAAM,gBAAgB;AAAA,IACpB,MAAM,QAAQ,cAAc,WAAW,QACnC,0CACA;AAAA,IACJ,MAAM,QAAQ;AAAA,EAChB;AACA,QAAM,cAAc;AAAA,IAClB,MAAM,QAAQ,UAAU,WAAW,QAC/B,sCACA;AAAA,IACJ,MAAM,QAAQ;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,KAAK,MAAM,OAAO;AAAA,IAClB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,QAAQ;AAAA,MACN,cAAc;AAAA,MACd,UAAU;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,IACL;AAAA,EACF;AACF;",
6
6
  "names": ["fs", "path", "fs", "path", "build", "require", "fs", "path", "fs", "path", "path", "fs", "fileDesc", "messageDesc", "fileDesc", "messageDesc", "fileDesc", "messageDesc", "fileDesc", "messageDesc", "fileDesc", "messageDesc", "fileDesc", "messageDesc", "fileDesc", "messageDesc", "fileDesc", "enumDesc", "fileDesc", "messageDesc", "fileDesc", "enumDesc", "fileDesc", "messageDesc", "fileDesc", "fileDesc", "messageDesc", "file_google_protobuf_struct", "fileDesc", "file_google_protobuf_struct", "fileDesc", "enumDesc", "fileDesc", "messageDesc", "fileDesc", "messageDesc", "fileDesc", "messageDesc", "fs", "path", "browserOptions", "cdnBase"]
7
7
  }