@tailor-platform/sdk 1.2.6 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,13 +1,13 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./chunk-CIV_ash9.mjs";
2
- import { i as WORKFLOW_JOB_BRAND, r as getDistDir } from "./config-BmQRlW1j.mjs";
2
+ import { i as WORKFLOW_JOB_BRAND, r as getDistDir } from "./config-CBpYlVa-.mjs";
3
3
  import Module, { createRequire } from "node:module";
4
4
  import { defineCommand } from "citty";
5
- import * as path$20 from "node:path";
6
- import path from "node:path";
7
- import { loadEnvFile } from "node:process";
5
+ import * as fs$15 from "node:fs";
6
+ import fs from "node:fs";
7
+ import util, { formatWithOptions, parseEnv } from "node:util";
8
+ import * as path$20 from "pathe";
8
9
  import { z } from "zod";
9
10
  import chalk from "chalk";
10
- import util, { formatWithOptions } from "node:util";
11
11
  import { createConsola } from "consola";
12
12
  import { formatDistanceToNowStrict } from "date-fns";
13
13
  import { isCI } from "std-env";
@@ -18,8 +18,6 @@ import { Code, ConnectError, createClient } from "@connectrpc/connect";
18
18
  import { createConnectTransport } from "@connectrpc/connect-node";
19
19
  import { enumDesc, fileDesc, messageDesc, serviceDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
20
20
  import { readPackageJSON, resolveTSConfig } from "pkg-types";
21
- import * as fs$15 from "node:fs";
22
- import fs from "node:fs";
23
21
  import * as os$3 from "node:os";
24
22
  import os from "node:os";
25
23
  import { parseTOML, parseYAML, stringifyYAML } from "confbox";
@@ -29,6 +27,7 @@ import { xdgConfig } from "xdg-basedir";
29
27
  import { pathToFileURL } from "node:url";
30
28
  import * as inflection from "inflection";
31
29
  import { glob } from "node:fs/promises";
30
+ import path from "node:path";
32
31
  import assert from "node:assert";
33
32
  import * as rolldown from "rolldown";
34
33
  import { parseSync } from "oxc-parser";
@@ -41,8 +40,8 @@ import ora from "ora";
41
40
  //#region src/cli/utils/errors.ts
42
41
  /**
43
42
  * Type guard to check if an error is a CLIError
44
- * @param {unknown} error - Error to check
45
- * @returns {error is CLIError} True if the error is a CLIError
43
+ * @param error - Error to check
44
+ * @returns True if the error is a CLIError
46
45
  */
47
46
  function isCLIError(error) {
48
47
  return error instanceof Error && error.name === "CLIError";
@@ -244,21 +243,58 @@ const durationSchema = z.templateLiteral([z.number().int().positive(), z.enum(du
244
243
  });
245
244
  /**
246
245
  * Parse a duration string (e.g., "3s", "500ms", "1m") to milliseconds
247
- * @param {string} duration - Duration string with unit suffix (ms, s, m)
248
- * @returns {number} Duration in milliseconds
246
+ * @param duration - Duration string with unit suffix (ms, s, m)
247
+ * @returns Duration in milliseconds
249
248
  */
250
249
  function parseDuration(duration) {
251
250
  return durationSchema.parse(duration);
252
251
  }
253
252
  /**
253
+ * Load env files from parsed arguments.
254
+ * Processes --env-file first, then --env-file-if-exists.
255
+ *
256
+ * Follows Node.js --env-file behavior:
257
+ * - Variables already set in the environment are NOT overwritten
258
+ * - Variables from later files override those from earlier files
259
+ * @param envFiles - Required env file path(s) that must exist
260
+ * @param envFilesIfExists - Optional env file path(s) that are loaded if they exist
261
+ */
262
+ function loadEnvFiles(envFiles, envFilesIfExists) {
263
+ const originalEnvKeys = new Set(Object.keys(process.env));
264
+ const load = (files, required) => {
265
+ for (const file of [files ?? []].flat()) {
266
+ const envPath = path$20.resolve(process.cwd(), file);
267
+ if (!fs$15.existsSync(envPath)) {
268
+ if (required) throw new Error(`Environment file not found: ${envPath}`);
269
+ continue;
270
+ }
271
+ const parsed = parseEnv(fs$15.readFileSync(envPath, "utf-8"));
272
+ for (const [key, value] of Object.entries(parsed)) {
273
+ if (originalEnvKeys.has(key)) continue;
274
+ process.env[key] = value;
275
+ }
276
+ }
277
+ };
278
+ load(envFiles, true);
279
+ load(envFilesIfExists, false);
280
+ }
281
+ /**
254
282
  * Common arguments for all CLI commands
283
+ *
284
+ * NOTE: --env-file and --env-file-if-exists collide with Node.js flags due to a bug
285
+ * (https://github.com/nodejs/node/issues/54232). Node.js parses these even after the
286
+ * script path, causing warnings (twice due to tsx loader).
255
287
  */
256
288
  const commonArgs = {
257
289
  "env-file": {
258
290
  type: "string",
259
- description: "Path to the environment file",
291
+ description: "Path to the environment file (error if not found)",
260
292
  alias: "e"
261
293
  },
294
+ "env-file-if-exists": {
295
+ type: "string",
296
+ description: "Path to the environment file (ignored if not found)"
297
+ },
262
298
  verbose: {
263
299
  type: "boolean",
264
300
  description: "Enable verbose logging",
@@ -316,13 +352,14 @@ const jsonArgs = { json: {
316
352
  * - Error handling with formatted output
317
353
  * - Exit code management
318
354
  * @template T
319
- * @param {(args: T) => Promise<void>} handler - Command handler function
320
- * @returns {(ctx: { args: T }) => Promise<void>} Wrapped handler
355
+ * @param handler - Command handler function
356
+ * @returns Wrapped handler
321
357
  */
322
- const withCommonArgs = (handler) => async ({ args }) => {
358
+ const withCommonArgs = (handler) => async (context) => {
359
+ const { args } = context;
323
360
  try {
324
361
  if ("json" in args && typeof args.json === "boolean") logger.jsonMode = args.json;
325
- if (args["env-file"] !== void 0) loadEnvFile(path$20.resolve(process.cwd(), args["env-file"]));
362
+ loadEnvFiles(args["env-file"], args["env-file-if-exists"]);
326
363
  await handler(args);
327
364
  } catch (error) {
328
365
  if (isCLIError(error)) {
@@ -440,7 +477,7 @@ const file_tailor_v1_secret_manager_resource = /* @__PURE__ */ fileDesc("Cid0YWl
440
477
  /**
441
478
  * Describes the file tailor/v1/auth_resource.proto.
442
479
  */
443
- const file_tailor_v1_auth_resource = /* @__PURE__ */ fileDesc("Ch10YWlsb3IvdjEvYXV0aF9yZXNvdXJjZS5wcm90bxIJdGFpbG9yLnYxIjYKC0F1dGhTZXJ2aWNlEicKCW5hbWVzcGFjZRgBIAEoCzIULnRhaWxvci52MS5OYW1lc3BhY2UitAYKDUF1dGhJRFBDb25maWcSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI0CglhdXRoX3R5cGUYAiABKA4yIS50YWlsb3IudjEuQXV0aElEUENvbmZpZy5BdXRoVHlwZRIvCgZjb25maWcYAyABKAsyHy50YWlsb3IudjEuQXV0aElEUENvbmZpZy5Db25maWcauAEKBkNvbmZpZxIzCgRvaWRjGAEgASgLMiMudGFpbG9yLnYxLkF1dGhJRFBDb25maWcuT0lEQ0NvbmZpZ0gAEjMKBHNhbWwYAiABKAsyIy50YWlsb3IudjEuQXV0aElEUENvbmZpZy5TQU1MQ29uZmlnSAASOgoIaWRfdG9rZW4YAyABKAsyJi50YWlsb3IudjEuQXV0aElEUENvbmZpZy5JRFRva2VuQ29uZmlnSABCCAoGY29uZmlnGpgBCgpPSURDQ29uZmlnEhUKDWNsaWVudF9pZF9rZXkYASABKAkSMQoRY2xpZW50X3NlY3JldF9rZXkYAiABKAsyFi50YWlsb3IudjEuU2VjcmV0VmFsdWUSFAoMcHJvdmlkZXJfdXJsGAMgASgJEhIKCmlzc3Vlcl91cmwYBCABKAkSFgoOdXNlcm5hbWVfY2xhaW0YBSABKAkaYQoKU0FNTENvbmZpZxIUCgxtZXRhZGF0YV91cmwYASABKAkSFAoMcmF3X21ldGFkYXRhGAQgASgJEhsKE2VuYWJsZV9zaWduX3JlcXVlc3QYBSABKAhKBAgCEANKBAgDEAQaZAoNSURUb2tlbkNvbmZpZxIUCgxwcm92aWRlcl91cmwYASABKAkSEQoJY2xpZW50X2lkGAIgASgJEhIKCmlzc3Vlcl91cmwYAyABKAkSFgoOdXNlcm5hbWVfY2xhaW0YBCABKAkiZQoIQXV0aFR5cGUSGQoVQVVUSF9UWVBFX1VOU1BFQ0lGSUVEEAASEgoOQVVUSF9UWVBFX09JREMQARISCg5BVVRIX1RZUEVfU0FNTBACEhYKEkFVVEhfVFlQRV9JRF9UT0tFThADIq0GChlVc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnEhQKCHByb3ZpZGVyGAEgASgJQgIYARJTCg1wcm92aWRlcl90eXBlGAIgASgOMjwudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuVXNlclByb2ZpbGVQcm92aWRlclR5cGUSOwoGY29uZmlnGAMgASgLMisudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuQ29uZmlnGmMKBkNvbmZpZxJPCgh0YWlsb3JkYhgBIAEoCzI7LnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnLlRhaWxvckRCUHJvdmlkZXJDb25maWdIAEIICgZjb25maWcakgMKFlRhaWxvckRCUHJvdmlkZXJDb25maWcSOwoJbmFtZXNwYWNlGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi0KBHR5cGUYAiABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQSFgoOdXNlcm5hbWVfZmllbGQYAyABKAkSGQoRYXR0cmlidXRlc19maWVsZHMYBCADKAkSFwoPdGVuYW50X2lkX2ZpZWxkGAUgASgJEooBCg1hdHRyaWJ1dGVfbWFwGAYgAygLMk0udGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuVGFpbG9yREJQcm92aWRlckNvbmZpZy5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGjMKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEibgoXVXNlclByb2ZpbGVQcm92aWRlclR5cGUSKgomVVNFUl9QUk9GSUxFX1BST1ZJREVSX1RZUEVfVU5TUEVDSUZJRUQQABInCiNVU0VSX1BST0ZJTEVfUFJPVklERVJfVFlQRV9UQUlMT1JEQhABIr4DChRUZW5hbnRQcm92aWRlckNvbmZpZxIQCghwcm92aWRlchgBIAEoCRJJCg1wcm92aWRlcl90eXBlGAIgASgOMjIudGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnLlRlbmFudFByb3ZpZGVyVHlwZRI2CgZjb25maWcYAyABKAsyJi50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWcuQ29uZmlnGl4KBkNvbmZpZxJKCgh0YWlsb3JkYhgBIAEoCzI2LnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZy5UYWlsb3JEQlByb3ZpZGVyQ29uZmlnSABCCAoGY29uZmlnGlIKFlRhaWxvckRCUHJvdmlkZXJDb25maWcSEQoJbmFtZXNwYWNlGAEgASgJEgwKBHR5cGUYAiABKAkSFwoPc2lnbmF0dXJlX2ZpZWxkGAMgASgJIl0KElRlbmFudFByb3ZpZGVyVHlwZRIkCiBURU5BTlRfUFJPVklERVJfVFlQRV9VTlNQRUNJRklFRBAAEiEKHVRFTkFOVF9QUk9WSURFUl9UWVBFX1RBSUxPUkRCEAEiOwoLQXV0aEludm9rZXISEQoJbmFtZXNwYWNlGAEgASgJEhkKEW1hY2hpbmVfdXNlcl9uYW1lGAIgASgJIkgKE1BlcnNvbmFsQWNjZXNzVG9rZW4SDAoEbmFtZRgBIAEoCRIjCgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGUixgMKC01hY2hpbmVVc2VyEgoKAmlkGAEgASgJEjYKBG5hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSFgoJY2xpZW50X2lkGAMgASgJQgPgQQMSGgoNY2xpZW50X3NlY3JldBgEIAEoCUID4EEDEiEKCmF0dHJpYnV0ZXMYBSADKAlCDbpICpIBByIFcgOwAQESMwoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxIzCgp1cGRhdGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEmUKDWF0dHJpYnV0ZV9tYXAYCCADKAsyKC50YWlsb3IudjEuTWFjaGluZVVzZXIuQXR0cmlidXRlTWFwRW50cnlCJLpIIZoBHiIcchoyGF5bYS16XVswLTlhLXpBLVpdezAsNjJ9JBpLChFBdHRyaWJ1dGVNYXBFbnRyeRILCgNrZXkYASABKAkSJQoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWU6AjgBIt4CCg5BdXRoU0NJTUNvbmZpZxJDChFtYWNoaW5lX3VzZXJfbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChJhdXRob3JpemF0aW9uX3R5cGUYAiABKA4yKy50YWlsb3IudjEuQXV0aFNDSU1Db25maWcuQXV0aG9yaXphdGlvblR5cGUSLwoNYmVhcmVyX3NlY3JldBgKIAEoCzIWLnRhaWxvci52MS5TZWNyZXRWYWx1ZUgAInUKEUF1dGhvcml6YXRpb25UeXBlEiIKHkFVVEhPUklaQVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEh0KGUFVVEhPUklaQVRJT05fVFlQRV9CRUFSRVIQARIdChlBVVRIT1JJWkFUSU9OX1RZUEVfT0FVVEgyEAJCFgoUYXV0aG9yaXphdGlvbl9jb25maWciwwIKEEF1dGhTQ0lNUmVzb3VyY2USPwoEbmFtZRgBIAEoCUIxukguciwyKl5bQS1aYS16MC05XVtBLVphLXowLTktXXsxLDYxfVtBLVphLXowLTldJBJFChN0YWlsb3JfZGJfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjcKDnRhaWxvcl9kYl90eXBlGAMgASgJQh+6SBxyGjIYXltBLVpdW2EtekEtWjAtOV17MCw2Mn0kEj4KEWF0dHJpYnV0ZV9tYXBwaW5nGAQgAygLMiMudGFpbG9yLnYxLkF1dGhTQ0lNQXR0cmlidXRlTWFwcGluZxIuCgtjb3JlX3NjaGVtYRgFIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTVNjaGVtYSJGChhBdXRoU0NJTUF0dHJpYnV0ZU1hcHBpbmcSFwoPdGFpbG9yX2RiX2ZpZWxkGAEgASgJEhEKCXNjaW1fcGF0aBgCIAEoCSJQCg5BdXRoU0NJTVNjaGVtYRIMCgRuYW1lGAEgASgJEjAKCmF0dHJpYnV0ZXMYAiADKAsyHC50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUi2QUKEUF1dGhTQ0lNQXR0cmlidXRlEi8KBHR5cGUYASABKA4yIS50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUuVHlwZRIuCgRuYW1lGAIgASgJQiC6SB1yGzIZXltBLVphLXpdW2EtekEtWjAtOV8kLV0qJBITCgtkZXNjcmlwdGlvbhgDIAEoCRI7CgptdXRhYmlsaXR5GAQgASgOMicudGFpbG9yLnYxLkF1dGhTQ0lNQXR0cmlidXRlLk11dGFiaWxpdHkSEAoIcmVxdWlyZWQYBSABKAgSFAoMbXVsdGlfdmFsdWVkGAYgASgIEjsKCnVuaXF1ZW5lc3MYByABKA4yJy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUuVW5pcXVlbmVzcxIYChBjYW5vbmljYWxfdmFsdWVzGAggAygJEjQKDnN1Yl9hdHRyaWJ1dGVzGAkgAygLMhwudGFpbG9yLnYxLkF1dGhTQ0lNQXR0cmlidXRlInUKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhAKDFRZUEVfQ09NUExFWBABEg8KC1RZUEVfU1RSSU5HEAISDwoLVFlQRV9OVU1CRVIQAxIQCgxUWVBFX0JPT0xFQU4QBBIRCg1UWVBFX0RBVEVUSU1FEAUieAoKTXV0YWJpbGl0eRIaChZNVVRBQklMSVRZX1VOU1BFQ0lGSUVEEAASGAoUTVVUQUJJTElUWV9SRUFEX09OTFkQARIZChVNVVRBQklMSVRZX1JFQURfV1JJVEUQAhIZChVNVVRBQklMSVRZX1dSSVRFX09OTFkQAyJrCgpVbmlxdWVuZXNzEhoKFlVOSVFVRU5FU1NfVU5TUEVDSUZJRUQQABITCg9VTklRVUVORVNTX05PTkUQARIVChFVTklRVUVORVNTX1NFUlZFUhACEhUKEVVOSVFVRU5FU1NfR0xPQkFMEAMivgQKDkF1dGhDb25uZWN0aW9uEjYKBG5hbWUYASABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoEdHlwZRgCIAEoDjIeLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbi5UeXBlEkYKBm9hdXRoMhgDIAEoCzI0LnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbi5BdXRoQ29ubmVjdGlvbk9BdXRoMkNvbmZpZ0gAEjMKCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMaiAIKGkF1dGhDb25uZWN0aW9uT0F1dGgyQ29uZmlnEhQKDHByb3ZpZGVyX3VybBgBIAEoCRISCgppc3N1ZXJfdXJsGAIgASgJEhEKCWNsaWVudF9pZBgDIAEoCRIaCg1jbGllbnRfc2VjcmV0GAQgASgJQgPgQQQSRwoIYXV0aF91cmwYBSABKAlCNbpIMtgBAXItMiheaHR0cHM6Ly9bQS1aYS16MC05Li1dKyg6WzAtOV0rKT8oLy4qKT8kiAEBEkgKCXRva2VuX3VybBgGIAEoCUI1ukgy2AEBci0yKF5odHRwczovL1tBLVphLXowLTkuLV0rKDpbMC05XSspPygvLiopPySIAQEiLQoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASDwoLVFlQRV9PQVVUSDIQAUIPCgZjb25maWcSBbpIAggBItAFChBBdXRoT0F1dGgyQ2xpZW50EgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSOgoLZ3JhbnRfdHlwZXMYAyADKA4yJS50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudC5HcmFudFR5cGUSFQoNcmVkaXJlY3RfdXJpcxgEIAMoCRIWCgljbGllbnRfaWQYBSABKAlCA+BBAxIaCg1jbGllbnRfc2VjcmV0GAYgASgJQgPgQQMSMwoKY3JlYXRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxJKCgtjbGllbnRfdHlwZRgIIAEoDjImLnRhaWxvci52MS5BdXRoT0F1dGgyQ2xpZW50LkNsaWVudFR5cGVCDbpICtgBAYIBBBABIAASSgoVYWNjZXNzX3Rva2VuX2xpZmV0aW1lGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQhC6SA2qAQoiBAiAowUyAgg8EksKFnJlZnJlc2hfdG9rZW5fbGlmZXRpbWUYCiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CELpIDaoBCiIECID1JDICCDwSFAoMcmVxdWlyZV9kcG9wGAsgASgIImgKCUdyYW50VHlwZRIaChZHUkFOVF9UWVBFX1VOU1BFQ0lGSUVEEAASIQodR1JBTlRfVFlQRV9BVVRIT1JJWkFUSU9OX0NPREUQARIcChhHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4QAiJ4CgpDbGllbnRUeXBlEhsKF0NMSUVOVF9UWVBFX1VOU1BFQ0lGSUVEEAASHAoYQ0xJRU5UX1RZUEVfQ09ORklERU5USUFMEAESFgoSQ0xJRU5UX1RZUEVfUFVCTElDEAISFwoTQ0xJRU5UX1RZUEVfQlJPV1NFUhADIrcBChdDb250cm9scGxhbmVNYWNoaW5lVXNlchIPCgJpZBgBIAEoCUID4EEDEgwKBG5hbWUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSHAoPb3JnYW5pemF0aW9uX2lkGAQgASgJQgPgQQMSFgoJZm9sZGVyX2lkGAUgASgJQgPgQQMSFgoJY2xpZW50X2lkGAYgASgJQgPgQQMSGgoNY2xpZW50X3NlY3JldBgHIAEoCUID4EEDKk4KCFBBVFNjb3BlEhkKFVBBVF9TQ09QRV9VTlNQRUNJRklFRBAAEhIKDlBBVF9TQ09QRV9SRUFEEAESEwoPUEFUX1NDT1BFX1dSSVRFEAJiBnByb3RvMw", [
480
+ const file_tailor_v1_auth_resource = /* @__PURE__ */ fileDesc("Ch10YWlsb3IvdjEvYXV0aF9yZXNvdXJjZS5wcm90bxIJdGFpbG9yLnYxIlYKC0F1dGhTZXJ2aWNlEicKCW5hbWVzcGFjZRgBIAEoCzIULnRhaWxvci52MS5OYW1lc3BhY2USHgoWcHVibGlzaF9zZXNzaW9uX2V2ZW50cxgCIAEoCCK0BgoNQXV0aElEUENvbmZpZxI2CgRuYW1lGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjQKCWF1dGhfdHlwZRgCIAEoDjIhLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLkF1dGhUeXBlEi8KBmNvbmZpZxgDIAEoCzIfLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLkNvbmZpZxq4AQoGQ29uZmlnEjMKBG9pZGMYASABKAsyIy50YWlsb3IudjEuQXV0aElEUENvbmZpZy5PSURDQ29uZmlnSAASMwoEc2FtbBgCIAEoCzIjLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLlNBTUxDb25maWdIABI6CghpZF90b2tlbhgDIAEoCzImLnRhaWxvci52MS5BdXRoSURQQ29uZmlnLklEVG9rZW5Db25maWdIAEIICgZjb25maWcamAEKCk9JRENDb25maWcSFQoNY2xpZW50X2lkX2tleRgBIAEoCRIxChFjbGllbnRfc2VjcmV0X2tleRgCIAEoCzIWLnRhaWxvci52MS5TZWNyZXRWYWx1ZRIUCgxwcm92aWRlcl91cmwYAyABKAkSEgoKaXNzdWVyX3VybBgEIAEoCRIWCg51c2VybmFtZV9jbGFpbRgFIAEoCRphCgpTQU1MQ29uZmlnEhQKDG1ldGFkYXRhX3VybBgBIAEoCRIUCgxyYXdfbWV0YWRhdGEYBCABKAkSGwoTZW5hYmxlX3NpZ25fcmVxdWVzdBgFIAEoCEoECAIQA0oECAMQBBpkCg1JRFRva2VuQ29uZmlnEhQKDHByb3ZpZGVyX3VybBgBIAEoCRIRCgljbGllbnRfaWQYAiABKAkSEgoKaXNzdWVyX3VybBgDIAEoCRIWCg51c2VybmFtZV9jbGFpbRgEIAEoCSJlCghBdXRoVHlwZRIZChVBVVRIX1RZUEVfVU5TUEVDSUZJRUQQABISCg5BVVRIX1RZUEVfT0lEQxABEhIKDkFVVEhfVFlQRV9TQU1MEAISFgoSQVVUSF9UWVBFX0lEX1RPS0VOEAMirQYKGVVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcSFAoIcHJvdmlkZXIYASABKAlCAhgBElMKDXByb3ZpZGVyX3R5cGUYAiABKA4yPC50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5Vc2VyUHJvZmlsZVByb3ZpZGVyVHlwZRI7CgZjb25maWcYAyABKAsyKy50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5Db25maWcaYwoGQ29uZmlnEk8KCHRhaWxvcmRiGAEgASgLMjsudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcuVGFpbG9yREJQcm92aWRlckNvbmZpZ0gAQggKBmNvbmZpZxqSAwoWVGFpbG9yREJQcm92aWRlckNvbmZpZxI7CgluYW1lc3BhY2UYASABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLQoEdHlwZRgCIAEoCUIfukgcchoyGF5bQS1aXVthLXpBLVowLTldezAsNjJ9JBIWCg51c2VybmFtZV9maWVsZBgDIAEoCRIZChFhdHRyaWJ1dGVzX2ZpZWxkcxgEIAMoCRIXCg90ZW5hbnRfaWRfZmllbGQYBSABKAkSigEKDWF0dHJpYnV0ZV9tYXAYBiADKAsyTS50YWlsb3IudjEuVXNlclByb2ZpbGVQcm92aWRlckNvbmZpZy5UYWlsb3JEQlByb3ZpZGVyQ29uZmlnLkF0dHJpYnV0ZU1hcEVudHJ5QiS6SCGaAR4iHHIaMhheW2Etel1bMC05YS16QS1aXXswLDYyfSQaMwoRQXR0cmlidXRlTWFwRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJuChdVc2VyUHJvZmlsZVByb3ZpZGVyVHlwZRIqCiZVU0VSX1BST0ZJTEVfUFJPVklERVJfVFlQRV9VTlNQRUNJRklFRBAAEicKI1VTRVJfUFJPRklMRV9QUk9WSURFUl9UWVBFX1RBSUxPUkRCEAEivgMKFFRlbmFudFByb3ZpZGVyQ29uZmlnEhAKCHByb3ZpZGVyGAEgASgJEkkKDXByb3ZpZGVyX3R5cGUYAiABKA4yMi50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWcuVGVuYW50UHJvdmlkZXJUeXBlEjYKBmNvbmZpZxgDIAEoCzImLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZy5Db25maWcaXgoGQ29uZmlnEkoKCHRhaWxvcmRiGAEgASgLMjYudGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnLlRhaWxvckRCUHJvdmlkZXJDb25maWdIAEIICgZjb25maWcaUgoWVGFpbG9yREJQcm92aWRlckNvbmZpZxIRCgluYW1lc3BhY2UYASABKAkSDAoEdHlwZRgCIAEoCRIXCg9zaWduYXR1cmVfZmllbGQYAyABKAkiXQoSVGVuYW50UHJvdmlkZXJUeXBlEiQKIFRFTkFOVF9QUk9WSURFUl9UWVBFX1VOU1BFQ0lGSUVEEAASIQodVEVOQU5UX1BST1ZJREVSX1RZUEVfVEFJTE9SREIQASI7CgtBdXRoSW52b2tlchIRCgluYW1lc3BhY2UYASABKAkSGQoRbWFjaGluZV91c2VyX25hbWUYAiABKAkiSAoTUGVyc29uYWxBY2Nlc3NUb2tlbhIMCgRuYW1lGAEgASgJEiMKBnNjb3BlcxgCIAMoDjITLnRhaWxvci52MS5QQVRTY29wZSLGAwoLTWFjaGluZVVzZXISCgoCaWQYASABKAkSNgoEbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIWCgljbGllbnRfaWQYAyABKAlCA+BBAxIaCg1jbGllbnRfc2VjcmV0GAQgASgJQgPgQQMSIQoKYXR0cmlidXRlcxgFIAMoCUINukgKkgEHIgVyA7ABARIzCgpjcmVhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEjMKCnVwZGF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSZQoNYXR0cmlidXRlX21hcBgIIAMoCzIoLnRhaWxvci52MS5NYWNoaW5lVXNlci5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEi3gIKDkF1dGhTQ0lNQ29uZmlnEkMKEW1hY2hpbmVfdXNlcl9uYW1lGAEgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKEmF1dGhvcml6YXRpb25fdHlwZRgCIAEoDjIrLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZy5BdXRob3JpemF0aW9uVHlwZRIvCg1iZWFyZXJfc2VjcmV0GAogASgLMhYudGFpbG9yLnYxLlNlY3JldFZhbHVlSAAidQoRQXV0aG9yaXphdGlvblR5cGUSIgoeQVVUSE9SSVpBVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASHQoZQVVUSE9SSVpBVElPTl9UWVBFX0JFQVJFUhABEh0KGUFVVEhPUklaQVRJT05fVFlQRV9PQVVUSDIQAkIWChRhdXRob3JpemF0aW9uX2NvbmZpZyLDAgoQQXV0aFNDSU1SZXNvdXJjZRI/CgRuYW1lGAEgASgJQjG6SC5yLDIqXltBLVphLXowLTldW0EtWmEtejAtOS1dezEsNjF9W0EtWmEtejAtOV0kEkUKE3RhaWxvcl9kYl9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNwoOdGFpbG9yX2RiX3R5cGUYAyABKAlCH7pIHHIaMhheW0EtWl1bYS16QS1aMC05XXswLDYyfSQSPgoRYXR0cmlidXRlX21hcHBpbmcYBCADKAsyIy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGVNYXBwaW5nEi4KC2NvcmVfc2NoZW1hGAUgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNU2NoZW1hIkYKGEF1dGhTQ0lNQXR0cmlidXRlTWFwcGluZxIXCg90YWlsb3JfZGJfZmllbGQYASABKAkSEQoJc2NpbV9wYXRoGAIgASgJIlAKDkF1dGhTQ0lNU2NoZW1hEgwKBG5hbWUYASABKAkSMAoKYXR0cmlidXRlcxgCIAMoCzIcLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZSLZBQoRQXV0aFNDSU1BdHRyaWJ1dGUSLwoEdHlwZRgBIAEoDjIhLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZS5UeXBlEi4KBG5hbWUYAiABKAlCILpIHXIbMhleW0EtWmEtel1bYS16QS1aMC05XyQtXSokEhMKC2Rlc2NyaXB0aW9uGAMgASgJEjsKCm11dGFiaWxpdHkYBCABKA4yJy50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUuTXV0YWJpbGl0eRIQCghyZXF1aXJlZBgFIAEoCBIUCgxtdWx0aV92YWx1ZWQYBiABKAgSOwoKdW5pcXVlbmVzcxgHIAEoDjInLnRhaWxvci52MS5BdXRoU0NJTUF0dHJpYnV0ZS5VbmlxdWVuZXNzEhgKEGNhbm9uaWNhbF92YWx1ZXMYCCADKAkSNAoOc3ViX2F0dHJpYnV0ZXMYCSADKAsyHC50YWlsb3IudjEuQXV0aFNDSU1BdHRyaWJ1dGUidQoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEAoMVFlQRV9DT01QTEVYEAESDwoLVFlQRV9TVFJJTkcQAhIPCgtUWVBFX05VTUJFUhADEhAKDFRZUEVfQk9PTEVBThAEEhEKDVRZUEVfREFURVRJTUUQBSJ4CgpNdXRhYmlsaXR5EhoKFk1VVEFCSUxJVFlfVU5TUEVDSUZJRUQQABIYChRNVVRBQklMSVRZX1JFQURfT05MWRABEhkKFU1VVEFCSUxJVFlfUkVBRF9XUklURRACEhkKFU1VVEFCSUxJVFlfV1JJVEVfT05MWRADImsKClVuaXF1ZW5lc3MSGgoWVU5JUVVFTkVTU19VTlNQRUNJRklFRBAAEhMKD1VOSVFVRU5FU1NfTk9ORRABEhUKEVVOSVFVRU5FU1NfU0VSVkVSEAISFQoRVU5JUVVFTkVTU19HTE9CQUwQAyK+BAoOQXV0aENvbm5lY3Rpb24SNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIsCgR0eXBlGAIgASgOMh4udGFpbG9yLnYxLkF1dGhDb25uZWN0aW9uLlR5cGUSRgoGb2F1dGgyGAMgASgLMjQudGFpbG9yLnYxLkF1dGhDb25uZWN0aW9uLkF1dGhDb25uZWN0aW9uT0F1dGgyQ29uZmlnSAASMwoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxqIAgoaQXV0aENvbm5lY3Rpb25PQXV0aDJDb25maWcSFAoMcHJvdmlkZXJfdXJsGAEgASgJEhIKCmlzc3Vlcl91cmwYAiABKAkSEQoJY2xpZW50X2lkGAMgASgJEhoKDWNsaWVudF9zZWNyZXQYBCABKAlCA+BBBBJHCghhdXRoX3VybBgFIAEoCUI1ukgy2AEBci0yKF5odHRwczovL1tBLVphLXowLTkuLV0rKDpbMC05XSspPygvLiopPySIAQESSAoJdG9rZW5fdXJsGAYgASgJQjW6SDLYAQFyLTIoXmh0dHBzOi8vW0EtWmEtejAtOS4tXSsoOlswLTldKyk/KC8uKik/JIgBASItCgRUeXBlEhQKEFRZUEVfVU5TUEVDSUZJRUQQABIPCgtUWVBFX09BVVRIMhABQg8KBmNvbmZpZxIFukgCCAEi0AUKEEF1dGhPQXV0aDJDbGllbnQSDAoEbmFtZRgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRI6CgtncmFudF90eXBlcxgDIAMoDjIlLnRhaWxvci52MS5BdXRoT0F1dGgyQ2xpZW50LkdyYW50VHlwZRIVCg1yZWRpcmVjdF91cmlzGAQgAygJEhYKCWNsaWVudF9pZBgFIAEoCUID4EEDEhoKDWNsaWVudF9zZWNyZXQYBiABKAlCA+BBAxIzCgpjcmVhdGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEkoKC2NsaWVudF90eXBlGAggASgOMiYudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQuQ2xpZW50VHlwZUINukgK2AEBggEEEAEgABJKChVhY2Nlc3NfdG9rZW5fbGlmZXRpbWUYCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CELpIDaoBCiIECICjBTICCDwSSwoWcmVmcmVzaF90b2tlbl9saWZldGltZRgKIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIQukgNqgEKIgQIgPUkMgIIPBIUCgxyZXF1aXJlX2Rwb3AYCyABKAgiaAoJR3JhbnRUeXBlEhoKFkdSQU5UX1RZUEVfVU5TUEVDSUZJRUQQABIhCh1HUkFOVF9UWVBFX0FVVEhPUklaQVRJT05fQ09ERRABEhwKGEdSQU5UX1RZUEVfUkVGUkVTSF9UT0tFThACIngKCkNsaWVudFR5cGUSGwoXQ0xJRU5UX1RZUEVfVU5TUEVDSUZJRUQQABIcChhDTElFTlRfVFlQRV9DT05GSURFTlRJQUwQARIWChJDTElFTlRfVFlQRV9QVUJMSUMQAhIXChNDTElFTlRfVFlQRV9CUk9XU0VSEAMitwEKF0NvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEg8KAmlkGAEgASgJQgPgQQMSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIcCg9vcmdhbml6YXRpb25faWQYBCABKAlCA+BBAxIWCglmb2xkZXJfaWQYBSABKAlCA+BBAxIWCgljbGllbnRfaWQYBiABKAlCA+BBAxIaCg1jbGllbnRfc2VjcmV0GAcgASgJQgPgQQMqTgoIUEFUU2NvcGUSGQoVUEFUX1NDT1BFX1VOU1BFQ0lGSUVEEAASEgoOUEFUX1NDT1BFX1JFQUQQARITCg9QQVRfU0NPUEVfV1JJVEUQAmIGcHJvdG8z", [
444
481
  file_buf_validate_validate,
445
482
  file_google_api_field_behavior,
446
483
  file_google_protobuf_duration,
@@ -540,7 +577,7 @@ const PATScope = /* @__PURE__ */ tsEnum(PATScopeSchema);
540
577
  /**
541
578
  * Describes the file tailor/v1/auth.proto.
542
579
  */
543
- const file_tailor_v1_auth = /* @__PURE__ */ fileDesc("ChR0YWlsb3IvdjEvYXV0aC5wcm90bxIJdGFpbG9yLnYxInwKGENyZWF0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIkkKGUNyZWF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlInwKGERlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhsKGURlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UieQoVR2V0QXV0aFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiRgoWR2V0QXV0aFNlcnZpY2VSZXNwb25zZRIsCgxhdXRoX3NlcnZpY2UYASABKAsyFi50YWlsb3IudjEuQXV0aFNlcnZpY2UikgEKF0xpc3RBdXRoU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ3ChhMaXN0QXV0aFNlcnZpY2VzUmVzcG9uc2USLQoNYXV0aF9zZXJ2aWNlcxgBIAMoCzIWLnRhaWxvci52MS5BdXRoU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirAEKGkNyZWF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG0NyZWF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcirAEKGlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG1VwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcitgEKGkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIdChtEZWxldGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiswEKF0dldEF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJIChhHZXRBdXRoSURQQ29uZmlnUmVzcG9uc2USLAoKaWRwX2NvbmZpZxgBIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnItYBChlMaXN0QXV0aElEUENvbmZpZ3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChpMaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZRItCgtpZHBfY29uZmlncxgBIAMoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLOAQoeQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgDIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIm0KH0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2USSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIs4BCh5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAMgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcibQofVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWciggEKHkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiEKH0RlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UifwobR2V0VXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiagocR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcixgEKGUNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAMgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnQga6SAPIAQEiXQoaQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyLGAQoZVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKFnRlbmFudF9wcm92aWRlcl9jb25maWcYAyABKAsyHy50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWdCBrpIA8gBASJdChpVcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZRI/ChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAEgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnIn0KGURlbGV0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpEZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSJ6ChZHZXRUZW5hbnRDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWgoXR2V0VGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyKSAQogQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGVCEbpIDpIBCwgBIgeCAQQQASAAIjkKIUNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkiWgogRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiegofTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIpABCiBMaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXNwb25zZRI+ChZwZXJzb25hbF9hY2Nlc3NfdG9rZW5zGAEgAygLMh4udGFpbG9yLnYxLlBlcnNvbmFsQWNjZXNzVG9rZW4SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqMDChxDcmVhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOYXV0aF9uYW1lc3BhY2UYAiABKAlCK7pIKHImMiReKFthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0pPyQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIqADChxVcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIrgBChxEZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIfCh1EZWxldGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSK1AQoZR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDmF1dGhfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSgoaR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyItgBChtMaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5hdXRoX25hbWVzcGFjZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInsKHExpc3RBdXRoTWFjaGluZVVzZXJzUmVzcG9uc2USLQoNbWFjaGluZV91c2VycxgBIAMoCzIWLnRhaWxvci52MS5NYWNoaW5lVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirwEKG0NyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHENyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcirwEKG1VwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHFVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcifAoYR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoZR2V0QXV0aFNDSU1Db25maWdSZXNwb25zZRIuCgtzY2ltX2NvbmZpZxgBIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZyJ/ChtEZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIeChxEZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIrUBCh1DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIrUBCh1VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIo8BCh1EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIrYBChpHZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlEjIKDXNjaW1fcmVzb3VyY2UYASABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJ/ChtHZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJTChxHZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlEjMKDnNjaW1fcmVzb3VyY2VzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhTQ0lNUmVzb3VyY2UidAobQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNQoKY29ubmVjdGlvbhgCIAEoCzIZLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbkIGukgDyAEBIh4KHENyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UilQEKGkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ7ChtMaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS50YWlsb3IudjEuQXV0aENvbm5lY3Rpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIoABChtSZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHgocUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSLmAQokUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQQoPY29ubmVjdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhQKDGFjY2Vzc190b2tlbhgDIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAQgASgJEi4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIicKJVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVzcG9uc2Ui1wEKLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIwoSYXV0aG9yaXphdGlvbl9jb2RlGAMgASgJQge6SARyAhABEh0KDHJlZGlyZWN0X3VyaRgEIAEoCUIHukgEcgIQASIxCi9FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSKLAQodQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKLAQodVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCJlCh1EZWxldGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIrYBChpHZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKvAQocTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24iggEKHUxpc3RBdXRoT0F1dGgyQ2xpZW50c1Jlc3BvbnNlEjMKDm9hdXRoMl9jbGllbnRzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrYBCiRDcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YBCABKAkiYQolQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIi/AEKJFVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABARI7CgRuYW1lGAQgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kSACIAQESGAoLZGVzY3JpcHRpb24YBSABKAlIAYgBAUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iYQolVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIiiQEKIUdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABASJeCiJHZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlEjgKDG1hY2hpbmVfdXNlchgBIAEoCzIiLnRhaWxvci52MS5Db250cm9scGxhbmVNYWNoaW5lVXNlciLBAQojTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ijwEKJExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnNSZXNwb25zZRI5Cg1tYWNoaW5lX3VzZXJzGAEgAygLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKMAQokRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAIgASgJQgu6SAjYAQFyA7ABARIhCg9tYWNoaW5lX3VzZXJfaWQYAyABKAlCCLpIBXIDsAEBIicKJURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2ViBnByb3RvMw", [
580
+ const file_tailor_v1_auth = /* @__PURE__ */ fileDesc("ChR0YWlsb3IvdjEvYXV0aC5wcm90bxIJdGFpbG9yLnYxIpwBChhDcmVhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGUNyZWF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlIpwBChhVcGRhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGVVwZGF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlInwKGERlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhsKGURlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UieQoVR2V0QXV0aFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiRgoWR2V0QXV0aFNlcnZpY2VSZXNwb25zZRIsCgxhdXRoX3NlcnZpY2UYASABKAsyFi50YWlsb3IudjEuQXV0aFNlcnZpY2UikgEKF0xpc3RBdXRoU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ3ChhMaXN0QXV0aFNlcnZpY2VzUmVzcG9uc2USLQoNYXV0aF9zZXJ2aWNlcxgBIAMoCzIWLnRhaWxvci52MS5BdXRoU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirAEKGkNyZWF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG0NyZWF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcirAEKGlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG1VwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcitgEKGkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIdChtEZWxldGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiswEKF0dldEF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJIChhHZXRBdXRoSURQQ29uZmlnUmVzcG9uc2USLAoKaWRwX2NvbmZpZxgBIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnItYBChlMaXN0QXV0aElEUENvbmZpZ3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChpMaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZRItCgtpZHBfY29uZmlncxgBIAMoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLOAQoeQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgDIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIm0KH0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2USSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIs4BCh5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAMgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcibQofVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWciggEKHkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiEKH0RlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UifwobR2V0VXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiagocR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcixgEKGUNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAMgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnQga6SAPIAQEiXQoaQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyLGAQoZVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKFnRlbmFudF9wcm92aWRlcl9jb25maWcYAyABKAsyHy50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWdCBrpIA8gBASJdChpVcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZRI/ChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAEgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnIn0KGURlbGV0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpEZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSJ6ChZHZXRUZW5hbnRDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWgoXR2V0VGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyKSAQogQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGVCEbpIDpIBCwgBIgeCAQQQASAAIjkKIUNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkiWgogRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiegofTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIpABCiBMaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXNwb25zZRI+ChZwZXJzb25hbF9hY2Nlc3NfdG9rZW5zGAEgAygLMh4udGFpbG9yLnYxLlBlcnNvbmFsQWNjZXNzVG9rZW4SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqMDChxDcmVhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOYXV0aF9uYW1lc3BhY2UYAiABKAlCK7pIKHImMiReKFthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0pPyQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIqADChxVcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIrgBChxEZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIfCh1EZWxldGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSK1AQoZR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDmF1dGhfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSgoaR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyItgBChtMaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5hdXRoX25hbWVzcGFjZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInsKHExpc3RBdXRoTWFjaGluZVVzZXJzUmVzcG9uc2USLQoNbWFjaGluZV91c2VycxgBIAMoCzIWLnRhaWxvci52MS5NYWNoaW5lVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirwEKG0NyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHENyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcirwEKG1VwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHFVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcifAoYR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoZR2V0QXV0aFNDSU1Db25maWdSZXNwb25zZRIuCgtzY2ltX2NvbmZpZxgBIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZyJ/ChtEZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIeChxEZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIrUBCh1DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIrUBCh1VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIo8BCh1EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIrYBChpHZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlEjIKDXNjaW1fcmVzb3VyY2UYASABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJ/ChtHZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJTChxHZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlEjMKDnNjaW1fcmVzb3VyY2VzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhTQ0lNUmVzb3VyY2UidAobQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNQoKY29ubmVjdGlvbhgCIAEoCzIZLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbkIGukgDyAEBIh4KHENyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UilQEKGkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ7ChtMaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS50YWlsb3IudjEuQXV0aENvbm5lY3Rpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIoABChtSZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHgocUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSLmAQokUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQQoPY29ubmVjdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhQKDGFjY2Vzc190b2tlbhgDIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAQgASgJEi4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIicKJVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVzcG9uc2Ui1wEKLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIwoSYXV0aG9yaXphdGlvbl9jb2RlGAMgASgJQge6SARyAhABEh0KDHJlZGlyZWN0X3VyaRgEIAEoCUIHukgEcgIQASIxCi9FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSKLAQodQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKLAQodVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCJlCh1EZWxldGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIrYBChpHZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKvAQocTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24iggEKHUxpc3RBdXRoT0F1dGgyQ2xpZW50c1Jlc3BvbnNlEjMKDm9hdXRoMl9jbGllbnRzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrYBCiRDcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YBCABKAkiYQolQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIi/AEKJFVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABARI7CgRuYW1lGAQgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kSACIAQESGAoLZGVzY3JpcHRpb24YBSABKAlIAYgBAUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iYQolVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIiiQEKIUdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABASJeCiJHZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlEjgKDG1hY2hpbmVfdXNlchgBIAEoCzIiLnRhaWxvci52MS5Db250cm9scGxhbmVNYWNoaW5lVXNlciLBAQojTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ijwEKJExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnNSZXNwb25zZRI5Cg1tYWNoaW5lX3VzZXJzGAEgAygLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKMAQokRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAIgASgJQgu6SAjYAQFyA7ABARIhCg9tYWNoaW5lX3VzZXJfaWQYAyABKAlCCLpIBXIDsAEBIicKJURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2ViBnByb3RvMw", [
544
581
  file_buf_validate_validate,
545
582
  file_google_protobuf_struct,
546
583
  file_google_protobuf_timestamp,
@@ -908,7 +945,7 @@ const file_tailor_v1_workspace = /* @__PURE__ */ fileDesc("Chl0YWlsb3IvdjEvd29ya
908
945
  /**
909
946
  * Describes the file tailor/v1/service.proto.
910
947
  */
911
- const file_tailor_v1_service = /* @__PURE__ */ fileDesc("Chd0YWlsb3IvdjEvc2VydmljZS5wcm90bxIJdGFpbG9yLnYxIg0KC1BpbmdSZXF1ZXN0Ig4KDFBpbmdSZXNwb25zZTKgswEKD09wZXJhdG9yU2VydmljZRI5CgRQaW5nEhYudGFpbG9yLnYxLlBpbmdSZXF1ZXN0GhcudGFpbG9yLnYxLlBpbmdSZXNwb25zZSIAEocBCh1MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9ucxIvLnRhaWxvci52MS5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9uc1JlcXVlc3QaMC50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZVdvcmtzcGFjZRIhLnRhaWxvci52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZVdvcmtzcGFjZVJlc3BvbnNlIgASWgoPVXBkYXRlV29ya3NwYWNlEiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVJlcXVlc3QaIi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUmVzcG9uc2UiABJaCg9EZWxldGVXb3Jrc3BhY2USIS50YWlsb3IudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBoiLnRhaWxvci52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIAEloKDkxpc3RXb3Jrc3BhY2VzEiAudGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBohLnRhaWxvci52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlIgOQAgESfgoaTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXMSLC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVzcG9uc2UiA5ACARJdChBSZXN0b3JlV29ya3NwYWNlEiIudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSIAElQKDEdldFdvcmtzcGFjZRIeLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gh8udGFpbG9yLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgOQAgESfgoaTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnMSLC50YWlsb3IudjEuTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJzUmVzcG9uc2UiA5ACARKlAQonTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzEjkudGFpbG9yLnYxLkxpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1JlcXVlc3QaOi50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzUmVzcG9uc2UiA5ACARJ+ChtJbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISLS50YWlsb3IudjEuSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBouLnRhaWxvci52MS5JbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIAEn4KG1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlchItLnRhaWxvci52MS5SZW1vdmVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Gi4udGFpbG9yLnYxLlJlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIgASfgobVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyEi0udGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QaLi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiABJ4ChhHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISKi50YWlsb3IudjEuR2V0V29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBorLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIDkAIBEmAKEEdldFdvcmtzcGFjZVJvbGUSIi50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlc3BvbnNlIgOQAgESYwoSVXBkYXRlT3JnYW5pemF0aW9uEiQudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABJdCg9HZXRPcmdhbml6YXRpb24SIS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdBoiLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25SZXNwb25zZSIDkAIBEmMKEUxpc3RPcmdhbml6YXRpb25zEiMudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBokLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlIgOQAgESbwoVTGlzdFVzZXJPcmdhbml6YXRpb25zEicudGFpbG9yLnYxLkxpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UiA5ACARJyChdHcmFudE9yZ2FuaXphdGlvbkFjY2VzcxIpLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKi50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSIAEnUKGFVwZGF0ZU9yZ2FuaXphdGlvbkFjY2VzcxIqLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GisudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgASdQoYUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzEioudGFpbG9yLnYxLlJldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKy50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UiABJ4ChhMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXMSKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBorLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZSIDkAIBEm8KFUdldE9yZ2FuaXphdGlvbkFjY2VzcxInLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GigudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgOQAgESdQoYQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyEioudGFpbG9yLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKy50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiABJ1ChhVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXISKi50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBorLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSIAEnUKGERlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlchIqLnRhaWxvci52MS5EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0GisudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlIgASbwoVR2V0T3JnYW5pemF0aW9uRm9sZGVyEicudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiA5ACARJ1ChdMaXN0T3JnYW5pemF0aW9uRm9sZGVycxIpLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXNwb25zZSIDkAIBEoQBCh1HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2VzcxIvLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QaMC50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEooBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXMSMC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBoxLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZSIDkAIBEoEBChtHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSLS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBouLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZU9yZ2FuaXphdGlvblRlYW0SKC50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgASbwoWVXBkYXRlT3JnYW5pemF0aW9uVGVhbRIoLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UiABJvChZEZWxldGVPcmdhbml6YXRpb25UZWFtEigudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSIAEmkKE0dldE9yZ2FuaXphdGlvblRlYW0SJS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaJi50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgOQAgESbwoVTGlzdE9yZ2FuaXphdGlvblRlYW1zEicudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2UiA5ACARJ4ChlBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyEisudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0GiwudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChtMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnMSLS50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBouLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXNwb25zZSIDkAIBEnsKGUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXISKy50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QaLC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIgOQAgEScgoWR2V0UGxhdGZvcm1BY2NvdW50UGxhbhIoLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVxdWVzdBopLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBcHBsaWNhdGlvbhIjLnRhaWxvci52MS5DcmVhdGVBcHBsaWNhdGlvblJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZSIAEmAKEVVwZGF0ZUFwcGxpY2F0aW9uEiMudGFpbG9yLnYxLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlIgASYAoRRGVsZXRlQXBwbGljYXRpb24SIy50YWlsb3IudjEuRGVsZXRlQXBwbGljYXRpb25SZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiABJgChBMaXN0QXBwbGljYXRpb25zEiIudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIDkAIBEloKDkdldEFwcGxpY2F0aW9uEiAudGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uUmVxdWVzdBohLnRhaWxvci52MS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIgOQAgESfgoaR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGgSLC50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoUmVzcG9uc2UiA5ACARJjChJDb21wb3NlVGFpbG9yREJTREwSJC50YWlsb3IudjEuQ29tcG9zZVRhaWxvckRCU0RMUmVxdWVzdBolLnRhaWxvci52MS5Db21wb3NlVGFpbG9yREJTRExSZXNwb25zZSIAEmwKFUNyZWF0ZVRhaWxvckRCU2VydmljZRInLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIgASbAoVVXBkYXRlVGFpbG9yREJTZXJ2aWNlEicudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuVXBkYXRlVGFpbG9yREJTZXJ2aWNlUmVzcG9uc2UiABJsChVEZWxldGVUYWlsb3JEQlNlcnZpY2USJy50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5EZWxldGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZSIAEmYKEkdldFRhaWxvckRCU2VydmljZRIkLnRhaWxvci52MS5HZXRUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GiUudGFpbG9yLnYxLkdldFRhaWxvckRCU2VydmljZVJlc3BvbnNlIgOQAgESbAoUTGlzdFRhaWxvckRCU2VydmljZXMSJi50YWlsb3IudjEuTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlNlcnZpY2VzUmVzcG9uc2UiA5ACARJjChJDcmVhdGVUYWlsb3JEQlR5cGUSJC50YWlsb3IudjEuQ3JlYXRlVGFpbG9yREJUeXBlUmVxdWVzdBolLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlR5cGVSZXNwb25zZSIAEmMKElVwZGF0ZVRhaWxvckRCVHlwZRIkLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0GiUudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoSRGVsZXRlVGFpbG9yREJUeXBlEiQudGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QaJS50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UiABJsChVUcnVuY2F0ZVRhaWxvckRCVHlwZXMSJy50YWlsb3IudjEuVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVxdWVzdBooLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXNwb25zZSIAEmkKFFRydW5jYXRlVGFpbG9yREJUeXBlEiYudGFpbG9yLnYxLlRydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBonLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoRTGlzdFRhaWxvckRCVHlwZXMSIy50YWlsb3IudjEuTGlzdFRhaWxvckRCVHlwZXNSZXF1ZXN0GiQudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlR5cGVzUmVzcG9uc2UiA5ACARJdCg9HZXRUYWlsb3JEQlR5cGUSIS50YWlsb3IudjEuR2V0VGFpbG9yREJUeXBlUmVxdWVzdBoiLnRhaWxvci52MS5HZXRUYWlsb3JEQlR5cGVSZXNwb25zZSIDkAIBEn4KG0NyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASeAoYR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uEioudGFpbG9yLnYxLkdldFRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaKy50YWlsb3IudjEuR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiA5ACARJ+ChpMaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9ucxIsLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1JlcXVlc3QaLS50YWlsb3IudjEuTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZSIDkAIBEn4KG1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASfgobRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uEi0udGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaLi50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiABJsChVDcmVhdGVQaXBlbGluZVNlcnZpY2USJy50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIAEmwKFVVwZGF0ZVBpcGVsaW5lU2VydmljZRInLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlIgASbAoVRGVsZXRlUGlwZWxpbmVTZXJ2aWNlEicudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UiABJmChJHZXRQaXBlbGluZVNlcnZpY2USJC50YWlsb3IudjEuR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBolLnRhaWxvci52MS5HZXRQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIDkAIBEmwKFExpc3RQaXBlbGluZVNlcnZpY2VzEiYudGFpbG9yLnYxLkxpc3RQaXBlbGluZVNlcnZpY2VzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESaQoTR2V0UGlwZWxpbmVSZXNvbHZlchIlLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVxdWVzdBomLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiA5ACARJvChVMaXN0UGlwZWxpbmVSZXNvbHZlcnMSJy50YWlsb3IudjEuTGlzdFBpcGVsaW5lUmVzb2x2ZXJzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXISKC50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIgASbwoWVXBkYXRlUGlwZWxpbmVSZXNvbHZlchIoLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZEZWxldGVQaXBlbGluZVJlc29sdmVyEigudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZSIAEmMKEkNvbXBvc2VQaXBlbGluZVNETBIkLnRhaWxvci52MS5Db21wb3NlUGlwZWxpbmVTRExSZXF1ZXN0GiUudGFpbG9yLnYxLkNvbXBvc2VQaXBlbGluZVNETFJlc3BvbnNlIgASnAEKJExpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0cxI2LnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdHNSZXF1ZXN0GjcudGFpbG9yLnYxLkxpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0c1Jlc3BvbnNlIgOQAgESlgEKIkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHQSNC50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QaNS50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlc3BvbnNlIgOQAgEScgoXUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXISKS50YWlsb3IudjEuUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GioudGFpbG9yLnYxLlJlc3RhcnRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZDcmVhdGVTdGF0ZWZsb3dTZXJ2aWNlEigudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIAEm8KFlVwZGF0ZVN0YXRlZmxvd1NlcnZpY2USKC50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIgASbwoWRGVsZXRlU3RhdGVmbG93U2VydmljZRIoLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVzcG9uc2UiABJpChNHZXRTdGF0ZWZsb3dTZXJ2aWNlEiUudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIDkAIBEm8KFUxpc3RTdGF0ZWZsb3dTZXJ2aWNlcxInLnRhaWxvci52MS5MaXN0U3RhdGVmbG93U2VydmljZXNSZXF1ZXN0GigudGFpbG9yLnYxLkxpc3RTdGF0ZWZsb3dTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChZVcGRhdGVFeGVjdXRvckV4ZWN1dG9yEigudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSIAEmkKE0dldEV4ZWN1dG9yRXhlY3V0b3ISJS50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlcXVlc3QaJi50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlIgOQAgESbwoWRGVsZXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChVMaXN0RXhlY3V0b3JFeGVjdXRvcnMSJy50YWlsb3IudjEuTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0RXhlY3V0b3JFeGVjdXRvcnNSZXNwb25zZSIDkAIBEloKDkdldEV4ZWN1dG9ySm9iEiAudGFpbG9yLnYxLkdldEV4ZWN1dG9ySm9iUmVxdWVzdBohLnRhaWxvci52MS5HZXRFeGVjdXRvckpvYlJlc3BvbnNlIgOQAgESYAoQTGlzdEV4ZWN1dG9ySm9icxIiLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVxdWVzdBojLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVzcG9uc2UiA5ACARJ1ChdMaXN0RXhlY3V0b3JKb2JBdHRlbXB0cxIpLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdEV4ZWN1dG9ySm9iQXR0ZW1wdHNSZXNwb25zZSIDkAIBEoQBChxMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzEi4udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXNwb25zZSIDkAIBEn4KGkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rEiwudGFpbG9yLnYxLkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBotLnRhaWxvci52MS5HZXRFeGVjdXRvckluY29taW5nV2ViaG9va1Jlc3BvbnNlIgOQAgESWgoPVHJpZ2dlckV4ZWN1dG9yEiEudGFpbG9yLnYxLlRyaWdnZXJFeGVjdXRvclJlcXVlc3QaIi50YWlsb3IudjEuVHJpZ2dlckV4ZWN1dG9yUmVzcG9uc2UiABJ1ChhDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHQSKi50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBorLnRhaWxvci52MS5DcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZSIAEm8KFUdldFNlY3JldE1hbmFnZXJWYXVsdBInLnRhaWxvci52MS5HZXRTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0GigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIgOQAgESdQoYRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0EioudGFpbG9yLnYxLkRlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QaKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2UiABJ1ChdMaXN0U2VjcmV0TWFuYWdlclZhdWx0cxIpLnRhaWxvci52MS5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJWYXVsdHNSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoZVXBkYXRlU2VjcmV0TWFuYWdlclNlY3JldBIrLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2UiABJyChZHZXRTZWNyZXRNYW5hZ2VyU2VjcmV0EigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0GikudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZSIDkAIBEngKGURlbGV0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoYTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzEioudGFpbG9yLnYxLkxpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBdXRoU2VydmljZRIjLnRhaWxvci52MS5DcmVhdGVBdXRoU2VydmljZVJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXV0aFNlcnZpY2VSZXNwb25zZSIAEmAKEURlbGV0ZUF1dGhTZXJ2aWNlEiMudGFpbG9yLnYxLkRlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBokLnRhaWxvci52MS5EZWxldGVBdXRoU2VydmljZVJlc3BvbnNlIgASWgoOR2V0QXV0aFNlcnZpY2USIC50YWlsb3IudjEuR2V0QXV0aFNlcnZpY2VSZXF1ZXN0GiEudGFpbG9yLnYxLkdldEF1dGhTZXJ2aWNlUmVzcG9uc2UiA5ACARJgChBMaXN0QXV0aFNlcnZpY2VzEiIudGFpbG9yLnYxLkxpc3RBdXRoU2VydmljZXNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBdXRoU2VydmljZXNSZXNwb25zZSIDkAIBEmYKE0NyZWF0ZUF1dGhJRFBDb25maWcSJS50YWlsb3IudjEuQ3JlYXRlQXV0aElEUENvbmZpZ1JlcXVlc3QaJi50YWlsb3IudjEuQ3JlYXRlQXV0aElEUENvbmZpZ1Jlc3BvbnNlIgASZgoTVXBkYXRlQXV0aElEUENvbmZpZxIlLnRhaWxvci52MS5VcGRhdGVBdXRoSURQQ29uZmlnUmVxdWVzdBomLnRhaWxvci52MS5VcGRhdGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiABJmChNEZWxldGVBdXRoSURQQ29uZmlnEiUudGFpbG9yLnYxLkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0GiYudGFpbG9yLnYxLkRlbGV0ZUF1dGhJRFBDb25maWdSZXNwb25zZSIAEmAKEEdldEF1dGhJRFBDb25maWcSIi50YWlsb3IudjEuR2V0QXV0aElEUENvbmZpZ1JlcXVlc3QaIy50YWlsb3IudjEuR2V0QXV0aElEUENvbmZpZ1Jlc3BvbnNlIgOQAgESZgoSTGlzdEF1dGhJRFBDb25maWdzEiQudGFpbG9yLnYxLkxpc3RBdXRoSURQQ29uZmlnc1JlcXVlc3QaJS50YWlsb3IudjEuTGlzdEF1dGhJRFBDb25maWdzUmVzcG9uc2UiA5ACARJyChdDcmVhdGVVc2VyUHJvZmlsZUNvbmZpZxIpLnRhaWxvci52MS5DcmVhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaKi50YWlsb3IudjEuQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIAEnIKF1VwZGF0ZVVzZXJQcm9maWxlQ29uZmlnEikudGFpbG9yLnYxLlVwZGF0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBoqLnRhaWxvci52MS5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgAScgoXRGVsZXRlVXNlclByb2ZpbGVDb25maWcSKS50YWlsb3IudjEuRGVsZXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0GioudGFpbG9yLnYxLkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UiABJsChRHZXRVc2VyUHJvZmlsZUNvbmZpZxImLnRhaWxvci52MS5HZXRVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIDkAIBEmMKEkNyZWF0ZVRlbmFudENvbmZpZxIkLnRhaWxvci52MS5DcmVhdGVUZW5hbnRDb25maWdSZXF1ZXN0GiUudGFpbG9yLnYxLkNyZWF0ZVRlbmFudENvbmZpZ1Jlc3BvbnNlIgASYwoSVXBkYXRlVGVuYW50Q29uZmlnEiQudGFpbG9yLnYxLlVwZGF0ZVRlbmFudENvbmZpZ1JlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlVGVuYW50Q29uZmlnUmVzcG9uc2UiABJjChJEZWxldGVUZW5hbnRDb25maWcSJC50YWlsb3IudjEuRGVsZXRlVGVuYW50Q29uZmlnUmVxdWVzdBolLnRhaWxvci52MS5EZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSIAEl0KD0dldFRlbmFudENvbmZpZxIhLnRhaWxvci52MS5HZXRUZW5hbnRDb25maWdSZXF1ZXN0GiIudGFpbG9yLnYxLkdldFRlbmFudENvbmZpZ1Jlc3BvbnNlIgOQAgESeAoZQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlbhIrLnRhaWxvci52MS5DcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVxdWVzdBosLnRhaWxvci52MS5DcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiABJ4ChlEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuEisudGFpbG9yLnYxLkRlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXF1ZXN0GiwudGFpbG9yLnYxLkRlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZSIAEngKGExpc3RQZXJzb25hbEFjY2Vzc1Rva2VucxIqLnRhaWxvci52MS5MaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RQZXJzb25hbEFjY2Vzc1Rva2Vuc1Jlc3BvbnNlIgOQAgESbAoVQ3JlYXRlQXV0aE1hY2hpbmVVc2VyEicudGFpbG9yLnYxLkNyZWF0ZUF1dGhNYWNoaW5lVXNlclJlcXVlc3QaKC50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiABJsChVVcGRhdGVBdXRoTWFjaGluZVVzZXISJy50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdBooLnRhaWxvci52MS5VcGRhdGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIAEmwKFURlbGV0ZUF1dGhNYWNoaW5lVXNlchInLnRhaWxvci52MS5EZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0GigudGFpbG9yLnYxLkRlbGV0ZUF1dGhNYWNoaW5lVXNlclJlc3BvbnNlIgASZgoSR2V0QXV0aE1hY2hpbmVVc2VyEiQudGFpbG9yLnYxLkdldEF1dGhNYWNoaW5lVXNlclJlcXVlc3QaJS50YWlsb3IudjEuR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiA5ACARJsChRMaXN0QXV0aE1hY2hpbmVVc2VycxImLnRhaWxvci52MS5MaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QaJy50YWlsb3IudjEuTGlzdEF1dGhNYWNoaW5lVXNlcnNSZXNwb25zZSIDkAIBEmkKFENyZWF0ZUF1dGhTQ0lNQ29uZmlnEiYudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5DcmVhdGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgASaQoUVXBkYXRlQXV0aFNDSU1Db25maWcSJi50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1Db25maWdSZXF1ZXN0GicudGFpbG9yLnYxLlVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiABJpChREZWxldGVBdXRoU0NJTUNvbmZpZxImLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuRGVsZXRlQXV0aFNDSU1Db25maWdSZXNwb25zZSIAEmMKEUdldEF1dGhTQ0lNQ29uZmlnEiMudGFpbG9yLnYxLkdldEF1dGhTQ0lNQ29uZmlnUmVxdWVzdBokLnRhaWxvci52MS5HZXRBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlQXV0aFNDSU1SZXNvdXJjZRIoLnRhaWxvci52MS5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiABJvChZVcGRhdGVBdXRoU0NJTVJlc291cmNlEigudGFpbG9yLnYxLlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIAEm8KFkRlbGV0ZUF1dGhTQ0lNUmVzb3VyY2USKC50YWlsb3IudjEuRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIgASaQoTR2V0QXV0aFNDSU1SZXNvdXJjZRIlLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBomLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiA5ACARJsChRHZXRBdXRoU0NJTVJlc291cmNlcxImLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QaJy50YWlsb3IudjEuR2V0QXV0aFNDSU1SZXNvdXJjZXNSZXNwb25zZSIDkAIBEmkKFENyZWF0ZUF1dGhDb25uZWN0aW9uEiYudGFpbG9yLnYxLkNyZWF0ZUF1dGhDb25uZWN0aW9uUmVxdWVzdBonLnRhaWxvci52MS5DcmVhdGVBdXRoQ29ubmVjdGlvblJlc3BvbnNlIgASaQoTTGlzdEF1dGhDb25uZWN0aW9ucxIlLnRhaWxvci52MS5MaXN0QXV0aENvbm5lY3Rpb25zUmVxdWVzdBomLnRhaWxvci52MS5MaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2UiA5ACARJpChRSZXZva2VBdXRoQ29ubmVjdGlvbhImLnRhaWxvci52MS5SZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QaJy50YWlsb3IudjEuUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSIAEoQBCh1SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvbhIvLnRhaWxvci52MS5SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvblJlcXVlc3QaMC50YWlsb3IudjEuUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXNwb25zZSIAEqIBCidFeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGUSOS50YWlsb3IudjEuRXhjaGFuZ2VBdXRoQ29ubmVjdGlvbkF1dGhvcml6YXRpb25Db2RlUmVxdWVzdBo6LnRhaWxvci52MS5FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSIAEm8KFkNyZWF0ZUF1dGhPQXV0aDJDbGllbnQSKC50YWlsb3IudjEuQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgASbwoWVXBkYXRlQXV0aE9BdXRoMkNsaWVudBIoLnRhaWxvci52MS5VcGRhdGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiABJvChZEZWxldGVBdXRoT0F1dGgyQ2xpZW50EigudGFpbG9yLnYxLkRlbGV0ZUF1dGhPQXV0aDJDbGllbnRSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZUF1dGhPQXV0aDJDbGllbnRSZXNwb25zZSIAEmkKE0dldEF1dGhPQXV0aDJDbGllbnQSJS50YWlsb3IudjEuR2V0QXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaJi50YWlsb3IudjEuR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgOQAgESbwoVTGlzdEF1dGhPQXV0aDJDbGllbnRzEicudGFpbG9yLnYxLkxpc3RBdXRoT0F1dGgyQ2xpZW50c1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVzcG9uc2UiA5ACARJpChNMaXN0RGF0YXBsYW5lRXZlbnRzEiUudGFpbG9yLnYxLkxpc3REYXRhcGxhbmVFdmVudHNSZXF1ZXN0GiYudGFpbG9yLnYxLkxpc3REYXRhcGxhbmVFdmVudHNSZXNwb25zZSIDkAIBEoQBChxMaXN0Q29udHJvbHBsYW5lQWN0aXZpdHlMb2dzEi4udGFpbG9yLnYxLkxpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3NSZXNwb25zZSIDkAIBElcKDlRlc3RFeGVjU2NyaXB0EiAudGFpbG9yLnYxLlRlc3RFeGVjU2NyaXB0UmVxdWVzdBohLnRhaWxvci52MS5UZXN0RXhlY1NjcmlwdFJlc3BvbnNlIgASbAoUR2V0RnVuY3Rpb25FeGVjdXRpb24SJi50YWlsb3IudjEuR2V0RnVuY3Rpb25FeGVjdXRpb25SZXF1ZXN0GicudGFpbG9yLnYxLkdldEZ1bmN0aW9uRXhlY3V0aW9uUmVzcG9uc2UiA5ACARJyChZMaXN0RnVuY3Rpb25FeGVjdXRpb25zEigudGFpbG9yLnYxLkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnNSZXNwb25zZSIDkAIBEnEKFkNyZWF0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgAoARJxChZVcGRhdGVGdW5jdGlvblJlZ2lzdHJ5EigudGFpbG9yLnYxLlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZSIAKAESaQoTR2V0RnVuY3Rpb25SZWdpc3RyeRIlLnRhaWxvci52MS5HZXRGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBomLnRhaWxvci52MS5HZXRGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiA5ACARJyChZMaXN0RnVuY3Rpb25SZWdpc3RyaWVzEigudGFpbG9yLnYxLkxpc3RGdW5jdGlvblJlZ2lzdHJpZXNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RGdW5jdGlvblJlZ2lzdHJpZXNSZXNwb25zZSIDkAIBEm8KFkRlbGV0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuRGVsZXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgASjAEKHkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdBIwLnRhaWxvci52MS5Eb3dubG9hZEZ1bmN0aW9uUmVnaXN0cnlTY3JpcHRSZXF1ZXN0GjEudGFpbG9yLnYxLkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlc3BvbnNlIgOQAgEwARJyChZMaXN0TWV0ZXJSZXF1ZXN0Q291bnRzEigudGFpbG9yLnYxLkxpc3RNZXRlclJlcXVlc3RDb3VudHNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RNZXRlclJlcXVlc3RDb3VudHNSZXNwb25zZSIDkAIBEngKGExpc3RNZXRlckV4ZWN1dGlvbkNvdW50cxIqLnRhaWxvci52MS5MaXN0TWV0ZXJFeGVjdXRpb25Db3VudHNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1Jlc3BvbnNlIgOQAgESbAoUTGlzdE1ldGVyRXZlbnRDb3VudHMSJi50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RNZXRlckV2ZW50Q291bnRzUmVzcG9uc2UiA5ACARJdCg9MaXN0SWRQU2VydmljZXMSIS50YWlsb3IudjEuTGlzdElkUFNlcnZpY2VzUmVxdWVzdBoiLnRhaWxvci52MS5MaXN0SWRQU2VydmljZXNSZXNwb25zZSIDkAIBEl0KEENyZWF0ZUlkUFNlcnZpY2USIi50YWlsb3IudjEuQ3JlYXRlSWRQU2VydmljZVJlcXVlc3QaIy50YWlsb3IudjEuQ3JlYXRlSWRQU2VydmljZVJlc3BvbnNlIgASXQoQVXBkYXRlSWRQU2VydmljZRIiLnRhaWxvci52MS5VcGRhdGVJZFBTZXJ2aWNlUmVxdWVzdBojLnRhaWxvci52MS5VcGRhdGVJZFBTZXJ2aWNlUmVzcG9uc2UiABJdChBEZWxldGVJZFBTZXJ2aWNlEiIudGFpbG9yLnYxLkRlbGV0ZUlkUFNlcnZpY2VSZXF1ZXN0GiMudGFpbG9yLnYxLkRlbGV0ZUlkUFNlcnZpY2VSZXNwb25zZSIAElcKDUdldElkUFNlcnZpY2USHy50YWlsb3IudjEuR2V0SWRQU2VydmljZVJlcXVlc3QaIC50YWlsb3IudjEuR2V0SWRQU2VydmljZVJlc3BvbnNlIgOQAgESWgoOTGlzdElkUENsaWVudHMSIC50YWlsb3IudjEuTGlzdElkUENsaWVudHNSZXF1ZXN0GiEudGFpbG9yLnYxLkxpc3RJZFBDbGllbnRzUmVzcG9uc2UiA5ACARJaCg9DcmVhdGVJZFBDbGllbnQSIS50YWlsb3IudjEuQ3JlYXRlSWRQQ2xpZW50UmVxdWVzdBoiLnRhaWxvci52MS5DcmVhdGVJZFBDbGllbnRSZXNwb25zZSIAEloKD0RlbGV0ZUlkUENsaWVudBIhLnRhaWxvci52MS5EZWxldGVJZFBDbGllbnRSZXF1ZXN0GiIudGFpbG9yLnYxLkRlbGV0ZUlkUENsaWVudFJlc3BvbnNlIgASVAoMR2V0SWRQQ2xpZW50Eh4udGFpbG9yLnYxLkdldElkUENsaWVudFJlcXVlc3QaHy50YWlsb3IudjEuR2V0SWRQQ2xpZW50UmVzcG9uc2UiA5ACARJmChNDcmVhdGVTdGF0aWNXZWJzaXRlEiUudGFpbG9yLnYxLkNyZWF0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0GiYudGFpbG9yLnYxLkNyZWF0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSIAEmYKE1VwZGF0ZVN0YXRpY1dlYnNpdGUSJS50YWlsb3IudjEuVXBkYXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QaJi50YWlsb3IudjEuVXBkYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlIgASZgoTRGVsZXRlU3RhdGljV2Vic2l0ZRIlLnRhaWxvci52MS5EZWxldGVTdGF0aWNXZWJzaXRlUmVxdWVzdBomLnRhaWxvci52MS5EZWxldGVTdGF0aWNXZWJzaXRlUmVzcG9uc2UiABJgChBHZXRTdGF0aWNXZWJzaXRlEiIudGFpbG9yLnYxLkdldFN0YXRpY1dlYnNpdGVSZXF1ZXN0GiMudGFpbG9yLnYxLkdldFN0YXRpY1dlYnNpdGVSZXNwb25zZSIDkAIBEmYKEkxpc3RTdGF0aWNXZWJzaXRlcxIkLnRhaWxvci52MS5MaXN0U3RhdGljV2Vic2l0ZXNSZXF1ZXN0GiUudGFpbG9yLnYxLkxpc3RTdGF0aWNXZWJzaXRlc1Jlc3BvbnNlIgOQAgESXQoQQ3JlYXRlRGVwbG95bWVudBIiLnRhaWxvci52MS5DcmVhdGVEZXBsb3ltZW50UmVxdWVzdBojLnRhaWxvci52MS5DcmVhdGVEZXBsb3ltZW50UmVzcG9uc2UiABJNCgpVcGxvYWRGaWxlEhwudGFpbG9yLnYxLlVwbG9hZEZpbGVSZXF1ZXN0Gh0udGFpbG9yLnYxLlVwbG9hZEZpbGVSZXNwb25zZSIAKAESYAoRUHVibGlzaERlcGxveW1lbnQSIy50YWlsb3IudjEuUHVibGlzaERlcGxveW1lbnRSZXF1ZXN0GiQudGFpbG9yLnYxLlB1Ymxpc2hEZXBsb3ltZW50UmVzcG9uc2UiABJXCg5DcmVhdGVXb3JrZmxvdxIgLnRhaWxvci52MS5DcmVhdGVXb3JrZmxvd1JlcXVlc3QaIS50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dSZXNwb25zZSIAElcKDlVwZGF0ZVdvcmtmbG93EiAudGFpbG9yLnYxLlVwZGF0ZVdvcmtmbG93UmVxdWVzdBohLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd1Jlc3BvbnNlIgASVwoORGVsZXRlV29ya2Zsb3cSIC50YWlsb3IudjEuRGVsZXRlV29ya2Zsb3dSZXF1ZXN0GiEudGFpbG9yLnYxLkRlbGV0ZVdvcmtmbG93UmVzcG9uc2UiABJRCgtHZXRXb3JrZmxvdxIdLnRhaWxvci52MS5HZXRXb3JrZmxvd1JlcXVlc3QaHi50YWlsb3IudjEuR2V0V29ya2Zsb3dSZXNwb25zZSIDkAIBEmMKEUdldFdvcmtmbG93QnlOYW1lEiMudGFpbG9yLnYxLkdldFdvcmtmbG93QnlOYW1lUmVxdWVzdBokLnRhaWxvci52MS5HZXRXb3JrZmxvd0J5TmFtZVJlc3BvbnNlIgOQAgESVwoNTGlzdFdvcmtmbG93cxIfLnRhaWxvci52MS5MaXN0V29ya2Zsb3dzUmVxdWVzdBogLnRhaWxvci52MS5MaXN0V29ya2Zsb3dzUmVzcG9uc2UiA5ACARJ4ChlDcmVhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uEisudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb25SZXF1ZXN0GiwudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZSIAEngKGVVwZGF0ZVdvcmtmbG93Sm9iRnVuY3Rpb24SKy50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QaLC50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlIgAScgoWR2V0V29ya2Zsb3dKb2JGdW5jdGlvbhIoLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBopLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uUmVzcG9uc2UiA5ACARKEAQocR2V0V29ya2Zsb3dKb2JGdW5jdGlvbkJ5TmFtZRIuLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lUmVxdWVzdBovLnRhaWxvci52MS5HZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lUmVzcG9uc2UiA5ACARJ4ChhMaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnMSKi50YWlsb3IudjEuTGlzdFdvcmtmbG93Sm9iRnVuY3Rpb25zUmVxdWVzdBorLnRhaWxvci52MS5MaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnNSZXNwb25zZSIDkAIBEmwKFEdldFdvcmtmbG93RXhlY3V0aW9uEiYudGFpbG9yLnYxLkdldFdvcmtmbG93RXhlY3V0aW9uUmVxdWVzdBonLnRhaWxvci52MS5HZXRXb3JrZmxvd0V4ZWN1dGlvblJlc3BvbnNlIgOQAgEScgoWTGlzdFdvcmtmbG93RXhlY3V0aW9ucxIoLnRhaWxvci52MS5MaXN0V29ya2Zsb3dFeGVjdXRpb25zUmVxdWVzdBopLnRhaWxvci52MS5MaXN0V29ya2Zsb3dFeGVjdXRpb25zUmVzcG9uc2UiA5ACARJgChFUZXN0U3RhcnRXb3JrZmxvdxIjLnRhaWxvci52MS5UZXN0U3RhcnRXb3JrZmxvd1JlcXVlc3QaJC50YWlsb3IudjEuVGVzdFN0YXJ0V29ya2Zsb3dSZXNwb25zZSIAEmMKElRlc3RSZXN1bWVXb3JrZmxvdxIkLnRhaWxvci52MS5UZXN0UmVzdW1lV29ya2Zsb3dSZXF1ZXN0GiUudGFpbG9yLnYxLlRlc3RSZXN1bWVXb3JrZmxvd1Jlc3BvbnNlIgASTgoLU2V0TWV0YWRhdGESHS50YWlsb3IudjEuU2V0TWV0YWRhdGFSZXF1ZXN0Gh4udGFpbG9yLnYxLlNldE1ldGFkYXRhUmVzcG9uc2UiABJRCgtHZXRNZXRhZGF0YRIdLnRhaWxvci52MS5HZXRNZXRhZGF0YVJlcXVlc3QaHi50YWlsb3IudjEuR2V0TWV0YWRhdGFSZXNwb25zZSIDkAIBEoQBCh1DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlchIvLnRhaWxvci52MS5DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QaMC50YWlsb3IudjEuQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZSIAEoQBCh1VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlchIvLnRhaWxvci52MS5VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QaMC50YWlsb3IudjEuVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZSIAEn4KGkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEiwudGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBotLnRhaWxvci52MS5HZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgOQAgEShAEKHExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnMSLi50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QaLy50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1Jlc3BvbnNlIgOQAgEShAEKHURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLkRlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5EZWxldGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgBiBnByb3RvMw", [
948
+ const file_tailor_v1_service = /* @__PURE__ */ fileDesc("Chd0YWlsb3IvdjEvc2VydmljZS5wcm90bxIJdGFpbG9yLnYxIg0KC1BpbmdSZXF1ZXN0Ig4KDFBpbmdSZXNwb25zZTKCtAEKD09wZXJhdG9yU2VydmljZRI5CgRQaW5nEhYudGFpbG9yLnYxLlBpbmdSZXF1ZXN0GhcudGFpbG9yLnYxLlBpbmdSZXNwb25zZSIAEocBCh1MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9ucxIvLnRhaWxvci52MS5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9uc1JlcXVlc3QaMC50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZVdvcmtzcGFjZRIhLnRhaWxvci52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZVdvcmtzcGFjZVJlc3BvbnNlIgASWgoPVXBkYXRlV29ya3NwYWNlEiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVJlcXVlc3QaIi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUmVzcG9uc2UiABJaCg9EZWxldGVXb3Jrc3BhY2USIS50YWlsb3IudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBoiLnRhaWxvci52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIAEloKDkxpc3RXb3Jrc3BhY2VzEiAudGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBohLnRhaWxvci52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlIgOQAgESfgoaTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXMSLC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVzcG9uc2UiA5ACARJdChBSZXN0b3JlV29ya3NwYWNlEiIudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSIAElQKDEdldFdvcmtzcGFjZRIeLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gh8udGFpbG9yLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgOQAgESfgoaTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnMSLC50YWlsb3IudjEuTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJzUmVzcG9uc2UiA5ACARKlAQonTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzEjkudGFpbG9yLnYxLkxpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1JlcXVlc3QaOi50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzUmVzcG9uc2UiA5ACARJ+ChtJbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISLS50YWlsb3IudjEuSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBouLnRhaWxvci52MS5JbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIAEn4KG1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlchItLnRhaWxvci52MS5SZW1vdmVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Gi4udGFpbG9yLnYxLlJlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIgASfgobVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyEi0udGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QaLi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiABJ4ChhHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISKi50YWlsb3IudjEuR2V0V29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBorLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIDkAIBEmAKEEdldFdvcmtzcGFjZVJvbGUSIi50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlc3BvbnNlIgOQAgESYwoSVXBkYXRlT3JnYW5pemF0aW9uEiQudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABJdCg9HZXRPcmdhbml6YXRpb24SIS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdBoiLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25SZXNwb25zZSIDkAIBEmMKEUxpc3RPcmdhbml6YXRpb25zEiMudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBokLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlIgOQAgESbwoVTGlzdFVzZXJPcmdhbml6YXRpb25zEicudGFpbG9yLnYxLkxpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UiA5ACARJyChdHcmFudE9yZ2FuaXphdGlvbkFjY2VzcxIpLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKi50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSIAEnUKGFVwZGF0ZU9yZ2FuaXphdGlvbkFjY2VzcxIqLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GisudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgASdQoYUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzEioudGFpbG9yLnYxLlJldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKy50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UiABJ4ChhMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXMSKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBorLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZSIDkAIBEm8KFUdldE9yZ2FuaXphdGlvbkFjY2VzcxInLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GigudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgOQAgESdQoYQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyEioudGFpbG9yLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKy50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiABJ1ChhVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXISKi50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBorLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSIAEnUKGERlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlchIqLnRhaWxvci52MS5EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0GisudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlIgASbwoVR2V0T3JnYW5pemF0aW9uRm9sZGVyEicudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiA5ACARJ1ChdMaXN0T3JnYW5pemF0aW9uRm9sZGVycxIpLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXNwb25zZSIDkAIBEoQBCh1HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2VzcxIvLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QaMC50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEooBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXMSMC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBoxLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZSIDkAIBEoEBChtHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSLS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBouLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZU9yZ2FuaXphdGlvblRlYW0SKC50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgASbwoWVXBkYXRlT3JnYW5pemF0aW9uVGVhbRIoLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UiABJvChZEZWxldGVPcmdhbml6YXRpb25UZWFtEigudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSIAEmkKE0dldE9yZ2FuaXphdGlvblRlYW0SJS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaJi50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgOQAgESbwoVTGlzdE9yZ2FuaXphdGlvblRlYW1zEicudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2UiA5ACARJ4ChlBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyEisudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0GiwudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChtMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnMSLS50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBouLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXNwb25zZSIDkAIBEnsKGUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXISKy50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QaLC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIgOQAgEScgoWR2V0UGxhdGZvcm1BY2NvdW50UGxhbhIoLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVxdWVzdBopLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBcHBsaWNhdGlvbhIjLnRhaWxvci52MS5DcmVhdGVBcHBsaWNhdGlvblJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZSIAEmAKEVVwZGF0ZUFwcGxpY2F0aW9uEiMudGFpbG9yLnYxLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlIgASYAoRRGVsZXRlQXBwbGljYXRpb24SIy50YWlsb3IudjEuRGVsZXRlQXBwbGljYXRpb25SZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiABJgChBMaXN0QXBwbGljYXRpb25zEiIudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIDkAIBEloKDkdldEFwcGxpY2F0aW9uEiAudGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uUmVxdWVzdBohLnRhaWxvci52MS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIgOQAgESfgoaR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGgSLC50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoUmVzcG9uc2UiA5ACARJjChJDb21wb3NlVGFpbG9yREJTREwSJC50YWlsb3IudjEuQ29tcG9zZVRhaWxvckRCU0RMUmVxdWVzdBolLnRhaWxvci52MS5Db21wb3NlVGFpbG9yREJTRExSZXNwb25zZSIAEmwKFUNyZWF0ZVRhaWxvckRCU2VydmljZRInLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIgASbAoVVXBkYXRlVGFpbG9yREJTZXJ2aWNlEicudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuVXBkYXRlVGFpbG9yREJTZXJ2aWNlUmVzcG9uc2UiABJsChVEZWxldGVUYWlsb3JEQlNlcnZpY2USJy50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5EZWxldGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZSIAEmYKEkdldFRhaWxvckRCU2VydmljZRIkLnRhaWxvci52MS5HZXRUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GiUudGFpbG9yLnYxLkdldFRhaWxvckRCU2VydmljZVJlc3BvbnNlIgOQAgESbAoUTGlzdFRhaWxvckRCU2VydmljZXMSJi50YWlsb3IudjEuTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlNlcnZpY2VzUmVzcG9uc2UiA5ACARJjChJDcmVhdGVUYWlsb3JEQlR5cGUSJC50YWlsb3IudjEuQ3JlYXRlVGFpbG9yREJUeXBlUmVxdWVzdBolLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlR5cGVSZXNwb25zZSIAEmMKElVwZGF0ZVRhaWxvckRCVHlwZRIkLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0GiUudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoSRGVsZXRlVGFpbG9yREJUeXBlEiQudGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QaJS50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UiABJsChVUcnVuY2F0ZVRhaWxvckRCVHlwZXMSJy50YWlsb3IudjEuVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVxdWVzdBooLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXNwb25zZSIAEmkKFFRydW5jYXRlVGFpbG9yREJUeXBlEiYudGFpbG9yLnYxLlRydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBonLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoRTGlzdFRhaWxvckRCVHlwZXMSIy50YWlsb3IudjEuTGlzdFRhaWxvckRCVHlwZXNSZXF1ZXN0GiQudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlR5cGVzUmVzcG9uc2UiA5ACARJdCg9HZXRUYWlsb3JEQlR5cGUSIS50YWlsb3IudjEuR2V0VGFpbG9yREJUeXBlUmVxdWVzdBoiLnRhaWxvci52MS5HZXRUYWlsb3JEQlR5cGVSZXNwb25zZSIDkAIBEn4KG0NyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASeAoYR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uEioudGFpbG9yLnYxLkdldFRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaKy50YWlsb3IudjEuR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiA5ACARJ+ChpMaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9ucxIsLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1JlcXVlc3QaLS50YWlsb3IudjEuTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZSIDkAIBEn4KG1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASfgobRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uEi0udGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaLi50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiABJsChVDcmVhdGVQaXBlbGluZVNlcnZpY2USJy50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIAEmwKFVVwZGF0ZVBpcGVsaW5lU2VydmljZRInLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlIgASbAoVRGVsZXRlUGlwZWxpbmVTZXJ2aWNlEicudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UiABJmChJHZXRQaXBlbGluZVNlcnZpY2USJC50YWlsb3IudjEuR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBolLnRhaWxvci52MS5HZXRQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIDkAIBEmwKFExpc3RQaXBlbGluZVNlcnZpY2VzEiYudGFpbG9yLnYxLkxpc3RQaXBlbGluZVNlcnZpY2VzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESaQoTR2V0UGlwZWxpbmVSZXNvbHZlchIlLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVxdWVzdBomLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiA5ACARJvChVMaXN0UGlwZWxpbmVSZXNvbHZlcnMSJy50YWlsb3IudjEuTGlzdFBpcGVsaW5lUmVzb2x2ZXJzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXISKC50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIgASbwoWVXBkYXRlUGlwZWxpbmVSZXNvbHZlchIoLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZEZWxldGVQaXBlbGluZVJlc29sdmVyEigudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZSIAEmMKEkNvbXBvc2VQaXBlbGluZVNETBIkLnRhaWxvci52MS5Db21wb3NlUGlwZWxpbmVTRExSZXF1ZXN0GiUudGFpbG9yLnYxLkNvbXBvc2VQaXBlbGluZVNETFJlc3BvbnNlIgASnAEKJExpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0cxI2LnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdHNSZXF1ZXN0GjcudGFpbG9yLnYxLkxpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0c1Jlc3BvbnNlIgOQAgESlgEKIkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHQSNC50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QaNS50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlc3BvbnNlIgOQAgEScgoXUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXISKS50YWlsb3IudjEuUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GioudGFpbG9yLnYxLlJlc3RhcnRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZDcmVhdGVTdGF0ZWZsb3dTZXJ2aWNlEigudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIAEm8KFlVwZGF0ZVN0YXRlZmxvd1NlcnZpY2USKC50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIgASbwoWRGVsZXRlU3RhdGVmbG93U2VydmljZRIoLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVzcG9uc2UiABJpChNHZXRTdGF0ZWZsb3dTZXJ2aWNlEiUudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIDkAIBEm8KFUxpc3RTdGF0ZWZsb3dTZXJ2aWNlcxInLnRhaWxvci52MS5MaXN0U3RhdGVmbG93U2VydmljZXNSZXF1ZXN0GigudGFpbG9yLnYxLkxpc3RTdGF0ZWZsb3dTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChZVcGRhdGVFeGVjdXRvckV4ZWN1dG9yEigudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSIAEmkKE0dldEV4ZWN1dG9yRXhlY3V0b3ISJS50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlcXVlc3QaJi50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlIgOQAgESbwoWRGVsZXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChVMaXN0RXhlY3V0b3JFeGVjdXRvcnMSJy50YWlsb3IudjEuTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0RXhlY3V0b3JFeGVjdXRvcnNSZXNwb25zZSIDkAIBEloKDkdldEV4ZWN1dG9ySm9iEiAudGFpbG9yLnYxLkdldEV4ZWN1dG9ySm9iUmVxdWVzdBohLnRhaWxvci52MS5HZXRFeGVjdXRvckpvYlJlc3BvbnNlIgOQAgESYAoQTGlzdEV4ZWN1dG9ySm9icxIiLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVxdWVzdBojLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVzcG9uc2UiA5ACARJ1ChdMaXN0RXhlY3V0b3JKb2JBdHRlbXB0cxIpLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdEV4ZWN1dG9ySm9iQXR0ZW1wdHNSZXNwb25zZSIDkAIBEoQBChxMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzEi4udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXNwb25zZSIDkAIBEn4KGkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rEiwudGFpbG9yLnYxLkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBotLnRhaWxvci52MS5HZXRFeGVjdXRvckluY29taW5nV2ViaG9va1Jlc3BvbnNlIgOQAgESWgoPVHJpZ2dlckV4ZWN1dG9yEiEudGFpbG9yLnYxLlRyaWdnZXJFeGVjdXRvclJlcXVlc3QaIi50YWlsb3IudjEuVHJpZ2dlckV4ZWN1dG9yUmVzcG9uc2UiABJ1ChhDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHQSKi50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBorLnRhaWxvci52MS5DcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZSIAEm8KFUdldFNlY3JldE1hbmFnZXJWYXVsdBInLnRhaWxvci52MS5HZXRTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0GigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIgOQAgESdQoYRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0EioudGFpbG9yLnYxLkRlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QaKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2UiABJ1ChdMaXN0U2VjcmV0TWFuYWdlclZhdWx0cxIpLnRhaWxvci52MS5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJWYXVsdHNSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoZVXBkYXRlU2VjcmV0TWFuYWdlclNlY3JldBIrLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2UiABJyChZHZXRTZWNyZXRNYW5hZ2VyU2VjcmV0EigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0GikudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZSIDkAIBEngKGURlbGV0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoYTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzEioudGFpbG9yLnYxLkxpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBdXRoU2VydmljZRIjLnRhaWxvci52MS5DcmVhdGVBdXRoU2VydmljZVJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXV0aFNlcnZpY2VSZXNwb25zZSIAEmAKEVVwZGF0ZUF1dGhTZXJ2aWNlEiMudGFpbG9yLnYxLlVwZGF0ZUF1dGhTZXJ2aWNlUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBdXRoU2VydmljZVJlc3BvbnNlIgASYAoRRGVsZXRlQXV0aFNlcnZpY2USIy50YWlsb3IudjEuRGVsZXRlQXV0aFNlcnZpY2VSZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UiABJaCg5HZXRBdXRoU2VydmljZRIgLnRhaWxvci52MS5HZXRBdXRoU2VydmljZVJlcXVlc3QaIS50YWlsb3IudjEuR2V0QXV0aFNlcnZpY2VSZXNwb25zZSIDkAIBEmAKEExpc3RBdXRoU2VydmljZXMSIi50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1JlcXVlc3QaIy50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESZgoTQ3JlYXRlQXV0aElEUENvbmZpZxIlLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVxdWVzdBomLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiABJmChNVcGRhdGVBdXRoSURQQ29uZmlnEiUudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0GiYudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZSIAEmYKE0RlbGV0ZUF1dGhJRFBDb25maWcSJS50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1JlcXVlc3QaJi50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1Jlc3BvbnNlIgASYAoQR2V0QXV0aElEUENvbmZpZxIiLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVxdWVzdBojLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVzcG9uc2UiA5ACARJmChJMaXN0QXV0aElEUENvbmZpZ3MSJC50YWlsb3IudjEuTGlzdEF1dGhJRFBDb25maWdzUmVxdWVzdBolLnRhaWxvci52MS5MaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZSIDkAIBEnIKF0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnEikudGFpbG9yLnYxLkNyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBoqLnRhaWxvci52MS5DcmVhdGVVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgAScgoXVXBkYXRlVXNlclByb2ZpbGVDb25maWcSKS50YWlsb3IudjEuVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0GioudGFpbG9yLnYxLlVwZGF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UiABJyChdEZWxldGVVc2VyUHJvZmlsZUNvbmZpZxIpLnRhaWxvci52MS5EZWxldGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaKi50YWlsb3IudjEuRGVsZXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIAEmwKFEdldFVzZXJQcm9maWxlQ29uZmlnEiYudGFpbG9yLnYxLkdldFVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5HZXRVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgOQAgESYwoSQ3JlYXRlVGVuYW50Q29uZmlnEiQudGFpbG9yLnYxLkNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QaJS50YWlsb3IudjEuQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2UiABJjChJVcGRhdGVUZW5hbnRDb25maWcSJC50YWlsb3IudjEuVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBolLnRhaWxvci52MS5VcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZSIAEmMKEkRlbGV0ZVRlbmFudENvbmZpZxIkLnRhaWxvci52MS5EZWxldGVUZW5hbnRDb25maWdSZXF1ZXN0GiUudGFpbG9yLnYxLkRlbGV0ZVRlbmFudENvbmZpZ1Jlc3BvbnNlIgASXQoPR2V0VGVuYW50Q29uZmlnEiEudGFpbG9yLnYxLkdldFRlbmFudENvbmZpZ1JlcXVlc3QaIi50YWlsb3IudjEuR2V0VGVuYW50Q29uZmlnUmVzcG9uc2UiA5ACARJ4ChlDcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuEisudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXF1ZXN0GiwudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZSIAEngKGURlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW4SKy50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlc3BvbnNlIgASeAoYTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zEioudGFpbG9yLnYxLkxpc3RQZXJzb25hbEFjY2Vzc1Rva2Vuc1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVzcG9uc2UiA5ACARJsChVDcmVhdGVBdXRoTWFjaGluZVVzZXISJy50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIAEmwKFVVwZGF0ZUF1dGhNYWNoaW5lVXNlchInLnRhaWxvci52MS5VcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZUF1dGhNYWNoaW5lVXNlclJlc3BvbnNlIgASbAoVRGVsZXRlQXV0aE1hY2hpbmVVc2VyEicudGFpbG9yLnYxLkRlbGV0ZUF1dGhNYWNoaW5lVXNlclJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiABJmChJHZXRBdXRoTWFjaGluZVVzZXISJC50YWlsb3IudjEuR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBolLnRhaWxvci52MS5HZXRBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIDkAIBEmwKFExpc3RBdXRoTWFjaGluZVVzZXJzEiYudGFpbG9yLnYxLkxpc3RBdXRoTWFjaGluZVVzZXJzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0QXV0aE1hY2hpbmVVc2Vyc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aFNDSU1Db25maWcSJi50YWlsb3IudjEuQ3JlYXRlQXV0aFNDSU1Db25maWdSZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiABJpChRVcGRhdGVBdXRoU0NJTUNvbmZpZxImLnRhaWxvci52MS5VcGRhdGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1Db25maWdSZXNwb25zZSIAEmkKFERlbGV0ZUF1dGhTQ0lNQ29uZmlnEiYudGFpbG9yLnYxLkRlbGV0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgASYwoRR2V0QXV0aFNDSU1Db25maWcSIy50YWlsb3IudjEuR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0GiQudGFpbG9yLnYxLkdldEF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiA5ACARJvChZDcmVhdGVBdXRoU0NJTVJlc291cmNlEigudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIAEm8KFlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2USKC50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIgASbwoWRGVsZXRlQXV0aFNDSU1SZXNvdXJjZRIoLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiABJpChNHZXRBdXRoU0NJTVJlc291cmNlEiUudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIDkAIBEmwKFEdldEF1dGhTQ0lNUmVzb3VyY2VzEiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VzUmVxdWVzdBonLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aENvbm5lY3Rpb24SJi50YWlsb3IudjEuQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UiABJpChNMaXN0QXV0aENvbm5lY3Rpb25zEiUudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0GiYudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXNwb25zZSIDkAIBEmkKFFJldm9rZUF1dGhDb25uZWN0aW9uEiYudGFpbG9yLnYxLlJldm9rZUF1dGhDb25uZWN0aW9uUmVxdWVzdBonLnRhaWxvci52MS5SZXZva2VBdXRoQ29ubmVjdGlvblJlc3BvbnNlIgAShAEKHVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uEi8udGFpbG9yLnYxLlJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVxdWVzdBowLnRhaWxvci52MS5SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvblJlc3BvbnNlIgASogEKJ0V4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZRI5LnRhaWxvci52MS5FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0GjoudGFpbG9yLnYxLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlc3BvbnNlIgASbwoWQ3JlYXRlQXV0aE9BdXRoMkNsaWVudBIoLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiABJvChZVcGRhdGVBdXRoT0F1dGgyQ2xpZW50EigudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXNwb25zZSIAEm8KFkRlbGV0ZUF1dGhPQXV0aDJDbGllbnQSKC50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgASaQoTR2V0QXV0aE9BdXRoMkNsaWVudBIlLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBomLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiA5ACARJvChVMaXN0QXV0aE9BdXRoMkNsaWVudHMSJy50YWlsb3IudjEuTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0QXV0aE9BdXRoMkNsaWVudHNSZXNwb25zZSIDkAIBEmkKE0xpc3REYXRhcGxhbmVFdmVudHMSJS50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1JlcXVlc3QaJi50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1Jlc3BvbnNlIgOQAgEShAEKHExpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3MSLi50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1JlcXVlc3QaLy50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1Jlc3BvbnNlIgOQAgESVwoOVGVzdEV4ZWNTY3JpcHQSIC50YWlsb3IudjEuVGVzdEV4ZWNTY3JpcHRSZXF1ZXN0GiEudGFpbG9yLnYxLlRlc3RFeGVjU2NyaXB0UmVzcG9uc2UiABJsChRHZXRGdW5jdGlvbkV4ZWN1dGlvbhImLnRhaWxvci52MS5HZXRGdW5jdGlvbkV4ZWN1dGlvblJlcXVlc3QaJy50YWlsb3IudjEuR2V0RnVuY3Rpb25FeGVjdXRpb25SZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1Jlc3BvbnNlIgOQAgEScQoWQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiACgBEnEKFlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgAoARJpChNHZXRGdW5jdGlvblJlZ2lzdHJ5EiUudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvblJlZ2lzdHJpZXMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1Jlc3BvbnNlIgOQAgESbwoWRGVsZXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiABKMAQoeRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0EjAudGFpbG9yLnYxLkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlcXVlc3QaMS50YWlsb3IudjEuRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0UmVzcG9uc2UiA5ACATABEnIKFkxpc3RNZXRlclJlcXVlc3RDb3VudHMSKC50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1Jlc3BvbnNlIgOQAgESeAoYTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzEioudGFpbG9yLnYxLkxpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzUmVzcG9uc2UiA5ACARJsChRMaXN0TWV0ZXJFdmVudENvdW50cxImLnRhaWxvci52MS5MaXN0TWV0ZXJFdmVudENvdW50c1JlcXVlc3QaJy50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXNwb25zZSIDkAIBEl0KD0xpc3RJZFBTZXJ2aWNlcxIhLnRhaWxvci52MS5MaXN0SWRQU2VydmljZXNSZXF1ZXN0GiIudGFpbG9yLnYxLkxpc3RJZFBTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESXQoQQ3JlYXRlSWRQU2VydmljZRIiLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVxdWVzdBojLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVzcG9uc2UiABJdChBVcGRhdGVJZFBTZXJ2aWNlEiIudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXNwb25zZSIAEl0KEERlbGV0ZUlkUFNlcnZpY2USIi50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlcXVlc3QaIy50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlc3BvbnNlIgASVwoNR2V0SWRQU2VydmljZRIfLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVxdWVzdBogLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVzcG9uc2UiA5ACARJaCg5MaXN0SWRQQ2xpZW50cxIgLnRhaWxvci52MS5MaXN0SWRQQ2xpZW50c1JlcXVlc3QaIS50YWlsb3IudjEuTGlzdElkUENsaWVudHNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZUlkUENsaWVudBIhLnRhaWxvci52MS5DcmVhdGVJZFBDbGllbnRSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZUlkUENsaWVudFJlc3BvbnNlIgASWgoPRGVsZXRlSWRQQ2xpZW50EiEudGFpbG9yLnYxLkRlbGV0ZUlkUENsaWVudFJlcXVlc3QaIi50YWlsb3IudjEuRGVsZXRlSWRQQ2xpZW50UmVzcG9uc2UiABJUCgxHZXRJZFBDbGllbnQSHi50YWlsb3IudjEuR2V0SWRQQ2xpZW50UmVxdWVzdBofLnRhaWxvci52MS5HZXRJZFBDbGllbnRSZXNwb25zZSIDkAIBEmYKE0NyZWF0ZVN0YXRpY1dlYnNpdGUSJS50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QaJi50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlIgASZgoTVXBkYXRlU3RhdGljV2Vic2l0ZRIlLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVxdWVzdBomLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVzcG9uc2UiABJmChNEZWxldGVTdGF0aWNXZWJzaXRlEiUudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0GiYudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSIAEmAKEEdldFN0YXRpY1dlYnNpdGUSIi50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlc3BvbnNlIgOQAgESZgoSTGlzdFN0YXRpY1dlYnNpdGVzEiQudGFpbG9yLnYxLkxpc3RTdGF0aWNXZWJzaXRlc1JlcXVlc3QaJS50YWlsb3IudjEuTGlzdFN0YXRpY1dlYnNpdGVzUmVzcG9uc2UiA5ACARJdChBDcmVhdGVEZXBsb3ltZW50EiIudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXF1ZXN0GiMudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXNwb25zZSIAEk0KClVwbG9hZEZpbGUSHC50YWlsb3IudjEuVXBsb2FkRmlsZVJlcXVlc3QaHS50YWlsb3IudjEuVXBsb2FkRmlsZVJlc3BvbnNlIgAoARJgChFQdWJsaXNoRGVwbG95bWVudBIjLnRhaWxvci52MS5QdWJsaXNoRGVwbG95bWVudFJlcXVlc3QaJC50YWlsb3IudjEuUHVibGlzaERlcGxveW1lbnRSZXNwb25zZSIAElcKDkNyZWF0ZVdvcmtmbG93EiAudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93UmVxdWVzdBohLnRhaWxvci52MS5DcmVhdGVXb3JrZmxvd1Jlc3BvbnNlIgASVwoOVXBkYXRlV29ya2Zsb3cSIC50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dSZXF1ZXN0GiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtmbG93UmVzcG9uc2UiABJXCg5EZWxldGVXb3JrZmxvdxIgLnRhaWxvci52MS5EZWxldGVXb3JrZmxvd1JlcXVlc3QaIS50YWlsb3IudjEuRGVsZXRlV29ya2Zsb3dSZXNwb25zZSIAElEKC0dldFdvcmtmbG93Eh0udGFpbG9yLnYxLkdldFdvcmtmbG93UmVxdWVzdBoeLnRhaWxvci52MS5HZXRXb3JrZmxvd1Jlc3BvbnNlIgOQAgESYwoRR2V0V29ya2Zsb3dCeU5hbWUSIy50YWlsb3IudjEuR2V0V29ya2Zsb3dCeU5hbWVSZXF1ZXN0GiQudGFpbG9yLnYxLkdldFdvcmtmbG93QnlOYW1lUmVzcG9uc2UiA5ACARJXCg1MaXN0V29ya2Zsb3dzEh8udGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXF1ZXN0GiAudGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb24SKy50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlIgASeAoZVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvbhIrLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVzcG9uc2UiABJyChZHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uEigudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXF1ZXN0GikudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZSIDkAIBEoQBChxHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lEi4udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXF1ZXN0Gi8udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXNwb25zZSIDkAIBEngKGExpc3RXb3JrZmxvd0pvYkZ1bmN0aW9ucxIqLnRhaWxvci52MS5MaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0pvYkZ1bmN0aW9uc1Jlc3BvbnNlIgOQAgESbAoUR2V0V29ya2Zsb3dFeGVjdXRpb24SJi50YWlsb3IudjEuR2V0V29ya2Zsb3dFeGVjdXRpb25SZXF1ZXN0GicudGFpbG9yLnYxLkdldFdvcmtmbG93RXhlY3V0aW9uUmVzcG9uc2UiA5ACARJyChZMaXN0V29ya2Zsb3dFeGVjdXRpb25zEigudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXNwb25zZSIDkAIBEmAKEVRlc3RTdGFydFdvcmtmbG93EiMudGFpbG9yLnYxLlRlc3RTdGFydFdvcmtmbG93UmVxdWVzdBokLnRhaWxvci52MS5UZXN0U3RhcnRXb3JrZmxvd1Jlc3BvbnNlIgASYwoSVGVzdFJlc3VtZVdvcmtmbG93EiQudGFpbG9yLnYxLlRlc3RSZXN1bWVXb3JrZmxvd1JlcXVlc3QaJS50YWlsb3IudjEuVGVzdFJlc3VtZVdvcmtmbG93UmVzcG9uc2UiABJOCgtTZXRNZXRhZGF0YRIdLnRhaWxvci52MS5TZXRNZXRhZGF0YVJlcXVlc3QaHi50YWlsb3IudjEuU2V0TWV0YWRhdGFSZXNwb25zZSIAElEKC0dldE1ldGFkYXRhEh0udGFpbG9yLnYxLkdldE1ldGFkYXRhUmVxdWVzdBoeLnRhaWxvci52MS5HZXRNZXRhZGF0YVJlc3BvbnNlIgOQAgEShAEKHUNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLkNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgAShAEKHVVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLlVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgASfgoaR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXISLC50YWlsb3IudjEuR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiA5ACARKEAQocTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2VycxIuLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVxdWVzdBovLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVzcG9uc2UiA5ACARKEAQodRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXISLy50YWlsb3IudjEuRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0GjAudGFpbG9yLnYxLkRlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiAGIGcHJvdG8z", [
912
949
  file_tailor_v1_application,
913
950
  file_tailor_v1_auth,
914
951
  file_tailor_v1_events,
@@ -936,7 +973,7 @@ const OperatorService = /* @__PURE__ */ serviceDesc(file_tailor_v1_service, 0);
936
973
  let packageJson = null;
937
974
  /**
938
975
  * Read and cache the package.json of the SDK package.
939
- * @returns {Promise<PackageJson>} Parsed package.json contents
976
+ * @returns Parsed package.json contents
940
977
  */
941
978
  async function readPackageJson() {
942
979
  if (packageJson) return packageJson;
@@ -951,7 +988,7 @@ const oauth2ClientId = process.env.PLATFORM_OAUTH2_CLIENT_ID ?? "cpoc_0Iudir72fq
951
988
  const oauth2DiscoveryEndpoint = "/.well-known/oauth-authorization-server/oauth2/platform";
952
989
  /**
953
990
  * Initialize an OAuth2 client for Tailor Platform.
954
- * @returns {OAuth2Client} Configured OAuth2 client
991
+ * @returns Configured OAuth2 client
955
992
  */
956
993
  function initOAuth2Client() {
957
994
  return new OAuth2Client({
@@ -962,8 +999,8 @@ function initOAuth2Client() {
962
999
  }
963
1000
  /**
964
1001
  * Initialize an Operator client with the given access token.
965
- * @param {string} accessToken - Access token for authentication
966
- * @returns {Promise<OperatorClient>} Configured Operator client
1002
+ * @param accessToken - Access token for authentication
1003
+ * @returns Configured Operator client
967
1004
  */
968
1005
  async function initOperatorClient(accessToken) {
969
1006
  return createClient(OperatorService, createConnectTransport({
@@ -979,7 +1016,7 @@ async function initOperatorClient(accessToken) {
979
1016
  }
980
1017
  /**
981
1018
  * Create an interceptor that sets a User-Agent header.
982
- * @returns {Promise<Interceptor>} User-Agent interceptor
1019
+ * @returns User-Agent interceptor
983
1020
  */
984
1021
  async function userAgentInterceptor() {
985
1022
  const ua = await userAgent();
@@ -990,15 +1027,15 @@ async function userAgentInterceptor() {
990
1027
  }
991
1028
  /**
992
1029
  * Build the User-Agent string for CLI requests.
993
- * @returns {Promise<string>} User-Agent header value
1030
+ * @returns User-Agent header value
994
1031
  */
995
1032
  async function userAgent() {
996
1033
  return `tailor-sdk/${(await readPackageJson()).version ?? "unknown"}`;
997
1034
  }
998
1035
  /**
999
1036
  * Create an interceptor that sets the Authorization bearer token.
1000
- * @param {string} accessToken - Access token to use
1001
- * @returns {Promise<Interceptor>} Bearer token interceptor
1037
+ * @param accessToken - Access token to use
1038
+ * @returns Bearer token interceptor
1002
1039
  */
1003
1040
  async function bearerTokenInterceptor(accessToken) {
1004
1041
  return (next) => async (req) => {
@@ -1008,7 +1045,7 @@ async function bearerTokenInterceptor(accessToken) {
1008
1045
  }
1009
1046
  /**
1010
1047
  * Create an interceptor that retries idempotent requests with backoff.
1011
- * @returns {Interceptor} Retry interceptor
1048
+ * @returns Retry interceptor
1012
1049
  */
1013
1050
  function retryInterceptor() {
1014
1051
  return (next) => async (req) => {
@@ -1031,8 +1068,8 @@ function retryInterceptor() {
1031
1068
  }
1032
1069
  /**
1033
1070
  * Wait for an exponential backoff delay with jitter.
1034
- * @param {number} attempt - Current retry attempt number (1-based)
1035
- * @returns {Promise<void>} Promise that resolves after the delay
1071
+ * @param attempt - Current retry attempt number (1-based)
1072
+ * @returns Promise that resolves after the delay
1036
1073
  */
1037
1074
  function waitRetryBackoff(attempt) {
1038
1075
  const backoff = 50 * 2 ** (attempt - 1) * (1 + .1 * (Math.random() * 2 - 1));
@@ -1040,9 +1077,9 @@ function waitRetryBackoff(attempt) {
1040
1077
  }
1041
1078
  /**
1042
1079
  * Determine whether the given error is retriable for the method idempotency.
1043
- * @param {unknown} error - Error thrown by the request
1044
- * @param {MethodOptions_IdempotencyLevel} idempotency - Method idempotency level
1045
- * @returns {boolean} True if the error should be retried
1080
+ * @param error - Error thrown by the request
1081
+ * @param idempotency - Method idempotency level
1082
+ * @returns True if the error should be retried
1046
1083
  */
1047
1084
  function isRetirable(error, idempotency) {
1048
1085
  if (!(error instanceof ConnectError)) return false;
@@ -1054,7 +1091,7 @@ function isRetirable(error, idempotency) {
1054
1091
  }
1055
1092
  /**
1056
1093
  * Create an interceptor that enhances error messages from the Operator API.
1057
- * @returns {Interceptor} Error handling interceptor
1094
+ * @returns Error handling interceptor
1058
1095
  */
1059
1096
  function errorHandlingInterceptor() {
1060
1097
  return (next) => async (req) => {
@@ -1072,8 +1109,8 @@ function errorHandlingInterceptor() {
1072
1109
  }
1073
1110
  /**
1074
1111
  * @internal
1075
- * @param {string} methodName - RPC method name (e.g., "CreateWorkspace")
1076
- * @returns {{ operation: string; resourceType: string }} Parsed operation and resource type
1112
+ * @param methodName - RPC method name (e.g., "CreateWorkspace")
1113
+ * @returns Parsed operation and resource type
1077
1114
  */
1078
1115
  function parseMethodName(methodName) {
1079
1116
  const match = methodName.match(/^(Create|Update|Delete|Set|List|Get)(.+)$/);
@@ -1089,8 +1126,8 @@ function parseMethodName(methodName) {
1089
1126
  }
1090
1127
  /**
1091
1128
  * @internal
1092
- * @param {unknown} message - Request message to format
1093
- * @returns {string} Pretty-printed JSON or error placeholder
1129
+ * @param message - Request message to format
1130
+ * @returns Pretty-printed JSON or error placeholder
1094
1131
  */
1095
1132
  function formatRequestParams(message) {
1096
1133
  try {
@@ -1103,8 +1140,8 @@ function formatRequestParams(message) {
1103
1140
  /**
1104
1141
  * Fetch all paginated resources by repeatedly calling the given function.
1105
1142
  * @template T
1106
- * @param {(pageToken: string) => Promise<[T[], string]>} fn - Page fetcher returning items and next page token
1107
- * @returns {Promise<T[]>} All fetched items
1143
+ * @param fn - Page fetcher returning items and next page token
1144
+ * @returns All fetched items
1108
1145
  */
1109
1146
  async function fetchAll(fn) {
1110
1147
  const items = [];
@@ -1119,8 +1156,8 @@ async function fetchAll(fn) {
1119
1156
  }
1120
1157
  /**
1121
1158
  * Fetch user info from the Tailor Platform userinfo endpoint.
1122
- * @param {string} accessToken - Access token for the current user
1123
- * @returns {Promise<{ email: string }>} Parsed user info
1159
+ * @param accessToken - Access token for the current user
1160
+ * @returns Parsed user info
1124
1161
  */
1125
1162
  async function fetchUserInfo(accessToken) {
1126
1163
  const userInfoUrl = new URL("/auth/platform/userinfo", platformBaseUrl).href;
@@ -1134,11 +1171,11 @@ async function fetchUserInfo(accessToken) {
1134
1171
  }
1135
1172
  /**
1136
1173
  * Resolve "name:url" patterns to actual Static Website URLs.
1137
- * @param {OperatorClient} client - Operator client instance
1138
- * @param {string} workspaceId - Workspace ID
1139
- * @param {string[] | undefined} urls - URLs or name:url patterns
1140
- * @param {string} context - Logging context (e.g., "CORS", "OAuth2 redirect URIs")
1141
- * @returns {Promise<string[]>} Resolved URLs
1174
+ * @param client - Operator client instance
1175
+ * @param workspaceId - Workspace ID
1176
+ * @param urls - URLs or name:url patterns
1177
+ * @param context - Logging context (e.g., "CORS", "OAuth2 redirect URIs")
1178
+ * @returns Resolved URLs
1142
1179
  */
1143
1180
  async function resolveStaticWebsiteUrls(client, workspaceId, urls, context) {
1144
1181
  if (!urls) return [];
@@ -1167,10 +1204,10 @@ async function resolveStaticWebsiteUrls(client, workspaceId, urls, context) {
1167
1204
  }
1168
1205
  /**
1169
1206
  * Fetch an OAuth2 access token for a machine user.
1170
- * @param {string} url - OAuth2 server base URL
1171
- * @param {string} clientId - Client ID for the machine user
1172
- * @param {string} clientSecret - Client secret for the machine user
1173
- * @returns {Promise<string>} Access token
1207
+ * @param url - OAuth2 server base URL
1208
+ * @param clientId - Client ID for the machine user
1209
+ * @param clientSecret - Client secret for the machine user
1210
+ * @returns Access token
1174
1211
  */
1175
1212
  async function fetchMachineUserToken(url, clientId, clientSecret) {
1176
1213
  const tokenEndpoint = new URL("/oauth2/token", url).href;
@@ -1216,7 +1253,7 @@ function platformConfigPath() {
1216
1253
  }
1217
1254
  /**
1218
1255
  * Read Tailor Platform CLI configuration, migrating from tailorctl if necessary.
1219
- * @returns {PfConfig} Parsed platform configuration
1256
+ * @returns Parsed platform configuration
1220
1257
  */
1221
1258
  function readPlatformConfig() {
1222
1259
  const configPath = platformConfigPath();
@@ -1237,8 +1274,7 @@ function readPlatformConfig() {
1237
1274
  }
1238
1275
  /**
1239
1276
  * Write Tailor Platform CLI configuration to disk.
1240
- * @param {PfConfig} config - Platform configuration to write
1241
- * @returns {void}
1277
+ * @param config - Platform configuration to write
1242
1278
  */
1243
1279
  function writePlatformConfig(config) {
1244
1280
  const configPath = platformConfigPath();
@@ -1295,10 +1331,8 @@ function validateUUID(value, source) {
1295
1331
  /**
1296
1332
  * Load workspace ID from command options, environment variables, or platform config.
1297
1333
  * Priority: opts/workspaceId > env/workspaceId > opts/profile > env/profile > error
1298
- * @param {{ workspaceId?: string; profile?: string }} [opts] - Workspace and profile options
1299
- * @param {string} [opts.workspaceId] - Workspace ID
1300
- * @param {string} [opts.profile] - Workspace profile name
1301
- * @returns {string} Resolved workspace ID
1334
+ * @param opts - Workspace and profile options
1335
+ * @returns Resolved workspace ID
1302
1336
  */
1303
1337
  function loadWorkspaceId(opts) {
1304
1338
  if (opts?.workspaceId) return validateUUID(opts.workspaceId, "--workspace-id option");
@@ -1317,10 +1351,8 @@ function loadWorkspaceId(opts) {
1317
1351
  /**
1318
1352
  * Load access token from command options, environment variables, or platform config.
1319
1353
  * Priority: env/TAILOR_PLATFORM_TOKEN > env/TAILOR_TOKEN (deprecated) > opts/profile > env/profile > config/currentUser > error
1320
- * @param {{ useProfile?: boolean; profile?: string }} [opts] - Profile options
1321
- * @param {boolean} [opts.useProfile] - Whether to use profile resolution
1322
- * @param {string} [opts.profile] - Profile name
1323
- * @returns {Promise<string>} Resolved access token
1354
+ * @param opts - Profile options
1355
+ * @returns Resolved access token
1324
1356
  */
1325
1357
  async function loadAccessToken(opts) {
1326
1358
  if (process.env.TAILOR_PLATFORM_TOKEN) return process.env.TAILOR_PLATFORM_TOKEN;
@@ -1347,9 +1379,9 @@ async function loadAccessToken(opts) {
1347
1379
  }
1348
1380
  /**
1349
1381
  * Fetch the latest access token, refreshing if necessary.
1350
- * @param {PfConfig} config - Platform config
1351
- * @param {string} user - User name
1352
- * @returns {Promise<string>} Latest access token
1382
+ * @param config - Platform config
1383
+ * @param user - User name
1384
+ * @returns Latest access token
1353
1385
  */
1354
1386
  async function fetchLatestToken(config, user) {
1355
1387
  const tokens = config.users[user];
@@ -1384,8 +1416,8 @@ const DEFAULT_CONFIG_FILENAME = "tailor.config.ts";
1384
1416
  /**
1385
1417
  * Load config path from command options or environment variables.
1386
1418
  * Priority: opts/config > env/config > search parent directories
1387
- * @param {string} [configPath] - Optional explicit config path
1388
- * @returns {string | undefined} Resolved config path or undefined
1419
+ * @param configPath - Optional explicit config path
1420
+ * @returns Resolved config path or undefined
1389
1421
  */
1390
1422
  function loadConfigPath(configPath) {
1391
1423
  if (configPath) return configPath;
@@ -1395,8 +1427,8 @@ function loadConfigPath(configPath) {
1395
1427
  /**
1396
1428
  * Load organization ID from command options or environment variables.
1397
1429
  * Priority: opts/organizationId > env/organizationId > undefined (optional)
1398
- * @param {string} [organizationId] - Organization ID override
1399
- * @returns {string | undefined} Resolved organization ID or undefined
1430
+ * @param organizationId - Organization ID override
1431
+ * @returns Resolved organization ID or undefined
1400
1432
  */
1401
1433
  function loadOrganizationId(organizationId) {
1402
1434
  if (organizationId) return validateUUID(organizationId, "--organization-id option");
@@ -1405,8 +1437,8 @@ function loadOrganizationId(organizationId) {
1405
1437
  /**
1406
1438
  * Load folder ID from command options or environment variables.
1407
1439
  * Priority: opts/folderId > env/folderId > undefined (optional)
1408
- * @param {string} [folderId] - Folder ID override
1409
- * @returns {string | undefined} Resolved folder ID or undefined
1440
+ * @param folderId - Folder ID override
1441
+ * @returns Resolved folder ID or undefined
1410
1442
  */
1411
1443
  function loadFolderId(folderId) {
1412
1444
  if (folderId) return validateUUID(folderId, "--folder-id option");
@@ -1418,8 +1450,8 @@ function loadFolderId(folderId) {
1418
1450
  /**
1419
1451
  * Call Tailor Platform API endpoints directly.
1420
1452
  * If the endpoint doesn't contain "/", it defaults to `tailor.v1.OperatorService/{endpoint}`.
1421
- * @param {ApiCallOptions} options - API call options (profile, endpoint, body)
1422
- * @returns {Promise<ApiCallResult>} Response status and data
1453
+ * @param options - API call options (profile, endpoint, body)
1454
+ * @returns Response status and data
1423
1455
  */
1424
1456
  async function apiCall(options) {
1425
1457
  const accessToken = await loadAccessToken({
@@ -1647,7 +1679,8 @@ const AuthConfigSchema = z.object({
1647
1679
  oauth2Clients: z.record(z.string(), OAuth2ClientSchema).optional(),
1648
1680
  idProvider: IdProviderSchema.optional(),
1649
1681
  scim: SCIMSchema.optional(),
1650
- tenantProvider: TenantProviderSchema.optional()
1682
+ tenantProvider: TenantProviderSchema.optional(),
1683
+ publishSessionEvents: z.boolean().optional()
1651
1684
  }).brand("AuthConfig");
1652
1685
 
1653
1686
  //#endregion
@@ -1715,8 +1748,8 @@ const DEFAULT_IGNORE_PATTERNS = ["**/*.test.ts", "**/*.spec.ts"];
1715
1748
  /**
1716
1749
  * Load files matching the given patterns, excluding files that match ignore patterns.
1717
1750
  * By default, test files (*.test.ts, *.spec.ts) are excluded unless ignores is explicitly specified.
1718
- * @param {FileLoadConfig} config - Configuration with files patterns and optional ignores patterns
1719
- * @returns {string[]} Array of absolute file paths
1751
+ * @param config - Configuration with files patterns and optional ignores patterns
1752
+ * @returns Array of absolute file paths
1720
1753
  */
1721
1754
  function loadFilesWithIgnores(config) {
1722
1755
  const ignorePatterns = config.ignores ?? DEFAULT_IGNORE_PATTERNS;
@@ -1950,8 +1983,8 @@ const tailorUserMap = `{ id: user.id, type: user.type, workspaceId: user.workspa
1950
1983
  * Convert a function to a string representation.
1951
1984
  * Handles method shorthand syntax (e.g., `create() { ... }`) by converting it to
1952
1985
  * a function expression (e.g., `function create() { ... }`).
1953
- * @param {(...args: unknown[]) => unknown} fn - Function to stringify
1954
- * @returns {string} Stringified function source
1986
+ * @param fn - Function to stringify
1987
+ * @returns Stringified function source
1955
1988
  */
1956
1989
  const stringifyFunction = (fn) => {
1957
1990
  const src = fn.toString().trim();
@@ -1960,8 +1993,8 @@ const stringifyFunction = (fn) => {
1960
1993
  };
1961
1994
  /**
1962
1995
  * Convert a hook function to a script expression.
1963
- * @param {NonNullable<Hook<unknown, unknown>["create"] | Hook<unknown, unknown>["update"]>} fn - Hook function
1964
- * @returns {string} JavaScript expression calling the hook
1996
+ * @param fn - Hook function
1997
+ * @returns JavaScript expression calling the hook
1965
1998
  */
1966
1999
  const convertHookToExpr = (fn) => {
1967
2000
  return `(${stringifyFunction(fn)})({ value: _value, data: _data, user: ${tailorUserMap} })`;
@@ -1969,8 +2002,8 @@ const convertHookToExpr = (fn) => {
1969
2002
  /**
1970
2003
  * Parse TailorDBField into OperatorFieldConfig.
1971
2004
  * This transforms user-defined functions into script expressions.
1972
- * @param {TailorAnyDBField} field - TailorDB field definition
1973
- * @returns {OperatorFieldConfig} Parsed operator field configuration
2005
+ * @param field - TailorDB field definition
2006
+ * @returns Parsed operator field configuration
1974
2007
  */
1975
2008
  function parseFieldConfig(field) {
1976
2009
  const metadata = field.metadata;
@@ -2042,8 +2075,8 @@ function isSingleArrayConditionFormat(cond) {
2042
2075
  * Normalize record-level permissions into a standard structure.
2043
2076
  * @template User
2044
2077
  * @template Type
2045
- * @param {TailorTypePermission<User, Type>} permission - Tailor type permission
2046
- * @returns {StandardTailorTypePermission} Normalized record permissions
2078
+ * @param permission - Tailor type permission
2079
+ * @returns Normalized record permissions
2047
2080
  */
2048
2081
  function normalizePermission(permission) {
2049
2082
  return Object.keys(permission).reduce((acc, action) => {
@@ -2053,8 +2086,8 @@ function normalizePermission(permission) {
2053
2086
  }
2054
2087
  /**
2055
2088
  * Normalize GraphQL permissions into a standard structure.
2056
- * @param {TailorTypeGqlPermission<unknown, unknown>} permission - Tailor GQL permission
2057
- * @returns {StandardTailorTypeGqlPermission} Normalized GQL permissions
2089
+ * @param permission - Tailor GQL permission
2090
+ * @returns Normalized GQL permissions
2058
2091
  */
2059
2092
  function normalizeGqlPermission(permission) {
2060
2093
  return permission.map((policy) => normalizeGqlPolicy(policy));
@@ -2070,8 +2103,8 @@ function normalizeGqlPolicy(policy) {
2070
2103
  /**
2071
2104
  * Parse raw permissions into normalized permissions.
2072
2105
  * This is the main entry point for permission parsing in the parser layer.
2073
- * @param {RawPermissions} rawPermissions - Raw permissions definition
2074
- * @returns {Permissions} Normalized permissions
2106
+ * @param rawPermissions - Raw permissions definition
2107
+ * @returns Normalized permissions
2075
2108
  */
2076
2109
  function parsePermissions(rawPermissions) {
2077
2110
  return {
@@ -2081,8 +2114,8 @@ function parsePermissions(rawPermissions) {
2081
2114
  }
2082
2115
  /**
2083
2116
  * Normalize a single action permission into the standard format.
2084
- * @param {unknown} permission - Raw permission definition
2085
- * @returns {StandardActionPermission} Normalized action permission
2117
+ * @param permission - Raw permission definition
2118
+ * @returns Normalized action permission
2086
2119
  */
2087
2120
  function normalizeActionPermission(permission) {
2088
2121
  if (isObjectFormat(permission)) {
@@ -2136,8 +2169,8 @@ function fieldRef(context) {
2136
2169
  }
2137
2170
  /**
2138
2171
  * Validate relation configuration.
2139
- * @param {RawRelationConfig} rawRelation - Raw relation configuration from TailorDB type definition
2140
- * @param {RelationProcessingContext} context - Context information for the relation (type name, field name, all type names)
2172
+ * @param rawRelation - Raw relation configuration from TailorDB type definition
2173
+ * @param context - Context information for the relation (type name, field name, all type names)
2141
2174
  */
2142
2175
  function validateRelationConfig(rawRelation, context) {
2143
2176
  if (!rawRelation.type) throw new Error(`${fieldRef(context)} has a relation but is missing the required 'type' property. Valid values: ${Object.keys(relationTypes).join(", ")}.`);
@@ -2146,10 +2179,10 @@ function validateRelationConfig(rawRelation, context) {
2146
2179
  }
2147
2180
  /**
2148
2181
  * Process raw relation config and compute derived metadata values.
2149
- * @param {RawRelationConfig} rawRelation - Raw relation configuration
2150
- * @param {RelationProcessingContext} context - Context information for the relation
2151
- * @param {boolean} [isArrayField=false] - Whether the target field is an array field
2152
- * @returns {ProcessedRelationMetadata} Computed relation metadata to apply to field config
2182
+ * @param rawRelation - Raw relation configuration
2183
+ * @param context - Context information for the relation
2184
+ * @param isArrayField - Whether the target field is an array field
2185
+ * @returns Computed relation metadata to apply to field config
2153
2186
  */
2154
2187
  function processRelationMetadata(rawRelation, context, isArrayField = false) {
2155
2188
  const isUnique = relationTypes[rawRelation.type] === "1-1";
@@ -2169,9 +2202,9 @@ function processRelationMetadata(rawRelation, context, isArrayField = false) {
2169
2202
  /**
2170
2203
  * Build relation info for creating forward/backward relationships.
2171
2204
  * Returns undefined for keyOnly relations.
2172
- * @param {RawRelationConfig} rawRelation - Raw relation configuration
2173
- * @param {RelationProcessingContext} context - Context information for the relation
2174
- * @returns {RelationInfo | undefined} Relation information or undefined for keyOnly relations
2205
+ * @param rawRelation - Raw relation configuration
2206
+ * @param context - Context information for the relation
2207
+ * @returns Relation information or undefined for keyOnly relations
2175
2208
  */
2176
2209
  function buildRelationInfo(rawRelation, context) {
2177
2210
  if (rawRelation.type === "keyOnly") return;
@@ -2191,9 +2224,9 @@ function buildRelationInfo(rawRelation, context) {
2191
2224
  }
2192
2225
  /**
2193
2226
  * Apply processed relation metadata to field config.
2194
- * @param {OperatorFieldConfig} fieldConfig - Original operator field configuration
2195
- * @param {ProcessedRelationMetadata} metadata - Processed relation metadata to apply
2196
- * @returns {OperatorFieldConfig} Field config with relation metadata applied
2227
+ * @param fieldConfig - Original operator field configuration
2228
+ * @param metadata - Processed relation metadata to apply
2229
+ * @returns Field config with relation metadata applied
2197
2230
  */
2198
2231
  function applyRelationMetadataToFieldConfig(fieldConfig, metadata) {
2199
2232
  return {
@@ -70328,7 +70361,7 @@ var require_schema_obj = /* @__PURE__ */ __commonJSMin(((exports, module) => {
70328
70361
  }));
70329
70362
 
70330
70363
  //#endregion
70331
- //#region ../../node_modules/json-schema-traverse/index.js
70364
+ //#region ../../node_modules/ajv/node_modules/json-schema-traverse/index.js
70332
70365
  var require_json_schema_traverse = /* @__PURE__ */ __commonJSMin(((exports, module) => {
70333
70366
  var traverse = module.exports = function(schema, opts, cb) {
70334
70367
  if (typeof opts == "function") {
@@ -88273,7 +88306,7 @@ var require_eslint_helpers = /* @__PURE__ */ __commonJSMin(((exports, module) =>
88273
88306
  */
88274
88307
  async function globMatch({ basePath, pattern }) {
88275
88308
  let found = false;
88276
- const { hfs } = await import("./src-BhwQdist.mjs");
88309
+ const { hfs } = await import("./src-Bhwd-tei.mjs");
88277
88310
  const matcher = new Minimatch(normalizeToPosix(path$9.relative(basePath, pattern)), MINIMATCH_OPTIONS);
88278
88311
  const walkSettings = {
88279
88312
  directoryFilter(entry) {
@@ -88320,7 +88353,7 @@ var require_eslint_helpers = /* @__PURE__ */ __commonJSMin(((exports, module) =>
88320
88353
  return new Minimatch(patternToUse, MINIMATCH_OPTIONS);
88321
88354
  });
88322
88355
  const unmatchedPatterns = new Set([...relativeToPatterns.keys()]);
88323
- const { hfs } = await import("./src-BhwQdist.mjs");
88356
+ const { hfs } = await import("./src-Bhwd-tei.mjs");
88324
88357
  const walk = hfs.walk(basePath, {
88325
88358
  async directoryFilter(entry) {
88326
88359
  if (!matchers.some((matcher) => matcher.match(entry.path, true))) return false;
@@ -98977,9 +99010,8 @@ const eslintConfig = {
98977
99010
  };
98978
99011
  /**
98979
99012
  * Ensure that a TailorDB script expression does not reference external variables.
98980
- * @param {string} expr - JavaScript expression to validate
98981
- * @param {ScriptContext} ctx - Script context (type, field, kind)
98982
- * @returns {void}
99013
+ * @param expr - JavaScript expression to validate
99014
+ * @param ctx - Script context (type, field, kind)
98983
99015
  */
98984
99016
  function ensureNoExternalVariablesInScript(expr, ctx) {
98985
99017
  if (!expr.trim()) return;
@@ -99001,10 +99033,9 @@ function ensureNoExternalVariablesInScript(expr, ctx) {
99001
99033
  }
99002
99034
  /**
99003
99035
  * Ensure that TailorDB field scripts do not capture external variables.
99004
- * @param {string} typeName - TailorDB type name
99005
- * @param {string} fieldName - Field name
99006
- * @param {TailorDBFieldConfig} fieldConfig - Parsed field configuration
99007
- * @returns {void}
99036
+ * @param typeName - TailorDB type name
99037
+ * @param fieldName - Field name
99038
+ * @param fieldConfig - Parsed field configuration
99008
99039
  */
99009
99040
  function ensureNoExternalVariablesInFieldScripts(typeName, fieldName, fieldConfig) {
99010
99041
  for (const validateConfig of fieldConfig.validate ?? []) {
@@ -99032,10 +99063,10 @@ function ensureNoExternalVariablesInFieldScripts(typeName, fieldName, fieldConfi
99032
99063
  /**
99033
99064
  * Parse multiple TailorDB types, build relationships, and validate uniqueness.
99034
99065
  * This is the main entry point for parsing TailorDB types.
99035
- * @param {Record<string, TailorDBType>} rawTypes - Raw TailorDB types keyed by name
99036
- * @param {string} namespace - TailorDB namespace name
99037
- * @param {TypeSourceInfo} [typeSourceInfo] - Optional type source information
99038
- * @returns {Record<string, ParsedTailorDBType>} Parsed types
99066
+ * @param rawTypes - Raw TailorDB types keyed by name
99067
+ * @param namespace - TailorDB namespace name
99068
+ * @param typeSourceInfo - Optional type source information
99069
+ * @returns Parsed types
99039
99070
  */
99040
99071
  function parseTypes(rawTypes, namespace, typeSourceInfo) {
99041
99072
  const types$2 = {};
@@ -99047,10 +99078,10 @@ function parseTypes(rawTypes, namespace, typeSourceInfo) {
99047
99078
  }
99048
99079
  /**
99049
99080
  * Parse a TailorDBType into a ParsedTailorDBType.
99050
- * @param {TailorDBType} type - TailorDB type to parse
99051
- * @param {Set<string>} allTypeNames - Set of all TailorDB type names
99052
- * @param {Record<string, TailorDBType>} rawTypes - All raw TailorDB types keyed by name
99053
- * @returns {ParsedTailorDBType} Parsed TailorDB type
99081
+ * @param type - TailorDB type to parse
99082
+ * @param allTypeNames - Set of all TailorDB type names
99083
+ * @param rawTypes - All raw TailorDB types keyed by name
99084
+ * @returns Parsed TailorDB type
99054
99085
  */
99055
99086
  function parseTailorDBType(type, allTypeNames, rawTypes) {
99056
99087
  const metadata = type.metadata;
@@ -99108,10 +99139,9 @@ function parseTailorDBType(type, allTypeNames, rawTypes) {
99108
99139
  /**
99109
99140
  * Build backward relationships between parsed types.
99110
99141
  * Also validates that backward relation names are unique within each type.
99111
- * @param {Record<string, ParsedTailorDBType>} types - Parsed types
99112
- * @param {string} namespace - TailorDB namespace name
99113
- * @param {TypeSourceInfo} [typeSourceInfo] - Optional type source information
99114
- * @returns {void}
99142
+ * @param types - Parsed types
99143
+ * @param namespace - TailorDB namespace name
99144
+ * @param typeSourceInfo - Optional type source information
99115
99145
  */
99116
99146
  function buildBackwardRelationships(types$2, namespace, typeSourceInfo) {
99117
99147
  const backwardNameSources = {};
@@ -99171,10 +99201,9 @@ function buildBackwardRelationships(types$2, namespace, typeSourceInfo) {
99171
99201
  * Checks for:
99172
99202
  * 1. Each type's singular query name != plural query name
99173
99203
  * 2. No duplicate query names across all types
99174
- * @param {Record<string, ParsedTailorDBType>} types - Parsed types
99175
- * @param {string} namespace - TailorDB namespace name
99176
- * @param {TypeSourceInfo} [typeSourceInfo] - Optional type source information
99177
- * @returns {void}
99204
+ * @param types - Parsed types
99205
+ * @param namespace - TailorDB namespace name
99206
+ * @param typeSourceInfo - Optional type source information
99178
99207
  */
99179
99208
  function validatePluralFormUniqueness(types$2, namespace, typeSourceInfo) {
99180
99209
  const errors = [];
@@ -99432,8 +99461,8 @@ var Application = class {
99432
99461
  };
99433
99462
  /**
99434
99463
  * Define a Tailor application from the given configuration.
99435
- * @param {AppConfig} config - Application configuration object
99436
- * @returns {Application} Configured application instance
99464
+ * @param config - Application configuration object
99465
+ * @returns Configured application instance
99437
99466
  */
99438
99467
  function defineApplication(config) {
99439
99468
  const app = new Application(config.name, config);
@@ -99464,8 +99493,8 @@ const WorkflowSchema = z.object({
99464
99493
  /**
99465
99494
  * Load workflow files and collect all jobs in a single pass.
99466
99495
  * Dependencies are detected at bundle time via AST analysis.
99467
- * @param {WorkflowServiceConfig} config - Workflow service configuration
99468
- * @returns {Promise<WorkflowLoadResult>} Loaded workflows and collected jobs
99496
+ * @param config - Workflow service configuration
99497
+ * @returns Loaded workflows and collected jobs
99469
99498
  */
99470
99499
  async function loadAndCollectJobs(config) {
99471
99500
  const workflows = {};
@@ -99512,7 +99541,7 @@ async function loadAndCollectJobs(config) {
99512
99541
  }
99513
99542
  /**
99514
99543
  * Print workflow loading logs.
99515
- * @param {WorkflowLoadResult} result - Workflow load result to print
99544
+ * @param result - Workflow load result to print
99516
99545
  */
99517
99546
  function printLoadedWorkflows(result) {
99518
99547
  if (result.fileCount === 0) return;
@@ -99525,8 +99554,8 @@ function printLoadedWorkflows(result) {
99525
99554
  }
99526
99555
  /**
99527
99556
  * Load a single file and extract jobs and workflow
99528
- * @param {string} filePath - Path to the workflow file
99529
- * @returns {Promise<{ jobs: Array<{ name: string; exportName: string; sourceFile: string }>; workflow: Workflow | null }>} Extracted jobs and workflow
99557
+ * @param filePath - Path to the workflow file
99558
+ * @returns Extracted jobs and workflow
99530
99559
  */
99531
99560
  async function loadFileContent(filePath) {
99532
99561
  const jobs = [];
@@ -99561,8 +99590,8 @@ async function loadFileContent(filePath) {
99561
99590
  }
99562
99591
  /**
99563
99592
  * Check if a value is a WorkflowJob by looking for the brand symbol
99564
- * @param {unknown} value - Value to check
99565
- * @returns {boolean} True if the value is a branded WorkflowJob
99593
+ * @param value - Value to check
99594
+ * @returns True if the value is a branded WorkflowJob
99566
99595
  */
99567
99596
  function isWorkflowJob(value) {
99568
99597
  return value != null && typeof value === "object" && WORKFLOW_JOB_BRAND in value && value[WORKFLOW_JOB_BRAND] === true;
@@ -99576,16 +99605,16 @@ const enableInlineSourcemap = process.env.TAILOR_ENABLE_INLINE_SOURCEMAP === "tr
99576
99605
  //#region src/cli/bundler/workflow/ast-utils.ts
99577
99606
  /**
99578
99607
  * Check if a module source is from the Tailor SDK package (including subpaths)
99579
- * @param {string} source - Module source string
99580
- * @returns {boolean} True if the source is from the Tailor SDK package
99608
+ * @param source - Module source string
99609
+ * @returns True if the source is from the Tailor SDK package
99581
99610
  */
99582
99611
  function isTailorSdkSource(source) {
99583
99612
  return /^@tailor-platform\/sdk(\/|$)/.test(source);
99584
99613
  }
99585
99614
  /**
99586
99615
  * Get the source string from a dynamic import or require call
99587
- * @param {Expression | null | undefined} node - AST node to inspect
99588
- * @returns {string | null} Resolved import/require source string or null
99616
+ * @param node - AST node to inspect
99617
+ * @returns Resolved import/require source string or null
99589
99618
  */
99590
99619
  function getImportSource(node) {
99591
99620
  if (!node) return null;
@@ -99604,8 +99633,8 @@ function getImportSource(node) {
99604
99633
  }
99605
99634
  /**
99606
99635
  * Unwrap AwaitExpression to get the inner expression
99607
- * @param {Expression | null | undefined} node - AST expression node
99608
- * @returns {Expression | null | undefined} Inner expression if node is an AwaitExpression
99636
+ * @param node - AST expression node
99637
+ * @returns Inner expression if node is an AwaitExpression
99609
99638
  */
99610
99639
  function unwrapAwait(node) {
99611
99640
  if (node?.type === "AwaitExpression") return node.argument;
@@ -99613,25 +99642,25 @@ function unwrapAwait(node) {
99613
99642
  }
99614
99643
  /**
99615
99644
  * Check if a node is a string literal
99616
- * @param {Expression | null | undefined} node - AST expression node
99617
- * @returns {node is Expression & { type: "Literal"; value: string }} True if node is a string literal
99645
+ * @param node - AST expression node
99646
+ * @returns True if node is a string literal
99618
99647
  */
99619
99648
  function isStringLiteral(node) {
99620
99649
  return node?.type === "Literal" && typeof node.value === "string";
99621
99650
  }
99622
99651
  /**
99623
99652
  * Check if a node is a function expression (arrow or regular)
99624
- * @param {Expression | null | undefined} node - AST expression node
99625
- * @returns {node is ArrowFunctionExpression | FunctionExpression} True if node is a function expression
99653
+ * @param node - AST expression node
99654
+ * @returns True if node is a function expression
99626
99655
  */
99627
99656
  function isFunctionExpression(node) {
99628
99657
  return node?.type === "ArrowFunctionExpression" || node?.type === "FunctionExpression";
99629
99658
  }
99630
99659
  /**
99631
99660
  * Find a property in an object expression
99632
- * @param {ObjectPropertyKind[]} properties - Object properties to search
99633
- * @param {string} name - Property name to find
99634
- * @returns {FoundProperty | null} Found property info or null
99661
+ * @param properties - Object properties to search
99662
+ * @param name - Property name to find
99663
+ * @returns Found property info or null
99635
99664
  */
99636
99665
  function findProperty(properties, name$1) {
99637
99666
  for (const prop of properties) if (prop.type === "Property") {
@@ -99648,9 +99677,9 @@ function findProperty(properties, name$1) {
99648
99677
  /**
99649
99678
  * Apply string replacements to source code
99650
99679
  * Replacements are applied from end to start to maintain positions
99651
- * @param {string} source - Original source code
99652
- * @param {Replacement[]} replacements - Replacements to apply
99653
- * @returns {string} Transformed source code
99680
+ * @param source - Original source code
99681
+ * @param replacements - Replacements to apply
99682
+ * @returns Transformed source code
99654
99683
  */
99655
99684
  function applyReplacements(source, replacements) {
99656
99685
  const sorted = [...replacements].sort((a, b) => b.start - a.start);
@@ -99660,9 +99689,9 @@ function applyReplacements(source, replacements) {
99660
99689
  }
99661
99690
  /**
99662
99691
  * Find the end of a statement including any trailing newline
99663
- * @param {string} source - Source code
99664
- * @param {number} position - Start position of the statement
99665
- * @returns {number} Index of the end of the statement including trailing newline
99692
+ * @param source - Source code
99693
+ * @param position - Start position of the statement
99694
+ * @returns Index of the end of the statement including trailing newline
99666
99695
  */
99667
99696
  function findStatementEnd(source, position) {
99668
99697
  let i$1 = position;
@@ -99673,9 +99702,9 @@ function findStatementEnd(source, position) {
99673
99702
  /**
99674
99703
  * Resolve a relative path from a base directory
99675
99704
  * Simple implementation that handles ./ and ../ prefixes
99676
- * @param {string} baseDir - Base directory
99677
- * @param {string} relativePath - Relative path to resolve
99678
- * @returns {string} Resolved absolute path
99705
+ * @param baseDir - Base directory
99706
+ * @param relativePath - Relative path to resolve
99707
+ * @returns Resolved absolute path
99679
99708
  */
99680
99709
  function resolvePath(baseDir, relativePath) {
99681
99710
  const parts = relativePath.replace(/\\/g, "/").split("/");
@@ -99690,9 +99719,9 @@ function resolvePath(baseDir, relativePath) {
99690
99719
  /**
99691
99720
  * Collect all import bindings for a specific function from the Tailor SDK package
99692
99721
  * Returns a Set of local names that refer to the function
99693
- * @param {Program} program - Parsed TypeScript program
99694
- * @param {string} functionName - Function name to collect bindings for
99695
- * @returns {Set<string>} Set of local names bound to the SDK function
99722
+ * @param program - Parsed TypeScript program
99723
+ * @param functionName - Function name to collect bindings for
99724
+ * @returns Set of local names bound to the SDK function
99696
99725
  */
99697
99726
  function collectSdkBindings(program, functionName) {
99698
99727
  const bindings = /* @__PURE__ */ new Set();
@@ -99745,10 +99774,10 @@ function collectSdkBindings(program, functionName) {
99745
99774
  }
99746
99775
  /**
99747
99776
  * Check if a CallExpression is a call to a specific SDK function
99748
- * @param {ASTNode} node - AST node to inspect
99749
- * @param {Set<string>} bindings - Collected SDK bindings
99750
- * @param {string} functionName - SDK function name
99751
- * @returns {node is ASTNode & { type: "CallExpression" }} True if node is a call to the SDK function
99777
+ * @param node - AST node to inspect
99778
+ * @param bindings - Collected SDK bindings
99779
+ * @param functionName - SDK function name
99780
+ * @returns True if node is a call to the SDK function
99752
99781
  */
99753
99782
  function isSdkFunctionCall(node, bindings, functionName) {
99754
99783
  if (node.type !== "CallExpression") return false;
@@ -99771,10 +99800,10 @@ function isSdkFunctionCall(node, bindings, functionName) {
99771
99800
  //#endregion
99772
99801
  //#region src/cli/bundler/workflow/job-detector.ts
99773
99802
  /**
99774
- * Find all workflow jobs by detecting createWorkflowJob calls from \@tailor-platform/sdk
99775
- * @param {Program} program - Parsed TypeScript program
99776
- * @param {string} _sourceText - Source code text (currently unused)
99777
- * @returns {JobLocation[]} Detected job locations
99803
+ * Find all workflow jobs by detecting createWorkflowJob calls from @tailor-platform/sdk
99804
+ * @param program - Parsed TypeScript program
99805
+ * @param _sourceText - Source code text (currently unused)
99806
+ * @returns Detected job locations
99778
99807
  */
99779
99808
  function findAllJobs(program, _sourceText) {
99780
99809
  const jobs = [];
@@ -99829,8 +99858,8 @@ function findAllJobs(program, _sourceText) {
99829
99858
  }
99830
99859
  /**
99831
99860
  * Build a map from export name to job name from detected jobs
99832
- * @param {JobLocation[]} jobs - Detected job locations
99833
- * @returns {Map<string, string>} Map from export name to job name
99861
+ * @param jobs - Detected job locations
99862
+ * @returns Map from export name to job name
99834
99863
  */
99835
99864
  function buildJobNameMap(jobs) {
99836
99865
  const map = /* @__PURE__ */ new Map();
@@ -99840,9 +99869,9 @@ function buildJobNameMap(jobs) {
99840
99869
  /**
99841
99870
  * Detect all .trigger() calls in the source code
99842
99871
  * Returns information about each trigger call for transformation
99843
- * @param {Program} program - Parsed TypeScript program
99844
- * @param {string} sourceText - Source code text
99845
- * @returns {TriggerCall[]} Detected trigger calls
99872
+ * @param program - Parsed TypeScript program
99873
+ * @param sourceText - Source code text
99874
+ * @returns Detected trigger calls
99846
99875
  */
99847
99876
  function detectTriggerCalls(program, sourceText) {
99848
99877
  const calls = [];
@@ -99894,10 +99923,10 @@ function detectTriggerCalls(program, sourceText) {
99894
99923
  //#endregion
99895
99924
  //#region src/cli/bundler/workflow/workflow-detector.ts
99896
99925
  /**
99897
- * Find all workflows by detecting createWorkflow calls from \@tailor-platform/sdk
99898
- * @param {Program} program - Parsed TypeScript program
99899
- * @param {string} _sourceText - Source code text (currently unused)
99900
- * @returns {WorkflowLocation[]} Detected workflows
99926
+ * Find all workflows by detecting createWorkflow calls from @tailor-platform/sdk
99927
+ * @param program - Parsed TypeScript program
99928
+ * @param _sourceText - Source code text (currently unused)
99929
+ * @returns Detected workflows
99901
99930
  */
99902
99931
  function findAllWorkflows(program, _sourceText) {
99903
99932
  const workflows = [];
@@ -99943,8 +99972,8 @@ function findAllWorkflows(program, _sourceText) {
99943
99972
  }
99944
99973
  /**
99945
99974
  * Build a map from export name to workflow name from detected workflows
99946
- * @param {WorkflowLocation[]} workflows - Detected workflows
99947
- * @returns {Map<string, string>} Map from export name to workflow name
99975
+ * @param workflows - Detected workflows
99976
+ * @returns Map from export name to workflow name
99948
99977
  */
99949
99978
  function buildWorkflowNameMap(workflows) {
99950
99979
  const map = /* @__PURE__ */ new Map();
@@ -99953,8 +99982,8 @@ function buildWorkflowNameMap(workflows) {
99953
99982
  }
99954
99983
  /**
99955
99984
  * Detect default imports in a source file and return a map from local name to import source
99956
- * @param {Program} program - Parsed TypeScript program
99957
- * @returns {Map<string, string>} Map from local name to import source
99985
+ * @param program - Parsed TypeScript program
99986
+ * @returns Map from local name to import source
99958
99987
  */
99959
99988
  function detectDefaultImports(program) {
99960
99989
  const imports = /* @__PURE__ */ new Map();
@@ -99985,9 +100014,9 @@ function detectDefaultImports(program) {
99985
100014
  /**
99986
100015
  * Extract authInvoker info from a config object expression
99987
100016
  * Returns the authInvoker value text and whether it's a shorthand property
99988
- * @param {unknown} configArg - Config argument node
99989
- * @param {string} sourceText - Source code text
99990
- * @returns {AuthInvokerInfo | undefined} Extracted authInvoker info, if any
100017
+ * @param configArg - Config argument node
100018
+ * @param sourceText - Source code text
100019
+ * @returns Extracted authInvoker info, if any
99991
100020
  */
99992
100021
  function extractAuthInvokerInfo(configArg, sourceText) {
99993
100022
  if (!configArg || typeof configArg !== "object") return void 0;
@@ -100011,11 +100040,11 @@ function extractAuthInvokerInfo(configArg, sourceText) {
100011
100040
  /**
100012
100041
  * Detect .trigger() calls for known workflows and jobs
100013
100042
  * Only detects calls where the identifier is in workflowNames or jobNames
100014
- * @param {Program} program - The parsed AST program
100015
- * @param {string} sourceText - The source code text
100016
- * @param {Set<string>} workflowNames - Set of known workflow identifier names
100017
- * @param {Set<string>} jobNames - Set of known job identifier names
100018
- * @returns {ExtendedTriggerCall[]} Detected trigger call metadata
100043
+ * @param program - The parsed AST program
100044
+ * @param sourceText - The source code text
100045
+ * @param workflowNames - Set of known workflow identifier names
100046
+ * @param jobNames - Set of known job identifier names
100047
+ * @returns Detected trigger call metadata
100019
100048
  */
100020
100049
  function detectExtendedTriggerCalls(program, sourceText, workflowNames, jobNames) {
100021
100050
  const calls = [];
@@ -100082,12 +100111,12 @@ function detectExtendedTriggerCalls(program, sourceText, workflowNames, jobNames
100082
100111
  /**
100083
100112
  * Transform trigger calls for resolver/executor/workflow functions
100084
100113
  * Handles both job.trigger() and workflow.trigger() calls
100085
- * @param {string} source - The source code to transform
100086
- * @param {Map<string, string>} workflowNameMap - Map from variable name to workflow name
100087
- * @param {Map<string, string>} jobNameMap - Map from variable name to job name
100088
- * @param {Map<string, string>} [workflowFileMap] - Map from file path (without extension) to workflow name for default exports
100089
- * @param {string} [currentFilePath] - Path of the current file being transformed (for resolving relative imports)
100090
- * @returns {string} Transformed source code with trigger calls rewritten
100114
+ * @param source - The source code to transform
100115
+ * @param workflowNameMap - Map from variable name to workflow name
100116
+ * @param jobNameMap - Map from variable name to job name
100117
+ * @param workflowFileMap - Map from file path (without extension) to workflow name for default exports
100118
+ * @param currentFilePath - Path of the current file being transformed (for resolving relative imports)
100119
+ * @returns Transformed source code with trigger calls rewritten
100091
100120
  */
100092
100121
  function transformFunctionTriggers(source, workflowNameMap, jobNameMap, workflowFileMap, currentFilePath) {
100093
100122
  const { program } = parseSync("input.ts", source);
@@ -100134,8 +100163,8 @@ function transformFunctionTriggers(source, workflowNameMap, jobNameMap, workflow
100134
100163
  //#region src/cli/bundler/trigger-context.ts
100135
100164
  /**
100136
100165
  * Normalize a file path by removing extension and resolving to absolute path
100137
- * @param {string} filePath - File path to normalize
100138
- * @returns {string} Normalized absolute path without extension
100166
+ * @param filePath - File path to normalize
100167
+ * @returns Normalized absolute path without extension
100139
100168
  */
100140
100169
  function normalizeFilePath(filePath) {
100141
100170
  const absolutePath = path$20.resolve(filePath);
@@ -100145,8 +100174,8 @@ function normalizeFilePath(filePath) {
100145
100174
  /**
100146
100175
  * Build trigger context from workflow configuration
100147
100176
  * Scans workflow files to collect workflow and job mappings
100148
- * @param {FileLoadConfig | undefined} workflowConfig - Workflow file loading configuration
100149
- * @returns {Promise<TriggerContext>} Trigger context built from workflow sources
100177
+ * @param workflowConfig - Workflow file loading configuration
100178
+ * @returns Trigger context built from workflow sources
100150
100179
  */
100151
100180
  async function buildTriggerContext(workflowConfig) {
100152
100181
  const workflowNameMap = /* @__PURE__ */ new Map();
@@ -100184,8 +100213,8 @@ async function buildTriggerContext(workflowConfig) {
100184
100213
  /**
100185
100214
  * Create a rolldown plugin for transforming trigger calls
100186
100215
  * Returns undefined if no trigger context is provided
100187
- * @param {TriggerContext | undefined} triggerContext - Trigger context to use for transformations
100188
- * @returns {Plugin | undefined} Rolldown plugin or undefined when no context
100216
+ * @param triggerContext - Trigger context to use for transformations
100217
+ * @returns Rolldown plugin or undefined when no context
100189
100218
  */
100190
100219
  function createTriggerTransformPlugin(triggerContext) {
100191
100220
  if (!triggerContext) return;
@@ -100205,8 +100234,8 @@ function createTriggerTransformPlugin(triggerContext) {
100205
100234
  //#region src/cli/bundler/executor/loader.ts
100206
100235
  /**
100207
100236
  * Load and validate an executor definition from a file.
100208
- * @param {string} executorFilePath - Path to the executor file
100209
- * @returns {Promise<Executor | null>} Parsed executor or null if invalid
100237
+ * @param executorFilePath - Path to the executor file
100238
+ * @returns Parsed executor or null if invalid
100210
100239
  */
100211
100240
  async function loadExecutor(executorFilePath) {
100212
100241
  const executor = (await import(pathToFileURL(executorFilePath).href)).default;
@@ -100223,9 +100252,9 @@ async function loadExecutor(executorFilePath) {
100223
100252
  * This function:
100224
100253
  * 1. Creates entry file that extracts operation.body
100225
100254
  * 2. Bundles in a single step with tree-shaking
100226
- * @param {FileLoadConfig} config - Executor file loading configuration
100227
- * @param {TriggerContext} [triggerContext] - Trigger context for workflow/job transformations
100228
- * @returns {Promise<void>} Promise that resolves when bundling completes
100255
+ * @param config - Executor file loading configuration
100256
+ * @param triggerContext - Trigger context for workflow/job transformations
100257
+ * @returns Promise that resolves when bundling completes
100229
100258
  */
100230
100259
  async function bundleExecutors(config, triggerContext) {
100231
100260
  const files = loadFilesWithIgnores(config);
@@ -100269,7 +100298,7 @@ async function bundleExecutors(config, triggerContext) {
100269
100298
  async function bundleSingleExecutor(executor, outputDir, tsconfig, triggerContext) {
100270
100299
  const entryPath = path$20.join(outputDir, `${executor.name}.entry.js`);
100271
100300
  const entryContent = ml`
100272
- import _internalExecutor from "${path$20.resolve(executor.sourceFile).replace(/\\/g, "/")}";
100301
+ import _internalExecutor from "${path$20.resolve(executor.sourceFile)}";
100273
100302
 
100274
100303
  const __executor_function = _internalExecutor.operation.body;
100275
100304
 
@@ -100303,8 +100332,8 @@ async function bundleSingleExecutor(executor, outputDir, tsconfig, triggerContex
100303
100332
  //#region src/cli/bundler/resolver/loader.ts
100304
100333
  /**
100305
100334
  * Load and validate a resolver definition from a file.
100306
- * @param {string} resolverFilePath - Path to the resolver file
100307
- * @returns {Promise<Resolver | null>} Parsed resolver or null if invalid
100335
+ * @param resolverFilePath - Path to the resolver file
100336
+ * @returns Parsed resolver or null if invalid
100308
100337
  */
100309
100338
  async function loadResolver(resolverFilePath) {
100310
100339
  const resolver = (await import(pathToFileURL(resolverFilePath).href)).default;
@@ -100322,10 +100351,10 @@ async function loadResolver(resolverFilePath) {
100322
100351
  * 1. Uses a transform plugin to add validation wrapper during bundling
100323
100352
  * 2. Creates entry file
100324
100353
  * 3. Bundles in a single step with tree-shaking
100325
- * @param {string} namespace - Resolver namespace name
100326
- * @param {FileLoadConfig} config - Resolver file loading configuration
100327
- * @param {TriggerContext} [triggerContext] - Trigger context for workflow/job transformations
100328
- * @returns {Promise<void>} Promise that resolves when bundling completes
100354
+ * @param namespace - Resolver namespace name
100355
+ * @param config - Resolver file loading configuration
100356
+ * @param triggerContext - Trigger context for workflow/job transformations
100357
+ * @returns Promise that resolves when bundling completes
100329
100358
  */
100330
100359
  async function bundleResolvers(namespace, config, triggerContext) {
100331
100360
  const files = loadFilesWithIgnores(config);
@@ -100361,7 +100390,7 @@ async function bundleResolvers(namespace, config, triggerContext) {
100361
100390
  async function bundleSingleResolver(resolver, outputDir, tsconfig, triggerContext) {
100362
100391
  const entryPath = path$20.join(outputDir, `${resolver.name}.entry.js`);
100363
100392
  const entryContent = ml`
100364
- import _internalResolver from "${path$20.resolve(resolver.sourceFile).replace(/\\/g, "/")}";
100393
+ import _internalResolver from "${path$20.resolve(resolver.sourceFile)}";
100365
100394
  import { t } from "@tailor-platform/sdk";
100366
100395
 
100367
100396
  const $tailor_resolver_body = async (context) => {
@@ -100417,8 +100446,8 @@ async function bundleSingleResolver(resolver, outputDir, tsconfig, triggerContex
100417
100446
  /**
100418
100447
  * Find variable declarations by export names
100419
100448
  * Returns a map of export name to statement range
100420
- * @param {Program} program - Parsed TypeScript program
100421
- * @returns {Map<string, { start: number; end: number }>} Map of export name to statement range
100449
+ * @param program - Parsed TypeScript program
100450
+ * @returns Map of export name to statement range
100422
100451
  */
100423
100452
  function findVariableDeclarationsByName(program) {
100424
100453
  const declarations = /* @__PURE__ */ new Map();
@@ -100457,8 +100486,8 @@ function findVariableDeclarationsByName(program) {
100457
100486
  /**
100458
100487
  * Find createWorkflow default export declarations
100459
100488
  * Returns the range of the export statement to remove
100460
- * @param {Program} program - Parsed TypeScript program
100461
- * @returns {{ start: number; end: number } | null} Range of the default export statement or null
100489
+ * @param program - Parsed TypeScript program
100490
+ * @returns Range of the default export statement or null
100462
100491
  */
100463
100492
  function findWorkflowDefaultExport(program) {
100464
100493
  const bindings = collectSdkBindings(program, "createWorkflow");
@@ -100480,12 +100509,12 @@ function findWorkflowDefaultExport(program) {
100480
100509
  * Transform workflow source code
100481
100510
  * - Transform .trigger() calls to tailor.workflow.triggerJobFunction()
100482
100511
  * - Other jobs: remove entire variable declaration
100483
- * @param {string} source - The source code to transform
100484
- * @param {string} targetJobName - The name of the target job (from job config)
100485
- * @param {string} [targetJobExportName] - The export name of the target job (optional, for enhanced detection)
100486
- * @param {string[]} [otherJobExportNames] - Export names of other jobs to remove (optional, for enhanced detection)
100487
- * @param {Map<string, string>} [allJobsMap] - Map from export name to job name for trigger transformation (optional)
100488
- * @returns {string} Transformed workflow source code
100512
+ * @param source - The source code to transform
100513
+ * @param targetJobName - The name of the target job (from job config)
100514
+ * @param targetJobExportName - The export name of the target job (optional, for enhanced detection)
100515
+ * @param otherJobExportNames - Export names of other jobs to remove (optional, for enhanced detection)
100516
+ * @param allJobsMap - Map from export name to job name for trigger transformation (optional)
100517
+ * @returns Transformed workflow source code
100489
100518
  */
100490
100519
  function transformWorkflowSource(source, targetJobName, targetJobExportName, otherJobExportNames, allJobsMap) {
100491
100520
  const { program } = parseSync("input.ts", source);
@@ -100575,11 +100604,11 @@ function transformWorkflowSource(source, targetJobName, targetJobExportName, oth
100575
100604
  * 3. Creates entry file and bundles with tree-shaking
100576
100605
  *
100577
100606
  * Returns metadata about which jobs each workflow uses.
100578
- * @param {JobInfo[]} allJobs - All available job infos
100579
- * @param {string[]} mainJobNames - Names of main jobs
100580
- * @param {Record<string, string | number | boolean>} [env={}] - Environment variables to inject
100581
- * @param {TriggerContext} [triggerContext] - Trigger context for transformations
100582
- * @returns {Promise<BundleWorkflowJobsResult>} Workflow job bundling result
100607
+ * @param allJobs - All available job infos
100608
+ * @param mainJobNames - Names of main jobs
100609
+ * @param env - Environment variables to inject
100610
+ * @param triggerContext - Trigger context for transformations
100611
+ * @returns Workflow job bundling result
100583
100612
  */
100584
100613
  async function bundleWorkflowJobs(allJobs, mainJobNames, env = {}, triggerContext) {
100585
100614
  if (allJobs.length === 0) {
@@ -100609,9 +100638,9 @@ async function bundleWorkflowJobs(allJobs, mainJobNames, env = {}, triggerContex
100609
100638
  * - It's called via .trigger() from another used job (transitively)
100610
100639
  *
100611
100640
  * Also returns a map of mainJob -> all jobs it depends on (for metadata).
100612
- * @param {JobInfo[]} allJobs - All available job infos
100613
- * @param {string[]} mainJobNames - Names of main jobs
100614
- * @returns {Promise<FilterUsedJobsResult>} Used jobs and main job dependency map
100641
+ * @param allJobs - All available job infos
100642
+ * @param mainJobNames - Names of main jobs
100643
+ * @returns Used jobs and main job dependency map
100615
100644
  */
100616
100645
  async function filterUsedJobs(allJobs, mainJobNames) {
100617
100646
  if (allJobs.length === 0 || mainJobNames.length === 0) return {
@@ -100676,7 +100705,7 @@ async function filterUsedJobs(allJobs, mainJobNames) {
100676
100705
  }
100677
100706
  async function bundleSingleJob(job, allJobs, outputDir, tsconfig, env, triggerContext) {
100678
100707
  const entryPath = path$20.join(outputDir, `${job.name}.entry.js`);
100679
- const absoluteSourcePath = path$20.resolve(job.sourceFile).replace(/\\/g, "/");
100708
+ const absoluteSourcePath = path$20.resolve(job.sourceFile);
100680
100709
  const entryContent = ml`
100681
100710
  import { ${job.exportName} } from "${absoluteSourcePath}";
100682
100711
 
@@ -100756,8 +100785,8 @@ const BaseGeneratorConfigSchema = z.union([
100756
100785
  ]);
100757
100786
  /**
100758
100787
  * Creates a GeneratorConfigSchema with built-in generator support
100759
- * @param {Map<string, (options: unknown) => CodeGeneratorBase>} builtinGenerators - Map of generator IDs to their constructor functions
100760
- * @returns {z.ZodEffects<z.ZodUnion<[typeof KyselyTypeConfigSchema, typeof SeedConfigSchema, typeof EnumConstantsConfigSchema, typeof FileUtilsConfigSchema, typeof CodeGeneratorSchema]>, CodeGeneratorBase, unknown> | z.ZodUnion<[typeof KyselyTypeConfigSchema, typeof SeedConfigSchema, typeof EnumConstantsConfigSchema, typeof FileUtilsConfigSchema, typeof CodeGeneratorSchema]>} Generator config schema
100788
+ * @param builtinGenerators - Map of generator IDs to their constructor functions
100789
+ * @returns Generator config schema
100761
100790
  */
100762
100791
  function createGeneratorConfigSchema(builtinGenerators$1) {
100763
100792
  return z.union([
@@ -100782,10 +100811,9 @@ function createGeneratorConfigSchema(builtinGenerators$1) {
100782
100811
  /**
100783
100812
  * Type guard to check if a generator has a specific dependency.
100784
100813
  * @template D
100785
- * @param {{ dependencies: readonly DependencyKind[] }} generator - Code generator instance
100786
- * @param {readonly DependencyKind[]} generator.dependencies - Generator dependencies
100787
- * @param {D} dependency - Dependency kind to check
100788
- * @returns {boolean} True if the generator has the dependency
100814
+ * @param generator - Code generator instance
100815
+ * @param dependency - Dependency kind to check
100816
+ * @returns True if the generator has the dependency
100789
100817
  */
100790
100818
  function hasDependency(generator, dependency) {
100791
100819
  return generator.dependencies.includes(dependency);
@@ -100831,8 +100859,8 @@ var EnumProcessor = class {
100831
100859
  }
100832
100860
  /**
100833
100861
  * Generate enum constant definitions from collected metadata.
100834
- * @param {EnumDefinition[]} allEnums - All collected enum definitions
100835
- * @returns {string} Generated enum constant definitions
100862
+ * @param allEnums - All collected enum definitions
100863
+ * @returns Generated enum constant definitions
100836
100864
  */
100837
100865
  static generateUnifiedEnumConstants(allEnums) {
100838
100866
  if (allEnums.length === 0) return "";
@@ -101044,8 +101072,8 @@ var FileUtilsGenerator = class {
101044
101072
  var TypeProcessor = class {
101045
101073
  /**
101046
101074
  * Convert a ParsedTailorDBType into KyselyTypeMetadata.
101047
- * @param {ParsedTailorDBType} type - Parsed TailorDB type
101048
- * @returns {Promise<KyselyTypeMetadata>} Generated Kysely type metadata
101075
+ * @param type - Parsed TailorDB type
101076
+ * @returns Generated Kysely type metadata
101049
101077
  */
101050
101078
  static async processType(type) {
101051
101079
  const result = this.generateTableInterface(type);
@@ -101057,8 +101085,8 @@ var TypeProcessor = class {
101057
101085
  }
101058
101086
  /**
101059
101087
  * Generate the table interface.
101060
- * @param {ParsedTailorDBType} type - Parsed TailorDB type
101061
- * @returns {{ typeDef: string; usedUtilityTypes: { Timestamp: boolean; Serial: boolean } }} Table interface code and used utility types
101088
+ * @param type - Parsed TailorDB type
101089
+ * @returns Table interface code and used utility types
101062
101090
  */
101063
101091
  static generateTableInterface(type) {
101064
101092
  const fieldResults = Object.entries(type.fields).filter(([fieldName]) => fieldName !== "id").map(([fieldName, parsedField]) => ({
@@ -101084,8 +101112,8 @@ var TypeProcessor = class {
101084
101112
  }
101085
101113
  /**
101086
101114
  * Generate the complete field type including array and null modifiers.
101087
- * @param {OperatorFieldConfig} fieldConfig - Parsed field configuration
101088
- * @returns {{ type: string; usedUtilityTypes: { Timestamp: boolean; Serial: boolean } }} Field type and used utility types
101115
+ * @param fieldConfig - Parsed field configuration
101116
+ * @returns Field type and used utility types
101089
101117
  */
101090
101118
  static generateFieldType(fieldConfig) {
101091
101119
  const baseTypeResult = this.getBaseType(fieldConfig);
@@ -101107,8 +101135,8 @@ var TypeProcessor = class {
101107
101135
  }
101108
101136
  /**
101109
101137
  * Get the base Kysely type for a field (without array/null modifiers).
101110
- * @param {OperatorFieldConfig} fieldConfig - Parsed field configuration
101111
- * @returns {{ type: string; usedUtilityTypes: { Timestamp: boolean; Serial: boolean } }} Base field type and used utility types
101138
+ * @param fieldConfig - Parsed field configuration
101139
+ * @returns Base field type and used utility types
101112
101140
  */
101113
101141
  static getBaseType(fieldConfig) {
101114
101142
  const fieldType = fieldConfig.type;
@@ -101150,8 +101178,8 @@ var TypeProcessor = class {
101150
101178
  }
101151
101179
  /**
101152
101180
  * Get the enum type definition.
101153
- * @param {OperatorFieldConfig} fieldConfig - Parsed field configuration
101154
- * @returns {string} Enum type definition
101181
+ * @param fieldConfig - Parsed field configuration
101182
+ * @returns Enum type definition
101155
101183
  */
101156
101184
  static getEnumType(fieldConfig) {
101157
101185
  const allowedValues = fieldConfig.allowedValues;
@@ -101162,8 +101190,8 @@ var TypeProcessor = class {
101162
101190
  }
101163
101191
  /**
101164
101192
  * Get the nested object type definition.
101165
- * @param {OperatorFieldConfig} fieldConfig - Parsed field configuration
101166
- * @returns {{ type: string; usedUtilityTypes: { Timestamp: boolean; Serial: boolean } }} Nested object type and used utility types
101193
+ * @param fieldConfig - Parsed field configuration
101194
+ * @returns Nested object type and used utility types
101167
101195
  */
101168
101196
  static getNestedType(fieldConfig) {
101169
101197
  const fields = fieldConfig.fields;
@@ -101193,8 +101221,8 @@ var TypeProcessor = class {
101193
101221
  }
101194
101222
  /**
101195
101223
  * Generate unified types file from multiple namespaces.
101196
- * @param {KyselyNamespaceMetadata[]} namespaceData - Namespace metadata
101197
- * @returns {string} Generated types file contents
101224
+ * @param namespaceData - Namespace metadata
101225
+ * @returns Generated types file contents
101198
101226
  */
101199
101227
  static generateUnifiedTypes(namespaceData) {
101200
101228
  if (namespaceData.length === 0) return "";
@@ -101293,10 +101321,11 @@ var KyselyGenerator = class {
101293
101321
  //#region src/cli/generator/builtin/seed/gql-ingest-processor.ts
101294
101322
  /**
101295
101323
  * Processes TailorDB types to generate GraphQL Ingest metadata
101296
- * @param {ParsedTailorDBType} type - Parsed TailorDB type
101297
- * @returns {GqlIngestMetadata} Generated GraphQL Ingest metadata
101324
+ * @param type - Parsed TailorDB type
101325
+ * @param namespace - Namespace of the type
101326
+ * @returns Generated GraphQL Ingest metadata
101298
101327
  */
101299
- function processGqlIngest(type) {
101328
+ function processGqlIngest(type, namespace) {
101300
101329
  const dependencies = Array.from(Object.values(type.fields).reduce((set$1, field) => {
101301
101330
  if (field.relation?.targetType && field.relation.targetType !== type.name) set$1.add(field.relation.targetType);
101302
101331
  return set$1;
@@ -101309,6 +101338,7 @@ function processGqlIngest(type) {
101309
101338
  `;
101310
101339
  return {
101311
101340
  name: type.name,
101341
+ namespace,
101312
101342
  dependencies,
101313
101343
  mapping: {
101314
101344
  dataFile: `data/${type.name}.jsonl`,
@@ -101324,8 +101354,8 @@ function processGqlIngest(type) {
101324
101354
  //#region src/cli/generator/builtin/seed/idp-user-processor.ts
101325
101355
  /**
101326
101356
  * Processes auth configuration to generate IdP user seed metadata
101327
- * @param {GeneratorAuthInput} auth - Auth configuration from generator
101328
- * @returns {IdpUserMetadata | undefined} IdP user metadata or undefined if not applicable
101357
+ * @param auth - Auth configuration from generator
101358
+ * @returns IdP user metadata or undefined if not applicable
101329
101359
  */
101330
101360
  function processIdpUser(auth) {
101331
101361
  if (auth.idProvider?.kind !== "BuiltInIdP" || !auth.userProfile) return;
@@ -101353,9 +101383,9 @@ function processIdpUser(auth) {
101353
101383
  }
101354
101384
  /**
101355
101385
  * Generates the schema file content for IdP users with foreign key
101356
- * @param {string} usernameField - Username field name
101357
- * @param {string} userTypeName - TailorDB user type name
101358
- * @returns {string} Schema file contents
101386
+ * @param usernameField - Username field name
101387
+ * @param userTypeName - TailorDB user type name
101388
+ * @returns Schema file contents
101359
101389
  */
101360
101390
  function generateIdpUserSchemaFile(usernameField, userTypeName) {
101361
101391
  return ml`
@@ -101397,11 +101427,9 @@ function generateIdpUserSchemaFile(usernameField, userTypeName) {
101397
101427
  //#region src/cli/generator/builtin/seed/lines-db-processor.ts
101398
101428
  /**
101399
101429
  * Processes TailorDB types to generate lines-db metadata
101400
- * @param {ParsedTailorDBType} type - Parsed TailorDB type
101401
- * @param {{ filePath: string; exportName: string }} source - Source file info
101402
- * @param {string} source.filePath - Source file path
101403
- * @param {string} source.exportName - Source export name
101404
- * @returns {LinesDbMetadata} Generated lines-db metadata
101430
+ * @param type - Parsed TailorDB type
101431
+ * @param source - Source file info
101432
+ * @returns Generated lines-db metadata
101405
101433
  */
101406
101434
  function processLinesDb(type, source) {
101407
101435
  if (!source.filePath || !source.exportName) throw new Error(`Missing source info for type ${type.name}`);
@@ -101442,9 +101470,9 @@ function processLinesDb(type, source) {
101442
101470
  }
101443
101471
  /**
101444
101472
  * Generates the schema file content for lines-db
101445
- * @param {LinesDbMetadata} metadata - lines-db metadata
101446
- * @param {string} importPath - Import path for the TailorDB type
101447
- * @returns {string} Schema file contents
101473
+ * @param metadata - lines-db metadata
101474
+ * @param importPath - Import path for the TailorDB type
101475
+ * @returns Schema file contents
101448
101476
  */
101449
101477
  function generateLinesDbSchemaFile(metadata, importPath) {
101450
101478
  const { exportName, optionalFields, omitFields, foreignKeys, indexes } = metadata;
@@ -101494,49 +101522,249 @@ function generateLinesDbSchemaFile(metadata, importPath) {
101494
101522
  //#region src/cli/generator/builtin/seed/index.ts
101495
101523
  const SeedGeneratorID = "@tailor-platform/seed";
101496
101524
  /**
101497
- * Converts a path to POSIX format (forward slashes).
101498
- * This ensures consistent import paths across platforms.
101499
- * @param {string} p - Path to convert
101500
- * @returns {string} POSIX-style path
101501
- */
101502
- function toPosixPath(p) {
101503
- return p.split(path$20.sep).join(path$20.posix.sep);
101504
- }
101505
- /**
101506
- * Generates the exec.mjs script content (Node.js executable)
101507
- * @param {string} machineUserName - Machine user name for token retrieval
101508
- * @param {string} relativeConfigPath - Config path relative to exec script
101509
- * @returns {string} exec.mjs file contents
101525
+ * Generates the exec.mjs script content (Node.js executable) using gql-ingest Programmatic API
101526
+ * @param machineUserName - Machine user name for token retrieval
101527
+ * @param relativeConfigPath - Config path relative to exec script
101528
+ * @param entityDependencies - Entity dependencies mapping
101529
+ * @returns exec.mjs file contents
101510
101530
  */
101511
- function generateExecScript(machineUserName, relativeConfigPath) {
101531
+ function generateExecScript(machineUserName, relativeConfigPath, entityDependencies) {
101532
+ const namespaceMap = /* @__PURE__ */ new Map();
101533
+ for (const [type, meta] of Object.entries(entityDependencies)) if (meta.namespace) {
101534
+ if (!namespaceMap.has(meta.namespace)) namespaceMap.set(meta.namespace, []);
101535
+ namespaceMap.get(meta.namespace).push(type);
101536
+ }
101512
101537
  return ml`
101513
- import { execSync } from "node:child_process";
101538
+ import { GQLIngest } from "@jackchuka/gql-ingest";
101514
101539
  import { join } from "node:path";
101515
- import { show, getMachineUserToken } from "@tailor-platform/sdk/cli";
101540
+ import { parseArgs, styleText } from "node:util";
101541
+ import { createInterface } from "node:readline";
101542
+ import { show, getMachineUserToken, truncate } from "@tailor-platform/sdk/cli";
101543
+
101544
+ // Parse command-line arguments
101545
+ const { values, positionals } = parseArgs({
101546
+ options: {
101547
+ namespace: { type: "string", short: "n" },
101548
+ "skip-idp": { type: "boolean", default: false },
101549
+ truncate: { type: "boolean", default: false },
101550
+ yes: { type: "boolean", default: false },
101551
+ help: { type: "boolean", short: "h", default: false },
101552
+ },
101553
+ allowPositionals: true,
101554
+ });
101555
+
101556
+ if (values.help) {
101557
+ console.log(\`
101558
+ Usage: node exec.mjs [options] [types...]
101559
+
101560
+ Options:
101561
+ -n, --namespace <ns> Process all types in specified namespace (excludes _User)
101562
+ --skip-idp Skip IdP user (_User) entity
101563
+ --truncate Truncate tables before seeding
101564
+ --yes Skip confirmation prompts (for truncate)
101565
+ -h, --help Show help
101566
+
101567
+ Examples:
101568
+ node exec.mjs # Process all types (default)
101569
+ node exec.mjs --namespace <namespace> # Process tailordb namespace only (no _User)
101570
+ node exec.mjs User Order # Process specific types only
101571
+ node exec.mjs --skip-idp # Process all except _User
101572
+ node exec.mjs --truncate # Truncate all tables, then seed all
101573
+ node exec.mjs --truncate --yes # Truncate all tables without confirmation, then seed all
101574
+ node exec.mjs --truncate --namespace <namespace> # Truncate tailordb, then seed tailordb
101575
+ node exec.mjs --truncate User Order # Truncate User and Order, then seed them
101576
+ \`);
101577
+ process.exit(0);
101578
+ }
101579
+
101580
+ // Helper function to prompt for y/n confirmation
101581
+ const promptConfirmation = (question) => {
101582
+ const rl = createInterface({
101583
+ input: process.stdin,
101584
+ output: process.stdout,
101585
+ });
101586
+
101587
+ return new Promise((resolve) => {
101588
+ rl.question(styleText("yellow", question), (answer) => {
101589
+ rl.close();
101590
+ resolve(answer.toLowerCase().trim());
101591
+ });
101592
+ });
101593
+ };
101516
101594
 
101517
101595
  const configDir = import.meta.dirname;
101518
101596
  const configPath = join(configDir, "${relativeConfigPath}");
101519
101597
 
101520
- console.log("Starting seed data generation...");
101598
+ console.log(styleText("cyan", "Starting seed data generation..."));
101521
101599
 
101600
+ // Entity configuration
101601
+ const namespaceEntities = {
101602
+ ${Array.from(namespaceMap.entries()).map(([namespace, entities]) => {
101603
+ return ` ${namespace}: [\n${entities.map((e) => ` "${e}",`).join("\n")}\n ]`;
101604
+ }).join(",\n")}
101605
+ };
101606
+ const entities = Object.values(namespaceEntities).flat();
101607
+
101608
+ // Determine which entities to process
101609
+ let entitiesToProcess = null;
101610
+
101611
+ const hasNamespace = !!values.namespace;
101612
+ const hasTypes = positionals.length > 0;
101613
+ const skipIdp = values["skip-idp"];
101614
+
101615
+ // Validate mutually exclusive options
101616
+ const optionCount = [hasNamespace, hasTypes].filter(Boolean).length;
101617
+ if (optionCount > 1) {
101618
+ console.error(styleText("red", "Error: Options --namespace and type names are mutually exclusive."));
101619
+ process.exit(1);
101620
+ }
101621
+
101622
+ // --skip-idp and --namespace are redundant (namespace already excludes _User)
101623
+ if (skipIdp && hasNamespace) {
101624
+ console.warn(styleText("yellow", "Warning: --skip-idp is redundant with --namespace (namespace filtering already excludes _User)."));
101625
+ }
101626
+
101627
+ // Filter by namespace (automatically excludes _User as it has no namespace)
101628
+ if (hasNamespace) {
101629
+ const namespace = values.namespace;
101630
+ entitiesToProcess = namespaceEntities[namespace];
101631
+
101632
+ if (!entitiesToProcess || entitiesToProcess.length === 0) {
101633
+ console.error(styleText("red", \`Error: No entities found in namespace "\${namespace}"\`));
101634
+ console.error(styleText("yellow", \`Available namespaces: \${Object.keys(namespaceEntities).join(", ")}\`));
101635
+ process.exit(1);
101636
+ }
101637
+
101638
+ console.log(styleText("cyan", \`Filtering by namespace: \${namespace}\`));
101639
+ console.log(styleText("dim", \`Entities: \${entitiesToProcess.join(", ")}\`));
101640
+ }
101641
+
101642
+ // Filter by specific types
101643
+ if (hasTypes) {
101644
+ const requestedTypes = positionals;
101645
+ const notFoundTypes = [];
101646
+
101647
+ entitiesToProcess = requestedTypes.filter((type) => {
101648
+ if (!entities.includes(type)) {
101649
+ notFoundTypes.push(type);
101650
+ return false;
101651
+ }
101652
+ return true;
101653
+ });
101654
+
101655
+ if (notFoundTypes.length > 0) {
101656
+ console.error(styleText("red", \`Error: The following types were not found: \${notFoundTypes.join(", ")}\`));
101657
+ console.error(styleText("yellow", \`Available types: \${entities.join(", ")}\`));
101658
+ process.exit(1);
101659
+ }
101660
+
101661
+ console.log(styleText("cyan", \`Filtering by types: \${entitiesToProcess.join(", ")}\`));
101662
+ }
101663
+
101664
+ // Apply --skip-idp filter
101665
+ if (skipIdp) {
101666
+ if (entitiesToProcess) {
101667
+ // Filter out _User from already filtered list
101668
+ entitiesToProcess = entitiesToProcess.filter((entity) => entity !== "_User");
101669
+ } else {
101670
+ // Get all entities except _User
101671
+ entitiesToProcess = entities.filter((entity) => entity !== "_User");
101672
+ }
101673
+ console.log(styleText("dim", \`Skipping IdP user (_User)\`));
101674
+ }
101675
+
101676
+ // Truncate tables if requested
101677
+ // Note: --skip-idp only affects seeding, not truncation
101678
+ if (values.truncate) {
101679
+ // Prompt user for confirmation
101680
+ const answer = values.yes ? "y" : await promptConfirmation("Are you sure you want to truncate? (y/n): ");
101681
+ if (answer !== "y") {
101682
+ console.log(styleText("yellow", "Truncate cancelled."));
101683
+ process.exit(0);
101684
+ }
101685
+
101686
+ console.log(styleText("cyan", "\\nTruncating tables..."));
101687
+
101688
+ try {
101689
+ if (hasNamespace) {
101690
+ // Truncate specific namespace
101691
+ await truncate({
101692
+ configPath,
101693
+ namespace: values.namespace,
101694
+ });
101695
+ } else if (hasTypes) {
101696
+ // Truncate specific types
101697
+ await truncate({
101698
+ configPath,
101699
+ types: entitiesToProcess,
101700
+ });
101701
+ } else {
101702
+ // Truncate all (--skip-idp does not affect truncation)
101703
+ await truncate({
101704
+ configPath,
101705
+ all: true,
101706
+ });
101707
+ }
101708
+ console.log(styleText("green", "Truncate completed.\\n"));
101709
+ } catch (error) {
101710
+ console.error(styleText("red", \`Truncate failed: \${error.message}\`));
101711
+ process.exit(1);
101712
+ }
101713
+ }
101714
+
101715
+ // Get application info and endpoint
101522
101716
  const appInfo = await show({ configPath });
101523
101717
  const endpoint = \`\${appInfo.url}/query\`;
101524
101718
 
101719
+ // Get machine user token
101525
101720
  const tokenInfo = await getMachineUserToken({ name: "${machineUserName}", configPath });
101526
- const headers = JSON.stringify({ Authorization: \`Bearer \${tokenInfo.accessToken}\` });
101527
101721
 
101528
- const headersArg = process.platform === "win32"
101529
- ? \`"\${headers.replace(/"/g, '\\\\"')}"\`
101530
- : \`'\${headers}'\`;
101722
+ // Initialize GQLIngest client
101723
+ const client = new GQLIngest({
101724
+ endpoint,
101725
+ headers: {
101726
+ Authorization: \`Bearer \${tokenInfo.accessToken}\`,
101727
+ },
101728
+ });
101531
101729
 
101532
- const cmd = \`npx gql-ingest -c "\${configDir}" -e "\${endpoint}" --headers \${headersArg}\`;
101533
- console.log("Running:", cmd);
101730
+ // Progress monitoring event handlers
101731
+ client.on("started", (payload) => {
101732
+ console.log(styleText("cyan", \`Processing \${payload.totalEntities} entities...\`));
101733
+ });
101534
101734
 
101735
+ client.on("entityStart", (payload) => {
101736
+ console.log(styleText("dim", \` Processing \${payload.entityName}...\`));
101737
+ });
101738
+
101739
+ client.on("entityComplete", (payload) => {
101740
+ const { entityName, metrics: { rowsProcessed } } = payload;
101741
+ console.log(styleText("green", \` ✓ \${entityName}: \${rowsProcessed} rows processed\`));
101742
+ });
101743
+
101744
+ client.on("rowFailure", (payload) => {
101745
+ console.error(styleText("red", \` ✗ Row \${payload.rowIndex} in \${payload.entityName} failed: \${payload.error.message}\`));
101746
+ });
101747
+
101748
+ // Run ingestion
101535
101749
  try {
101536
- execSync(cmd, { stdio: "inherit" });
101750
+ let result;
101751
+ if (entitiesToProcess && entitiesToProcess.length > 0) {
101752
+ result = await client.ingestEntities(configDir, entitiesToProcess);
101753
+ } else {
101754
+ result = await client.ingest(configDir);
101755
+ }
101756
+
101757
+ if (result.success) {
101758
+ console.log(styleText("green", "\\n✓ Seed data generation completed successfully"));
101759
+ console.log(client.getMetricsSummary());
101760
+ } else {
101761
+ console.error(styleText("red", "\\n✗ Seed data generation failed"));
101762
+ console.error(client.getMetricsSummary());
101763
+ process.exit(1);
101764
+ }
101537
101765
  } catch (error) {
101538
- console.error("Seed failed with exit code:", error.status);
101539
- process.exit(error.status ?? 1);
101766
+ console.error(styleText("red", \`\\n✗ Seed data generation failed with error: \${error.message}\`));
101767
+ process.exit(1);
101540
101768
  }
101541
101769
 
101542
101770
  `;
@@ -101544,19 +101772,17 @@ function generateExecScript(machineUserName, relativeConfigPath) {
101544
101772
  /**
101545
101773
  * Factory function to create a Seed generator.
101546
101774
  * Combines GraphQL Ingest and lines-db schema generation.
101547
- * @param {{ distPath: string; machineUserName?: string }} options - Seed generator options
101548
- * @param {string} options.distPath - Output directory for generated files
101549
- * @param {string} [options.machineUserName] - Machine user name for seeding
101550
- * @returns {TailorDBGenerator<SeedTypeMetadata, Record<string, SeedTypeMetadata>>} Seed generator
101775
+ * @param options - Seed generator options
101776
+ * @returns Seed generator
101551
101777
  */
101552
101778
  function createSeedGenerator(options) {
101553
101779
  return {
101554
101780
  id: SeedGeneratorID,
101555
101781
  description: "Generates seed data files (GraphQL Ingest + lines-db schema)",
101556
101782
  dependencies: ["tailordb"],
101557
- processType: ({ type, source }) => {
101783
+ processType: ({ type, source, namespace }) => {
101558
101784
  return {
101559
- gqlIngest: processGqlIngest(type),
101785
+ gqlIngest: processGqlIngest(type, namespace),
101560
101786
  linesDb: processLinesDb(type, source)
101561
101787
  };
101562
101788
  },
@@ -101570,7 +101796,10 @@ function createSeedGenerator(options) {
101570
101796
  if (!(outputBaseDir in entityDependencies)) entityDependencies[outputBaseDir] = {};
101571
101797
  for (const [_typeName, metadata] of Object.entries(nsResult.types)) {
101572
101798
  const { gqlIngest, linesDb } = metadata;
101573
- entityDependencies[outputBaseDir][gqlIngest.name] = gqlIngest.dependencies;
101799
+ entityDependencies[outputBaseDir][gqlIngest.name] = {
101800
+ namespace: gqlIngest.namespace,
101801
+ dependencies: gqlIngest.dependencies
101802
+ };
101574
101803
  files.push({
101575
101804
  path: path$20.join(outputBaseDir, "mappings", `${gqlIngest.name}.json`),
101576
101805
  content: JSON.stringify(gqlIngest.mapping, null, 2) + "\n"
@@ -101583,7 +101812,7 @@ function createSeedGenerator(options) {
101583
101812
  content: gqlIngest.graphql
101584
101813
  });
101585
101814
  const schemaOutputPath = path$20.join(outputBaseDir, "data", `${linesDb.typeName}.schema.ts`);
101586
- const importPath = toPosixPath(path$20.relative(path$20.dirname(schemaOutputPath), linesDb.importPath));
101815
+ const importPath = path$20.relative(path$20.dirname(schemaOutputPath), linesDb.importPath);
101587
101816
  const normalizedImportPath = importPath.replace(/\.ts$/, "").startsWith(".") ? importPath.replace(/\.ts$/, "") : `./${importPath.replace(/\.ts$/, "")}`;
101588
101817
  files.push({
101589
101818
  path: schemaOutputPath,
@@ -101596,7 +101825,7 @@ function createSeedGenerator(options) {
101596
101825
  if (idpUser) {
101597
101826
  const outputBaseDir = options.distPath;
101598
101827
  if (!(outputBaseDir in entityDependencies)) entityDependencies[outputBaseDir] = {};
101599
- entityDependencies[outputBaseDir][idpUser.name] = idpUser.dependencies;
101828
+ entityDependencies[outputBaseDir][idpUser.name] = { dependencies: idpUser.dependencies };
101600
101829
  files.push({
101601
101830
  path: path$20.join(outputBaseDir, idpUser.mapping.graphqlFile),
101602
101831
  content: idpUser.graphql
@@ -101620,14 +101849,14 @@ function createSeedGenerator(options) {
101620
101849
  files.push({
101621
101850
  path: path$20.join(outputDir, "config.yaml"),
101622
101851
  content: `entityDependencies:
101623
- ${Object.entries(dependencies).map(([type, deps]) => `${type}: [${deps.join(", ")}]`).join("\n ")}
101852
+ ${Object.entries(dependencies).map(([type, deps]) => `${type}: [${deps.dependencies.join(", ")}]`).join("\n ")}
101624
101853
  `
101625
101854
  });
101626
101855
  if (options.machineUserName) {
101627
- const relativeConfigPath = toPosixPath(path$20.relative(outputDir, configPath));
101856
+ const relativeConfigPath = path$20.relative(outputDir, configPath);
101628
101857
  files.push({
101629
101858
  path: path$20.join(outputDir, "exec.mjs"),
101630
- content: generateExecScript(options.machineUserName, relativeConfigPath)
101859
+ content: generateExecScript(options.machineUserName, relativeConfigPath, dependencies)
101631
101860
  });
101632
101861
  }
101633
101862
  }
@@ -101658,8 +101887,8 @@ const builtinGenerators = new Map([
101658
101887
  const GeneratorConfigSchema = createGeneratorConfigSchema(builtinGenerators);
101659
101888
  /**
101660
101889
  * Load Tailor configuration file and associated generators.
101661
- * @param {string} [configPath] - Optional explicit config path
101662
- * @returns {Promise<{ config: AppConfig; generators: Generator[]; configPath: string }>} Loaded config and generators
101890
+ * @param configPath - Optional explicit config path
101891
+ * @returns Loaded config and generators
101663
101892
  */
101664
101893
  async function loadConfig(configPath) {
101665
101894
  const foundPath = loadConfigPath(configPath);
@@ -101696,10 +101925,10 @@ function extractAttributesFromConfig(config) {
101696
101925
  }
101697
101926
  /**
101698
101927
  * Generate the contents of the user-defined type definition file.
101699
- * @param {AttributeMapConfig | undefined} attributeMap - Attribute map configuration
101700
- * @param {AttributeListConfig | undefined} attributeList - Attribute list configuration
101701
- * @param {Record<string, string | number | boolean>} [env] - Environment configuration
101702
- * @returns {string} Generated type definition source
101928
+ * @param attributeMap - Attribute map configuration
101929
+ * @param attributeList - Attribute list configuration
101930
+ * @param env - Environment configuration
101931
+ * @returns Generated type definition source
101703
101932
  */
101704
101933
  function generateTypeDefinition(attributeMap, attributeList, env) {
101705
101934
  const mapFields = attributeMap ? Object.entries(attributeMap).map(([key, value]) => ` ${key}: ${value};`).join("\n") : "";
@@ -101760,8 +101989,8 @@ function collectAttributesFromConfig(config) {
101760
101989
  }
101761
101990
  /**
101762
101991
  * Resolve the output path for the generated type definition file.
101763
- * @param {string} configPath - Path to Tailor config file
101764
- * @returns {string} Absolute path to the type definition file
101992
+ * @param configPath - Path to Tailor config file
101993
+ * @returns Absolute path to the type definition file
101765
101994
  */
101766
101995
  function resolveTypeDefinitionPath(configPath) {
101767
101996
  const typePath = process.env.TAILOR_PLATFORM_SDK_TYPE_PATH;
@@ -101773,9 +102002,9 @@ function resolveTypeDefinitionPath(configPath) {
101773
102002
  }
101774
102003
  /**
101775
102004
  * Generate user type definitions from the app config and write them to disk.
101776
- * @param {AppConfig} config - Application config
101777
- * @param {string} configPath - Path to Tailor config file
101778
- * @returns {Promise<void>} Promise that resolves when types are generated
102005
+ * @param config - Application config
102006
+ * @param configPath - Path to Tailor config file
102007
+ * @returns Promise that resolves when types are generated
101779
102008
  */
101780
102009
  async function generateUserTypes(config, configPath) {
101781
102010
  try {
@@ -101819,8 +102048,8 @@ function resolvePackageDirectory(startDir) {
101819
102048
  //#region src/cli/apply/services/label.ts
101820
102049
  /**
101821
102050
  * Build TRN prefix for a workspace.
101822
- * @param {string} workspaceId - Workspace ID
101823
- * @returns {string} TRN prefix string
102051
+ * @param workspaceId - Workspace ID
102052
+ * @returns TRN prefix string
101824
102053
  */
101825
102054
  function trnPrefix(workspaceId) {
101826
102055
  return `trn:v1:workspace:${workspaceId}`;
@@ -101828,9 +102057,9 @@ function trnPrefix(workspaceId) {
101828
102057
  const sdkNameLabelKey = "sdk-name";
101829
102058
  /**
101830
102059
  * Build metadata request with SDK labels.
101831
- * @param {string} trn - Target TRN
101832
- * @param {string} appName - Application name label
101833
- * @returns {Promise<MessageInitShape<typeof SetMetadataRequestSchema>>} Metadata request
102060
+ * @param trn - Target TRN
102061
+ * @param appName - Application name label
102062
+ * @returns Metadata request
101834
102063
  */
101835
102064
  async function buildMetaRequest(trn$7, appName) {
101836
102065
  const packageJson$1 = await readPackageJson();
@@ -101875,10 +102104,10 @@ var ChangeSet = class {
101875
102104
  //#region src/cli/apply/services/application.ts
101876
102105
  /**
101877
102106
  * Apply application changes for the given phase.
101878
- * @param {OperatorClient} client - Operator client instance
101879
- * @param {ReturnType<typeof planApplication>} changeSet - Planned application changes
101880
- * @param {"create-update" | "delete"} [phase="create-update"] - Apply phase
101881
- * @returns {Promise<void>} Promise that resolves when applications are applied
102107
+ * @param client - Operator client instance
102108
+ * @param changeSet - Planned application changes
102109
+ * @param phase - Apply phase
102110
+ * @returns Promise that resolves when applications are applied
101882
102111
  */
101883
102112
  async function applyApplication(client, changeSet, phase = "create-update") {
101884
102113
  if (phase === "create-update") await Promise.all([...changeSet.creates.map(async (create$1) => {
@@ -101899,10 +102128,11 @@ function trn$6(workspaceId, name$1) {
101899
102128
  }
101900
102129
  /**
101901
102130
  * Plan application changes based on current and desired state.
101902
- * @param {PlanContext} context - Planning context
101903
- * @returns {Promise<ChangeSet<CreateApplication, UpdateApplication, DeleteApplication>>} Planned changes
102131
+ * @param context - Planning context
102132
+ * @returns Planned changes
101904
102133
  */
101905
- async function planApplication({ client, workspaceId, application, forRemoval }) {
102134
+ async function planApplication(context) {
102135
+ const { client, workspaceId, application, forRemoval } = context;
101906
102136
  const changeSet = new ChangeSet("Applications");
101907
102137
  const existingApplications = await fetchAll(async (pageToken) => {
101908
102138
  try {
@@ -102009,28 +102239,28 @@ function protoSubgraph(subgraph) {
102009
102239
  //#region src/cli/apply/services/idp.ts
102010
102240
  /**
102011
102241
  * Build the vault name for an IdP client.
102012
- * @param {string} namespaceName - IdP namespace name
102013
- * @param {string} clientName - IdP client name
102014
- * @returns {string} Vault name
102242
+ * @param namespaceName - IdP namespace name
102243
+ * @param clientName - IdP client name
102244
+ * @returns Vault name
102015
102245
  */
102016
102246
  function idpClientVaultName(namespaceName, clientName) {
102017
102247
  return `idp-${namespaceName}-${clientName}`;
102018
102248
  }
102019
102249
  /**
102020
102250
  * Build the secret name for an IdP client.
102021
- * @param {string} namespaceName - IdP namespace name
102022
- * @param {string} clientName - IdP client name
102023
- * @returns {string} Secret name
102251
+ * @param namespaceName - IdP namespace name
102252
+ * @param clientName - IdP client name
102253
+ * @returns Secret name
102024
102254
  */
102025
102255
  function idpClientSecretName(namespaceName, clientName) {
102026
102256
  return `client-secret-${namespaceName}-${clientName}`;
102027
102257
  }
102028
102258
  /**
102029
102259
  * Apply IdP-related changes for the given phase.
102030
- * @param {OperatorClient} client - Operator client instance
102031
- * @param {Awaited<ReturnType<typeof planIdP>>} result - Planned IdP changes
102032
- * @param {Exclude<ApplyPhase, "delete">} [phase="create-update"] - Apply phase
102033
- * @returns {Promise<void>} Promise that resolves when IdP changes are applied
102260
+ * @param client - Operator client instance
102261
+ * @param result - Planned IdP changes
102262
+ * @param phase - Apply phase
102263
+ * @returns Promise that resolves when IdP changes are applied
102034
102264
  */
102035
102265
  async function applyIdP(client, result, phase = "create-update") {
102036
102266
  const { changeSet } = result;
@@ -102091,10 +102321,11 @@ async function applyIdP(client, result, phase = "create-update") {
102091
102321
  }
102092
102322
  /**
102093
102323
  * Plan IdP-related changes based on current and desired state.
102094
- * @param {PlanContext} context - Planning context
102095
- * @returns {Promise<unknown>} Planned changes and metadata
102324
+ * @param context - Planning context
102325
+ * @returns Planned changes and metadata
102096
102326
  */
102097
- async function planIdP({ client, workspaceId, application, forRemoval }) {
102327
+ async function planIdP(context) {
102328
+ const { client, workspaceId, application, forRemoval } = context;
102098
102329
  const idps = forRemoval ? [] : application.idpServices;
102099
102330
  const { changeSet: serviceChangeSet, conflicts, unmanaged, resourceOwners } = await planServices$3(client, workspaceId, application.name, idps);
102100
102331
  const clientChangeSet = await planClients(client, workspaceId, idps, serviceChangeSet.deletes.map((del) => del.name));
@@ -102284,10 +102515,10 @@ function convertLang(lang) {
102284
102515
  //#region src/cli/apply/services/auth.ts
102285
102516
  /**
102286
102517
  * Apply auth-related changes for the given phase.
102287
- * @param {OperatorClient} client - Operator client instance
102288
- * @param {Awaited<ReturnType<typeof planAuth>>} result - Planned auth changes
102289
- * @param {Exclude<ApplyPhase, "delete">} [phase] - Apply phase (defaults to "create-update")
102290
- * @returns {Promise<void>} Promise that resolves when auth changes are applied
102518
+ * @param client - Operator client instance
102519
+ * @param result - Planned auth changes
102520
+ * @param phase - Apply phase (defaults to "create-update")
102521
+ * @returns Promise that resolves when auth changes are applied
102291
102522
  */
102292
102523
  async function applyAuth(client, result, phase = "create-update") {
102293
102524
  const { changeSet } = result;
@@ -102295,7 +102526,10 @@ async function applyAuth(client, result, phase = "create-update") {
102295
102526
  await Promise.all([...changeSet.service.creates.map(async (create$1) => {
102296
102527
  await client.createAuthService(create$1.request);
102297
102528
  await client.setMetadata(create$1.metaRequest);
102298
- }), ...changeSet.service.updates.map((update) => client.setMetadata(update.metaRequest))]);
102529
+ }), ...changeSet.service.updates.map(async (update) => {
102530
+ await client.updateAuthService(update.request);
102531
+ await client.setMetadata(update.metaRequest);
102532
+ })]);
102299
102533
  await Promise.all([...changeSet.idpConfig.creates.map(async (create$1) => {
102300
102534
  if (create$1.idpConfig.kind === "BuiltInIdP") create$1.request.idpConfig.config = await protoBuiltinIdPConfig(client, create$1.request.workspaceId, create$1.idpConfig);
102301
102535
  return client.createAuthIDPConfig(create$1.request);
@@ -102327,10 +102561,11 @@ async function applyAuth(client, result, phase = "create-update") {
102327
102561
  }
102328
102562
  /**
102329
102563
  * Plan auth-related changes based on current and desired state.
102330
- * @param {PlanContext} context - Planning context
102331
- * @returns {Promise<unknown>} Planned auth changes and metadata
102564
+ * @param context - Planning context
102565
+ * @returns Planned auth changes and metadata
102332
102566
  */
102333
- async function planAuth({ client, workspaceId, application, forRemoval }) {
102567
+ async function planAuth(context) {
102568
+ const { client, workspaceId, application, forRemoval } = context;
102334
102569
  const auths = [];
102335
102570
  if (!forRemoval && application.authService) {
102336
102571
  await application.authService.resolveNamespaces();
@@ -102414,6 +102649,11 @@ async function planServices$2(client, workspaceId, appName, auths) {
102414
102649
  });
102415
102650
  changeSet.updates.push({
102416
102651
  name: config.name,
102652
+ request: {
102653
+ workspaceId,
102654
+ namespaceName: config.name,
102655
+ publishSessionEvents: config.publishSessionEvents
102656
+ },
102417
102657
  metaRequest
102418
102658
  });
102419
102659
  delete existingServices[config.name];
@@ -102421,7 +102661,8 @@ async function planServices$2(client, workspaceId, appName, auths) {
102421
102661
  name: config.name,
102422
102662
  request: {
102423
102663
  workspaceId,
102424
- namespaceName: config.name
102664
+ namespaceName: config.name,
102665
+ publishSessionEvents: config.publishSessionEvents
102425
102666
  },
102426
102667
  metaRequest
102427
102668
  });
@@ -103138,10 +103379,10 @@ function protoSCIMAttribute(attr) {
103138
103379
  //#region src/cli/apply/services/confirm.ts
103139
103380
  /**
103140
103381
  * Confirm reassignment of resources when owner conflicts are detected.
103141
- * @param {OwnerConflict[]} conflicts - Detected owner conflicts
103142
- * @param {string} appName - Target application name
103143
- * @param {boolean} yes - Whether to auto-confirm without prompting
103144
- * @returns {Promise<void>} Promise that resolves when confirmation completes
103382
+ * @param conflicts - Detected owner conflicts
103383
+ * @param appName - Target application name
103384
+ * @param yes - Whether to auto-confirm without prompting
103385
+ * @returns Promise that resolves when confirmation completes
103145
103386
  */
103146
103387
  async function confirmOwnerConflict(conflicts, appName, yes) {
103147
103388
  if (conflicts.length === 0) return;
@@ -103167,10 +103408,10 @@ async function confirmOwnerConflict(conflicts, appName, yes) {
103167
103408
  }
103168
103409
  /**
103169
103410
  * Confirm allowing tailor-sdk to manage previously unmanaged resources.
103170
- * @param {UnmanagedResource[]} resources - Unmanaged resources
103171
- * @param {string} appName - Target application name
103172
- * @param {boolean} yes - Whether to auto-confirm without prompting
103173
- * @returns {Promise<void>} Promise that resolves when confirmation completes
103411
+ * @param resources - Unmanaged resources
103412
+ * @param appName - Target application name
103413
+ * @param yes - Whether to auto-confirm without prompting
103414
+ * @returns Promise that resolves when confirmation completes
103174
103415
  */
103175
103416
  async function confirmUnmanagedResources(resources, appName, yes) {
103176
103417
  if (resources.length === 0) return;
@@ -103195,9 +103436,9 @@ async function confirmUnmanagedResources(resources, appName, yes) {
103195
103436
  }
103196
103437
  /**
103197
103438
  * Confirm deletion of important resources.
103198
- * @param {ImportantResourceDeletion[]} resources - Resources scheduled for deletion
103199
- * @param {boolean} yes - Whether to auto-confirm without prompting
103200
- * @returns {Promise<void>} Promise that resolves when confirmation completes
103439
+ * @param resources - Resources scheduled for deletion
103440
+ * @param yes - Whether to auto-confirm without prompting
103441
+ * @returns Promise that resolves when confirmation completes
103201
103442
  */
103202
103443
  async function confirmImportantResourceDeletion(resources, yes) {
103203
103444
  if (resources.length === 0) return;
@@ -103223,10 +103464,10 @@ async function confirmImportantResourceDeletion(resources, yes) {
103223
103464
  //#region src/cli/apply/services/executor.ts
103224
103465
  /**
103225
103466
  * Apply executor-related changes for the given phase.
103226
- * @param {OperatorClient} client - Operator client instance
103227
- * @param {Awaited<ReturnType<typeof planExecutor>>} result - Planned executor changes
103228
- * @param {Extract<ApplyPhase, "create-update" | "delete">} [phase] - Apply phase (defaults to "create-update")
103229
- * @returns {Promise<void>} Promise that resolves when executors are applied
103467
+ * @param client - Operator client instance
103468
+ * @param result - Planned executor changes
103469
+ * @param phase - Apply phase (defaults to "create-update")
103470
+ * @returns Promise that resolves when executors are applied
103230
103471
  */
103231
103472
  async function applyExecutor(client, result, phase = "create-update") {
103232
103473
  const { changeSet } = result;
@@ -103244,10 +103485,11 @@ function trn$3(workspaceId, name$1) {
103244
103485
  }
103245
103486
  /**
103246
103487
  * Plan executor-related changes based on current and desired state.
103247
- * @param {PlanContext} context - Planning context
103248
- * @returns {Promise<ChangeSet<CreateExecutor, UpdateExecutor, DeleteExecutor>>} Planned changes
103488
+ * @param context - Planning context
103489
+ * @returns Planned changes
103249
103490
  */
103250
- async function planExecutor({ client, workspaceId, application, forRemoval }) {
103491
+ async function planExecutor(context) {
103492
+ const { client, workspaceId, application, forRemoval } = context;
103251
103493
  const changeSet = new ChangeSet("Executors");
103252
103494
  const conflicts = [];
103253
103495
  const unmanaged = [];
@@ -103326,8 +103568,8 @@ async function planExecutor({ client, workspaceId, application, forRemoval }) {
103326
103568
  /**
103327
103569
  * Build args expression for resolverExecuted trigger.
103328
103570
  * Transforms server's succeeded/failed fields to success/result/error fields.
103329
- * @param {string} [additionalFields] - Additional fields to include in the args expression
103330
- * @returns {string} JavaScript expression for resolverExecuted trigger args
103571
+ * @param additionalFields - Additional fields to include in the args expression
103572
+ * @returns JavaScript expression for resolverExecuted trigger args
103331
103573
  */
103332
103574
  function buildResolverExecutedArgsExpr(additionalFields) {
103333
103575
  const baseFields = `...args, appNamespace: args.namespaceName, success: !!args.succeeded, result: args.succeeded?.result.resolver, error: args.failed?.error`;
@@ -103511,10 +103753,10 @@ const SCALAR_TYPE_MAP = {
103511
103753
  };
103512
103754
  /**
103513
103755
  * Apply resolver pipeline changes for the given phase.
103514
- * @param {OperatorClient} client - Operator client instance
103515
- * @param {Awaited<ReturnType<typeof planPipeline>>} result - Planned pipeline changes
103516
- * @param {Exclude<ApplyPhase, "delete">} [phase="create-update"] - Apply phase
103517
- * @returns {Promise<void>} Promise that resolves when pipeline changes are applied
103756
+ * @param client - Operator client instance
103757
+ * @param result - Planned pipeline changes
103758
+ * @param phase - Apply phase
103759
+ * @returns Promise that resolves when pipeline changes are applied
103518
103760
  */
103519
103761
  async function applyPipeline(client, result, phase = "create-update") {
103520
103762
  const { changeSet } = result;
@@ -103532,10 +103774,11 @@ async function applyPipeline(client, result, phase = "create-update") {
103532
103774
  }
103533
103775
  /**
103534
103776
  * Plan resolver pipeline changes based on current and desired state.
103535
- * @param {PlanContext} context - Planning context
103536
- * @returns {Promise<unknown>} Planned changes
103777
+ * @param context - Planning context
103778
+ * @returns Planned changes
103537
103779
  */
103538
- async function planPipeline({ client, workspaceId, application, forRemoval }) {
103780
+ async function planPipeline(context) {
103781
+ const { client, workspaceId, application, forRemoval } = context;
103539
103782
  const pipelines = [];
103540
103783
  if (!forRemoval) for (const pipeline of application.resolverServices) {
103541
103784
  await pipeline.loadResolvers();
@@ -103771,10 +104014,10 @@ function protoFields(fields, baseName, isInput) {
103771
104014
  //#region src/cli/apply/services/staticwebsite.ts
103772
104015
  /**
103773
104016
  * Apply static website changes for the given phase.
103774
- * @param {OperatorClient} client - Operator client instance
103775
- * @param {Awaited<ReturnType<typeof planStaticWebsite>>} result - Planned static website changes
103776
- * @param {Extract<ApplyPhase, "create-update" | "delete">} [phase="create-update"] - Apply phase
103777
- * @returns {Promise<void>} Promise that resolves when static websites are applied
104017
+ * @param client - Operator client instance
104018
+ * @param result - Planned static website changes
104019
+ * @param phase - Apply phase
104020
+ * @returns Promise that resolves when static websites are applied
103778
104021
  */
103779
104022
  async function applyStaticWebsite(client, result, phase = "create-update") {
103780
104023
  const { changeSet } = result;
@@ -103792,10 +104035,11 @@ function trn$1(workspaceId, name$1) {
103792
104035
  }
103793
104036
  /**
103794
104037
  * Plan static website changes based on current and desired state.
103795
- * @param {PlanContext} context - Planning context
103796
- * @returns {Promise<unknown>} Planned changes
104038
+ * @param context - Planning context
104039
+ * @returns Planned changes
103797
104040
  */
103798
- async function planStaticWebsite({ client, workspaceId, application, forRemoval }) {
104041
+ async function planStaticWebsite(context) {
104042
+ const { client, workspaceId, application, forRemoval } = context;
103799
104043
  const changeSet = new ChangeSet("StaticWebsites");
103800
104044
  const conflicts = [];
103801
104045
  const unmanaged = [];
@@ -103886,10 +104130,10 @@ async function planStaticWebsite({ client, workspaceId, application, forRemoval
103886
104130
  //#region src/cli/apply/services/tailordb.ts
103887
104131
  /**
103888
104132
  * Apply TailorDB-related changes for the given phase.
103889
- * @param {OperatorClient} client - Operator client instance
103890
- * @param {Awaited<ReturnType<typeof planTailorDB>>} result - Planned TailorDB changes
103891
- * @param {Exclude<ApplyPhase, "delete">} [phase] - Apply phase (defaults to "create-update")
103892
- * @returns {Promise<void>} Promise that resolves when TailorDB changes are applied
104133
+ * @param client - Operator client instance
104134
+ * @param result - Planned TailorDB changes
104135
+ * @param phase - Apply phase (defaults to "create-update")
104136
+ * @returns Promise that resolves when TailorDB changes are applied
103893
104137
  */
103894
104138
  async function applyTailorDB(client, result, phase = "create-update") {
103895
104139
  const { changeSet } = result;
@@ -103907,10 +104151,11 @@ async function applyTailorDB(client, result, phase = "create-update") {
103907
104151
  }
103908
104152
  /**
103909
104153
  * Plan TailorDB-related changes based on current and desired state.
103910
- * @param {PlanContext} context - Planning context
103911
- * @returns {Promise<unknown>} Planned changes
104154
+ * @param context - Planning context
104155
+ * @returns Planned changes
103912
104156
  */
103913
- async function planTailorDB({ client, workspaceId, application, forRemoval }) {
104157
+ async function planTailorDB(context) {
104158
+ const { client, workspaceId, application, forRemoval } = context;
103914
104159
  const tailordbs = [];
103915
104160
  if (!forRemoval) for (const tailordb of application.tailorDBServices) {
103916
104161
  await tailordb.loadTypes();
@@ -104440,10 +104685,10 @@ function protoGqlOperand(operand) {
104440
104685
  //#region src/cli/apply/services/workflow.ts
104441
104686
  /**
104442
104687
  * Apply workflow changes for the given phase.
104443
- * @param {OperatorClient} client - Operator client instance
104444
- * @param {Awaited<ReturnType<typeof planWorkflow>>} result - Planned workflow changes
104445
- * @param {Extract<ApplyPhase, "create-update" | "delete">} [phase="create-update"] - Apply phase
104446
- * @returns {Promise<void>} Promise that resolves when workflows are applied
104688
+ * @param client - Operator client instance
104689
+ * @param result - Planned workflow changes
104690
+ * @param phase - Apply phase
104691
+ * @returns Promise that resolves when workflows are applied
104447
104692
  */
104448
104693
  async function applyWorkflow(client, result, phase = "create-update") {
104449
104694
  const { changeSet, appName } = result;
@@ -104475,9 +104720,9 @@ async function applyWorkflow(client, result, phase = "create-update") {
104475
104720
  }
104476
104721
  /**
104477
104722
  * Filter job function versions to only include those used by a workflow
104478
- * @param {{ [key: string]: bigint }} allVersions - Map of job function names to versions
104479
- * @param {string[]} usedJobNames - Job names used by the workflow
104480
- * @returns {{ [key: string]: bigint }} Filtered job function versions
104723
+ * @param allVersions - Map of job function names to versions
104724
+ * @param usedJobNames - Job names used by the workflow
104725
+ * @returns Filtered job function versions
104481
104726
  */
104482
104727
  function filterJobFunctionVersions(allVersions, usedJobNames) {
104483
104728
  const filtered = {};
@@ -104489,10 +104734,10 @@ function filterJobFunctionVersions(allVersions, usedJobNames) {
104489
104734
  * Only registers jobs that are actually used (based on usedJobNames in changeSet).
104490
104735
  * Uses create for new jobs and update for existing jobs.
104491
104736
  * Sets metadata on used JobFunctions and removes metadata from unused ones.
104492
- * @param {OperatorClient} client - Operator client instance
104493
- * @param {ChangeSet<CreateWorkflow, UpdateWorkflow, DeleteWorkflow>} changeSet - Workflow change set
104494
- * @param {string} appName - Application name
104495
- * @returns {Promise<{ [key: string]: bigint }>} Map of job function names to versions
104737
+ * @param client - Operator client instance
104738
+ * @param changeSet - Workflow change set
104739
+ * @param appName - Application name
104740
+ * @returns Map of job function names to versions
104496
104741
  */
104497
104742
  async function registerJobFunctions(client, changeSet, appName) {
104498
104743
  const jobFunctionVersions = {};
@@ -104546,12 +104791,12 @@ function jobFunctionTrn(workspaceId, name$1) {
104546
104791
  }
104547
104792
  /**
104548
104793
  * Plan workflow changes and job functions based on current and desired state.
104549
- * @param {OperatorClient} client - Operator client instance
104550
- * @param {string} workspaceId - Workspace ID
104551
- * @param {string} appName - Application name
104552
- * @param {Record<string, Workflow>} workflows - Parsed workflows
104553
- * @param {Record<string, string[]>} mainJobDeps - Main job dependencies by workflow
104554
- * @returns {Promise<unknown>} Planned workflow changes
104794
+ * @param client - Operator client instance
104795
+ * @param workspaceId - Workspace ID
104796
+ * @param appName - Application name
104797
+ * @param workflows - Parsed workflows
104798
+ * @param mainJobDeps - Main job dependencies by workflow
104799
+ * @returns Planned workflow changes
104555
104800
  */
104556
104801
  async function planWorkflow(client, workspaceId, appName, workflows, mainJobDeps) {
104557
104802
  const changeSet = new ChangeSet("Workflows");
@@ -104646,8 +104891,8 @@ async function loadWorkflowScripts() {
104646
104891
  //#region src/cli/apply/index.ts
104647
104892
  /**
104648
104893
  * Apply the configured application to the Tailor platform.
104649
- * @param {ApplyOptions} [options] - Options for apply execution
104650
- * @returns {Promise<void>} Promise that resolves when apply completes
104894
+ * @param options - Options for apply execution
104895
+ * @returns Promise that resolves when apply completes
104651
104896
  */
104652
104897
  async function apply(options) {
104653
104898
  const { config, configPath } = await loadConfig(options?.configPath);
@@ -104856,8 +105101,8 @@ var DependencyGraphManager = class {
104856
105101
  }
104857
105102
  /**
104858
105103
  * Build the dependency graph from the given files.
104859
- * @param {string[]} filePaths - File paths to analyze
104860
- * @returns {Promise<void>} Promise that resolves when the graph is built
105104
+ * @param filePaths - File paths to analyze
105105
+ * @returns Promise that resolves when the graph is built
104861
105106
  */
104862
105107
  async buildGraph(filePaths) {
104863
105108
  try {
@@ -104902,8 +105147,8 @@ var DependencyGraphManager = class {
104902
105147
  }
104903
105148
  /**
104904
105149
  * Get every file that depends on the specified file (all levels).
104905
- * @param {string} filePath - File path to inspect
104906
- * @returns {string[]} List of dependent files
105150
+ * @param filePath - File path to inspect
105151
+ * @returns List of dependent files
104907
105152
  */
104908
105153
  getDependents(filePath) {
104909
105154
  const visited = /* @__PURE__ */ new Set();
@@ -104911,8 +105156,8 @@ var DependencyGraphManager = class {
104911
105156
  }
104912
105157
  /**
104913
105158
  * Get every file the specified file depends on (all levels).
104914
- * @param {string} filePath - File path to inspect
104915
- * @returns {string[]} List of dependency files
105159
+ * @param filePath - File path to inspect
105160
+ * @returns List of dependency files
104916
105161
  */
104917
105162
  getDependencies(filePath) {
104918
105163
  const visited = /* @__PURE__ */ new Set();
@@ -104920,7 +105165,7 @@ var DependencyGraphManager = class {
104920
105165
  }
104921
105166
  /**
104922
105167
  * Detect circular dependencies.
104923
- * @returns {string[][]} List of circular dependency cycles
105168
+ * @returns List of circular dependency cycles
104924
105169
  */
104925
105170
  findCircularDependencies() {
104926
105171
  if (!this.madgeInstance) return [];
@@ -104933,7 +105178,7 @@ var DependencyGraphManager = class {
104933
105178
  }
104934
105179
  /**
104935
105180
  * Add a node to the graph.
104936
- * @param {string} filePath - File path to add as a node
105181
+ * @param filePath - File path to add as a node
104937
105182
  */
104938
105183
  addNode(filePath) {
104939
105184
  const absolutePath = path$20.resolve(filePath);
@@ -104945,7 +105190,7 @@ var DependencyGraphManager = class {
104945
105190
  }
104946
105191
  /**
104947
105192
  * Remove a node from the graph.
104948
- * @param {string} filePath - File path to remove from the graph
105193
+ * @param filePath - File path to remove from the graph
104949
105194
  */
104950
105195
  removeNode(filePath) {
104951
105196
  const absolutePath = path$20.resolve(filePath);
@@ -104963,7 +105208,7 @@ var DependencyGraphManager = class {
104963
105208
  }
104964
105209
  /**
104965
105210
  * Get graph statistics.
104966
- * @returns {GraphStats} Current dependency graph statistics
105211
+ * @returns Current dependency graph statistics
104967
105212
  */
104968
105213
  getGraphStats() {
104969
105214
  let edgeCount = 0;
@@ -105057,9 +105302,9 @@ var DependencyWatcher = class {
105057
105302
  }
105058
105303
  /**
105059
105304
  * Add a watch group.
105060
- * @param {string} groupId - Group identifier
105061
- * @param {string[]} patterns - Glob patterns to watch
105062
- * @returns {Promise<void>} Promise that resolves when the group is added
105305
+ * @param groupId - Group identifier
105306
+ * @param patterns - Glob patterns to watch
105307
+ * @returns Promise that resolves when the group is added
105063
105308
  */
105064
105309
  async addWatchGroup(groupId, patterns) {
105065
105310
  this.validateWatchGroup(groupId, patterns);
@@ -105083,8 +105328,8 @@ var DependencyWatcher = class {
105083
105328
  }
105084
105329
  /**
105085
105330
  * Remove a watch group.
105086
- * @param {string} groupId - Group identifier
105087
- * @returns {Promise<void>} Promise that resolves when the group is removed
105331
+ * @param groupId - Group identifier
105332
+ * @returns Promise that resolves when the group is removed
105088
105333
  */
105089
105334
  async removeWatchGroup(groupId) {
105090
105335
  const watchGroup = this.watchGroups.get(groupId);
@@ -105116,8 +105361,7 @@ var DependencyWatcher = class {
105116
105361
  }
105117
105362
  /**
105118
105363
  * Set the error handling callback.
105119
- * @param {ErrorCallback} callback - Error callback
105120
- * @returns {void}
105364
+ * @param callback - Error callback
105121
105365
  */
105122
105366
  onError(callback) {
105123
105367
  this.errorCallback = callback;
@@ -105137,8 +105381,8 @@ var DependencyWatcher = class {
105137
105381
  }
105138
105382
  /**
105139
105383
  * Compute the impact scope of a specific file.
105140
- * @param {string} filePath - File path to analyze
105141
- * @returns {ImpactAnalysisResult} Impact analysis result for the file
105384
+ * @param filePath - File path to analyze
105385
+ * @returns Impact analysis result for the file
105142
105386
  */
105143
105387
  calculateImpact(filePath) {
105144
105388
  const cacheKey = `impact:${filePath}`;
@@ -105156,14 +105400,14 @@ var DependencyWatcher = class {
105156
105400
  }
105157
105401
  /**
105158
105402
  * Detect circular dependencies.
105159
- * @returns {string[][]} List of circular dependency cycles
105403
+ * @returns List of circular dependency cycles
105160
105404
  */
105161
105405
  detectCircularDependencies() {
105162
105406
  return this.dependencyGraphManager.findCircularDependencies();
105163
105407
  }
105164
105408
  /**
105165
105409
  * Retrieve the current watcher status.
105166
- * @returns {WatchStatus} Snapshot of the current watcher status
105410
+ * @returns Snapshot of the current watcher status
105167
105411
  */
105168
105412
  getWatchStatus() {
105169
105413
  let fileCount = 0;
@@ -105188,7 +105432,7 @@ var DependencyWatcher = class {
105188
105432
  restartCallback = null;
105189
105433
  /**
105190
105434
  * Set the restart callback to be called when a file change is detected.
105191
- * @param {() => void} callback - Restart callback
105435
+ * @param callback - Restart callback
105192
105436
  */
105193
105437
  setRestartCallback(callback) {
105194
105438
  this.restartCallback = callback;
@@ -105244,7 +105488,6 @@ var DependencyWatcher = class {
105244
105488
  }
105245
105489
  /**
105246
105490
  * Register signal handlers.
105247
- * @returns {void}
105248
105491
  */
105249
105492
  setupSignalHandlers() {
105250
105493
  if (this.signalHandlersRegistered) return;
@@ -105264,7 +105507,6 @@ var DependencyWatcher = class {
105264
105507
  }
105265
105508
  /**
105266
105509
  * Remove signal handlers.
105267
- * @returns {void}
105268
105510
  */
105269
105511
  removeSignalHandlers() {
105270
105512
  if (!this.signalHandlersRegistered) return;
@@ -105564,8 +105806,8 @@ var GenerationManager = class {
105564
105806
  };
105565
105807
  /**
105566
105808
  * Run code generation using the Tailor configuration and generators.
105567
- * @param {GenerateOptions} [options] - Generation options
105568
- * @returns {Promise<void>} Promise that resolves when generation (and watch, if enabled) completes
105809
+ * @param options - Generation options
105810
+ * @returns Promise that resolves when generation (and watch, if enabled) completes
105569
105811
  */
105570
105812
  async function generate(options) {
105571
105813
  const { config, generators, configPath } = await loadConfig(options?.configPath);
@@ -105607,8 +105849,8 @@ const generateCommand = defineCommand({
105607
105849
  //#region src/cli/machineuser/list.ts
105608
105850
  /**
105609
105851
  * Map a MachineUser protobuf message to CLI-friendly info.
105610
- * @param {MachineUser} user - Machine user resource
105611
- * @returns {MachineUserInfo} Flattened machine user info
105852
+ * @param user - Machine user resource
105853
+ * @returns Flattened machine user info
105612
105854
  */
105613
105855
  function machineUserInfo(user) {
105614
105856
  return {
@@ -105621,8 +105863,8 @@ function machineUserInfo(user) {
105621
105863
  }
105622
105864
  /**
105623
105865
  * List machine users for the current application.
105624
- * @param {ListMachineUsersOptions} [options] - Machine user listing options
105625
- * @returns {Promise<MachineUserInfo[]>} List of machine users
105866
+ * @param options - Machine user listing options
105867
+ * @returns List of machine users
105626
105868
  */
105627
105869
  async function listMachineUsers(options) {
105628
105870
  const client = await initOperatorClient(await loadAccessToken({
@@ -105672,8 +105914,8 @@ const listCommand$3 = defineCommand({
105672
105914
  //#region src/cli/machineuser/token.ts
105673
105915
  /**
105674
105916
  * Get a machine user access token for the current application.
105675
- * @param {GetMachineUserTokenOptions} options - Token retrieval options
105676
- * @returns {Promise<MachineUserTokenInfo>} Machine user token info
105917
+ * @param options - Token retrieval options
105918
+ * @returns Machine user token info
105677
105919
  */
105678
105920
  async function getMachineUserToken(options) {
105679
105921
  const client = await initOperatorClient(await loadAccessToken({
@@ -105747,8 +105989,8 @@ const grantTypeToString = (grantType) => {
105747
105989
  };
105748
105990
  /**
105749
105991
  * Transform an AuthOAuth2Client into CLI-friendly OAuth2 client info.
105750
- * @param {AuthOAuth2Client} client - OAuth2 client resource
105751
- * @returns {OAuth2ClientInfo} Flattened OAuth2 client info
105992
+ * @param client - OAuth2 client resource
105993
+ * @returns Flattened OAuth2 client info
105752
105994
  */
105753
105995
  function toOAuth2ClientInfo(client) {
105754
105996
  return {
@@ -105762,8 +106004,8 @@ function toOAuth2ClientInfo(client) {
105762
106004
  }
105763
106005
  /**
105764
106006
  * Transform an AuthOAuth2Client into OAuth2 client credentials info.
105765
- * @param {AuthOAuth2Client} client - OAuth2 client resource
105766
- * @returns {OAuth2ClientCredentials} OAuth2 client credentials
106007
+ * @param client - OAuth2 client resource
106008
+ * @returns OAuth2 client credentials
105767
106009
  */
105768
106010
  function toOAuth2ClientCredentials(client) {
105769
106011
  return {
@@ -105781,8 +106023,8 @@ function toOAuth2ClientCredentials(client) {
105781
106023
  //#region src/cli/oauth2client/get.ts
105782
106024
  /**
105783
106025
  * Get OAuth2 client credentials for the current application.
105784
- * @param {GetOAuth2ClientOptions} options - OAuth2 client lookup options
105785
- * @returns {Promise<OAuth2ClientCredentials>} OAuth2 client credentials
106026
+ * @param options - OAuth2 client lookup options
106027
+ * @returns OAuth2 client credentials
105786
106028
  */
105787
106029
  async function getOAuth2Client(options) {
105788
106030
  const client = await initOperatorClient(await loadAccessToken({
@@ -105841,8 +106083,8 @@ const getCommand$1 = defineCommand({
105841
106083
  //#region src/cli/oauth2client/list.ts
105842
106084
  /**
105843
106085
  * List OAuth2 clients for the current application.
105844
- * @param {ListOAuth2ClientsOptions} [options] - OAuth2 client listing options
105845
- * @returns {Promise<OAuth2ClientInfo[]>} List of OAuth2 clients
106086
+ * @param options - OAuth2 client listing options
106087
+ * @returns List of OAuth2 clients
105846
106088
  */
105847
106089
  async function listOAuth2Clients(options) {
105848
106090
  const client = await initOperatorClient(await loadAccessToken({
@@ -105938,8 +106180,8 @@ async function execRemove(client, workspaceId, application, confirm) {
105938
106180
  }
105939
106181
  /**
105940
106182
  * Remove all resources managed by the current application.
105941
- * @param {RemoveOptions} [options] - Remove options
105942
- * @returns {Promise<void>} Promise that resolves when removal completes
106183
+ * @param options - Remove options
106184
+ * @returns Promise that resolves when removal completes
105943
106185
  */
105944
106186
  async function remove(options) {
105945
106187
  const { client, workspaceId, application } = await loadOptions$1(options);
@@ -106015,8 +106257,8 @@ function applicationInfo(app) {
106015
106257
  }
106016
106258
  /**
106017
106259
  * Show applied application information for the current workspace.
106018
- * @param {ShowOptions} [options] - Show options
106019
- * @returns {Promise<ApplicationInfo>} Application information
106260
+ * @param options - Show options
106261
+ * @returns Application information
106020
106262
  */
106021
106263
  async function show(options) {
106022
106264
  const client = await initOperatorClient(await loadAccessToken({
@@ -106068,14 +106310,191 @@ const showCommand = defineCommand({
106068
106310
  })
106069
106311
  });
106070
106312
 
106313
+ //#endregion
106314
+ //#region src/cli/tailordb/truncate.ts
106315
+ async function truncateSingleType(options, client) {
106316
+ await client.truncateTailorDBType({
106317
+ workspaceId: options.workspaceId,
106318
+ namespaceName: options.namespaceName,
106319
+ tailordbTypeName: options.typeName
106320
+ });
106321
+ logger.success(`Truncated type "${options.typeName}" in namespace "${options.namespaceName}"`);
106322
+ }
106323
+ async function truncateNamespace(workspaceId, namespaceName, client) {
106324
+ await client.truncateTailorDBTypes({
106325
+ workspaceId,
106326
+ namespaceName
106327
+ });
106328
+ logger.success(`Truncated all types in namespace "${namespaceName}"`);
106329
+ }
106330
+ async function getAllNamespaces(configPath) {
106331
+ const { config } = await loadConfig(configPath);
106332
+ const namespaces = /* @__PURE__ */ new Set();
106333
+ if (config.db) for (const [namespaceName] of Object.entries(config.db)) namespaces.add(namespaceName);
106334
+ return Array.from(namespaces);
106335
+ }
106336
+ async function getTypeNamespace(workspaceId, typeName, client, configPath) {
106337
+ const namespaces = await getAllNamespaces(configPath);
106338
+ for (const namespace of namespaces) try {
106339
+ const { tailordbTypes } = await client.listTailorDBTypes({
106340
+ workspaceId,
106341
+ namespaceName: namespace
106342
+ });
106343
+ if (tailordbTypes.some((type) => type.name === typeName)) return namespace;
106344
+ } catch {
106345
+ continue;
106346
+ }
106347
+ return null;
106348
+ }
106349
+ /**
106350
+ * Truncate TailorDB data based on the given options.
106351
+ * @param options - Truncate options (all, namespace, or types)
106352
+ * @returns Promise that resolves when truncation completes
106353
+ */
106354
+ async function truncate(options) {
106355
+ return await $truncate({
106356
+ ...options,
106357
+ yes: true
106358
+ });
106359
+ }
106360
+ async function $truncate(options) {
106361
+ const client = await initOperatorClient(await loadAccessToken({
106362
+ useProfile: true,
106363
+ profile: options?.profile
106364
+ }));
106365
+ const workspaceId = loadWorkspaceId({
106366
+ workspaceId: options?.workspaceId,
106367
+ profile: options?.profile
106368
+ });
106369
+ const hasTypes = options?.types && options.types.length > 0;
106370
+ const hasNamespace = !!options?.namespace;
106371
+ const hasAll = !!options?.all;
106372
+ const optionCount = [
106373
+ hasAll,
106374
+ hasNamespace,
106375
+ hasTypes
106376
+ ].filter(Boolean).length;
106377
+ if (optionCount === 0) throw new Error("Please specify one of: --all, --namespace <name>, or type names");
106378
+ if (optionCount > 1) throw new Error("Options --all, --namespace, and type names are mutually exclusive. Please specify only one.");
106379
+ const namespaces = await getAllNamespaces(options?.configPath);
106380
+ if (hasAll) {
106381
+ if (namespaces.length === 0) {
106382
+ logger.warn("No namespaces found in config file.");
106383
+ return;
106384
+ }
106385
+ if (!options?.yes) {
106386
+ const namespaceList = namespaces.join(", ");
106387
+ if (!await logger.prompt(`This will truncate ALL tables in the following namespaces: ${namespaceList}. Continue? (yes/no)`, {
106388
+ type: "confirm",
106389
+ initial: false
106390
+ })) {
106391
+ logger.info("Truncate cancelled.");
106392
+ return;
106393
+ }
106394
+ }
106395
+ for (const namespace of namespaces) await truncateNamespace(workspaceId, namespace, client);
106396
+ logger.success("Truncated all tables in all namespaces");
106397
+ return;
106398
+ }
106399
+ if (hasNamespace && options?.namespace) {
106400
+ const namespace = options.namespace;
106401
+ if (!namespaces.includes(namespace)) throw new Error(`Namespace "${namespace}" not found in config. Available namespaces: ${namespaces.join(", ")}`);
106402
+ if (!options.yes) {
106403
+ if (!await logger.prompt(`This will truncate ALL tables in namespace "${namespace}". Continue? (yes/no)`, {
106404
+ type: "confirm",
106405
+ initial: false
106406
+ })) {
106407
+ logger.info("Truncate cancelled.");
106408
+ return;
106409
+ }
106410
+ }
106411
+ await truncateNamespace(workspaceId, namespace, client);
106412
+ return;
106413
+ }
106414
+ if (hasTypes && options?.types) {
106415
+ const typeNames = options.types;
106416
+ const typeNamespaceMap = /* @__PURE__ */ new Map();
106417
+ const notFoundTypes = [];
106418
+ for (const typeName of typeNames) {
106419
+ const namespace = await getTypeNamespace(workspaceId, typeName, client, options.configPath);
106420
+ if (namespace) typeNamespaceMap.set(typeName, namespace);
106421
+ else notFoundTypes.push(typeName);
106422
+ }
106423
+ if (notFoundTypes.length > 0) throw new Error(`The following types were not found in any namespace: ${notFoundTypes.join(", ")}`);
106424
+ if (!options.yes) {
106425
+ const typeList = typeNames.join(", ");
106426
+ if (!await logger.prompt(`This will truncate the following types: ${typeList}. Continue? (yes/no)`, {
106427
+ type: "confirm",
106428
+ initial: false
106429
+ })) {
106430
+ logger.info("Truncate cancelled.");
106431
+ return;
106432
+ }
106433
+ }
106434
+ for (const typeName of typeNames) {
106435
+ const namespace = typeNamespaceMap.get(typeName);
106436
+ if (!namespace) continue;
106437
+ await truncateSingleType({
106438
+ workspaceId,
106439
+ namespaceName: namespace,
106440
+ typeName
106441
+ }, client);
106442
+ }
106443
+ }
106444
+ }
106445
+ const truncateCommand = defineCommand({
106446
+ meta: {
106447
+ name: "truncate",
106448
+ description: "Truncate TailorDB tables"
106449
+ },
106450
+ args: {
106451
+ ...commonArgs,
106452
+ types: {
106453
+ type: "positional",
106454
+ description: "Type names to truncate",
106455
+ required: false
106456
+ },
106457
+ all: {
106458
+ type: "boolean",
106459
+ description: "Truncate all tables in all namespaces",
106460
+ default: false,
106461
+ alias: "a"
106462
+ },
106463
+ namespace: {
106464
+ type: "string",
106465
+ description: "Truncate all tables in specified namespace",
106466
+ alias: "n"
106467
+ },
106468
+ yes: {
106469
+ type: "boolean",
106470
+ description: "Skip confirmation prompt",
106471
+ alias: "y",
106472
+ default: false
106473
+ },
106474
+ ...deploymentArgs
106475
+ },
106476
+ run: withCommonArgs(async (args) => {
106477
+ const types$2 = args._.length > 0 ? args._.map((arg) => String(arg)).filter(Boolean) : void 0;
106478
+ await $truncate({
106479
+ workspaceId: args["workspace-id"],
106480
+ profile: args.profile,
106481
+ configPath: args.config,
106482
+ all: args.all,
106483
+ namespace: args.namespace,
106484
+ types: types$2,
106485
+ yes: args.yes
106486
+ });
106487
+ })
106488
+ });
106489
+
106071
106490
  //#endregion
106072
106491
  //#region src/cli/utils/format.ts
106073
106492
  /**
106074
106493
  * Formats a table with consistent single-line border style.
106075
106494
  * Use this instead of importing `table` directly.
106076
- * @param {unknown[][]} data - Table data
106077
- * @param {TableUserConfig} [config] - Table configuration
106078
- * @returns {string} Formatted table string
106495
+ * @param data - Table data
106496
+ * @param config - Table configuration
106497
+ * @returns Formatted table string
106079
106498
  */
106080
106499
  function formatTable(data$1, config) {
106081
106500
  return table(data$1, {
@@ -106085,8 +106504,8 @@ function formatTable(data$1, config) {
106085
106504
  }
106086
106505
  /**
106087
106506
  * Formats a key-value table with single-line border style.
106088
- * @param {[string, string][]} data - Key-value pairs
106089
- * @returns {string} Formatted key-value table string
106507
+ * @param data - Key-value pairs
106508
+ * @returns Formatted key-value table string
106090
106509
  */
106091
106510
  function formatKeyValueTable(data$1) {
106092
106511
  return formatTable(data$1, { singleLine: true });
@@ -106094,9 +106513,9 @@ function formatKeyValueTable(data$1) {
106094
106513
  /**
106095
106514
  * Formats a table with headers, using single-line border style.
106096
106515
  * Draws horizontal lines only at top, after header, and bottom.
106097
- * @param {string[]} headers - Table header labels
106098
- * @param {string[][]} rows - Table rows
106099
- * @returns {string} Formatted table string with headers
106516
+ * @param headers - Table header labels
106517
+ * @param rows - Table rows
106518
+ * @returns Formatted table string with headers
106100
106519
  */
106101
106520
  function formatTableWithHeaders(headers, rows) {
106102
106521
  return formatTable([headers, ...rows], { drawHorizontalLine: (lineIndex, rowCount) => {
@@ -106105,8 +106524,8 @@ function formatTableWithHeaders(headers, rows) {
106105
106524
  }
106106
106525
  /**
106107
106526
  * Format an ISO timestamp string as a human-readable relative time.
106108
- * @param {string} isoString - ISO date string
106109
- * @returns {string} Relative time (e.g., "5 minutes ago")
106527
+ * @param isoString - ISO date string
106528
+ * @returns Relative time (e.g., "5 minutes ago")
106110
106529
  */
106111
106530
  function humanizeRelativeTime(isoString) {
106112
106531
  const date = new Date(isoString);
@@ -106146,8 +106565,8 @@ const waitArgs = {
106146
106565
  //#region src/cli/workflow/transform.ts
106147
106566
  /**
106148
106567
  * Convert a workflow execution status enum to a string.
106149
- * @param {WorkflowExecution_Status} status - Workflow execution status
106150
- * @returns {string} String representation of the status
106568
+ * @param status - Workflow execution status
106569
+ * @returns String representation of the status
106151
106570
  */
106152
106571
  function workflowExecutionStatusToString(status) {
106153
106572
  switch (status) {
@@ -106161,8 +106580,8 @@ function workflowExecutionStatusToString(status) {
106161
106580
  }
106162
106581
  /**
106163
106582
  * Convert a workflow job execution status enum to a string.
106164
- * @param {WorkflowJobExecution_Status} status - Workflow job execution status
106165
- * @returns {string} String representation of the status
106583
+ * @param status - Workflow job execution status
106584
+ * @returns String representation of the status
106166
106585
  */
106167
106586
  function workflowJobExecutionStatusToString(status) {
106168
106587
  switch (status) {
@@ -106175,8 +106594,8 @@ function workflowJobExecutionStatusToString(status) {
106175
106594
  }
106176
106595
  /**
106177
106596
  * Convert a Workflow proto to CLI-friendly list info.
106178
- * @param {Workflow} workflow - Workflow resource
106179
- * @returns {WorkflowListInfo} Flattened workflow list info
106597
+ * @param workflow - Workflow resource
106598
+ * @returns Flattened workflow list info
106180
106599
  */
106181
106600
  function toWorkflowListInfo(workflow) {
106182
106601
  return {
@@ -106188,8 +106607,8 @@ function toWorkflowListInfo(workflow) {
106188
106607
  }
106189
106608
  /**
106190
106609
  * Convert a Workflow proto to detailed workflow info for CLI output.
106191
- * @param {Workflow} workflow - Workflow resource
106192
- * @returns {WorkflowInfo} Detailed workflow info
106610
+ * @param workflow - Workflow resource
106611
+ * @returns Detailed workflow info
106193
106612
  */
106194
106613
  function toWorkflowInfo(workflow) {
106195
106614
  const jobFunctions = {};
@@ -106205,8 +106624,8 @@ function toWorkflowInfo(workflow) {
106205
106624
  }
106206
106625
  /**
106207
106626
  * Convert a WorkflowJobExecution proto to CLI-friendly job execution info.
106208
- * @param {WorkflowJobExecution} jobExecution - Workflow job execution resource
106209
- * @returns {WorkflowJobExecutionInfo} Flattened job execution info
106627
+ * @param jobExecution - Workflow job execution resource
106628
+ * @returns Flattened job execution info
106210
106629
  */
106211
106630
  function toWorkflowJobExecutionInfo(jobExecution) {
106212
106631
  return {
@@ -106220,8 +106639,8 @@ function toWorkflowJobExecutionInfo(jobExecution) {
106220
106639
  }
106221
106640
  /**
106222
106641
  * Convert a WorkflowExecution proto to CLI-friendly execution info.
106223
- * @param {WorkflowExecution} execution - Workflow execution resource
106224
- * @returns {WorkflowExecutionInfo} Flattened execution info
106642
+ * @param execution - Workflow execution resource
106643
+ * @returns Flattened execution info
106225
106644
  */
106226
106645
  function toWorkflowExecutionInfo(execution) {
106227
106646
  return {
@@ -106265,8 +106684,8 @@ function parseStatus(status) {
106265
106684
  }
106266
106685
  /**
106267
106686
  * List workflow executions with optional filters.
106268
- * @param {ListWorkflowExecutionsOptions} [options] - Workflow execution listing options
106269
- * @returns {Promise<WorkflowExecutionInfo[]>} List of workflow executions
106687
+ * @param options - Workflow execution listing options
106688
+ * @returns List of workflow executions
106270
106689
  */
106271
106690
  async function listWorkflowExecutions(options) {
106272
106691
  const client = await initOperatorClient(await loadAccessToken({
@@ -106310,8 +106729,8 @@ async function listWorkflowExecutions(options) {
106310
106729
  }
106311
106730
  /**
106312
106731
  * Get a single workflow execution with optional logs.
106313
- * @param {GetWorkflowExecutionOptions} options - Workflow execution lookup options
106314
- * @returns {Promise<GetWorkflowExecutionResult>} Workflow execution with optional logs
106732
+ * @param options - Workflow execution lookup options
106733
+ * @returns Workflow execution with optional logs
106315
106734
  */
106316
106735
  async function getWorkflowExecution(options) {
106317
106736
  const client = await initOperatorClient(await loadAccessToken({
@@ -106397,8 +106816,7 @@ async function waitWithSpinner(waitFn, interval, json) {
106397
106816
  }
106398
106817
  /**
106399
106818
  * Print a workflow execution and its logs in a human-readable format.
106400
- * @param {WorkflowExecutionDetailInfo} execution - Workflow execution detail info
106401
- * @returns {void}
106819
+ * @param execution - Workflow execution detail info
106402
106820
  */
106403
106821
  function printExecutionWithLogs(execution) {
106404
106822
  const summaryData = [
@@ -106495,10 +106913,10 @@ const executionsCommand = defineCommand({
106495
106913
  //#region src/cli/workflow/get.ts
106496
106914
  /**
106497
106915
  * Resolve a workflow definition by name.
106498
- * @param {Awaited<ReturnType<typeof initOperatorClient>>} client - Operator client
106499
- * @param {string} workspaceId - Workspace ID
106500
- * @param {string} name - Workflow name
106501
- * @returns {Promise<unknown>} Resolved workflow
106916
+ * @param client - Operator client
106917
+ * @param workspaceId - Workspace ID
106918
+ * @param name - Workflow name
106919
+ * @returns Resolved workflow
106502
106920
  */
106503
106921
  async function resolveWorkflow(client, workspaceId, name$1) {
106504
106922
  const { workflow } = await client.getWorkflowByName({
@@ -106510,8 +106928,8 @@ async function resolveWorkflow(client, workspaceId, name$1) {
106510
106928
  }
106511
106929
  /**
106512
106930
  * Get a workflow by name and return CLI-friendly info.
106513
- * @param {GetWorkflowOptions} options - Workflow lookup options
106514
- * @returns {Promise<WorkflowInfo>} Workflow information
106931
+ * @param options - Workflow lookup options
106932
+ * @returns Workflow information
106515
106933
  */
106516
106934
  async function getWorkflow(options) {
106517
106935
  const client = await initOperatorClient(await loadAccessToken({
@@ -106554,8 +106972,8 @@ const getCommand = defineCommand({
106554
106972
  //#region src/cli/workflow/list.ts
106555
106973
  /**
106556
106974
  * List workflows in the workspace and return CLI-friendly info.
106557
- * @param {ListWorkflowsOptions} [options] - Workflow listing options
106558
- * @returns {Promise<WorkflowListInfo[]>} List of workflows
106975
+ * @param options - Workflow listing options
106976
+ * @returns List of workflows
106559
106977
  */
106560
106978
  async function listWorkflows(options) {
106561
106979
  const client = await initOperatorClient(await loadAccessToken({
@@ -106633,8 +107051,8 @@ function colorizeStatus(status) {
106633
107051
  }
106634
107052
  /**
106635
107053
  * Wait for a workflow execution to reach a terminal state, optionally showing progress.
106636
- * @param {WaitForExecutionOptions} options - Wait options
106637
- * @returns {Promise<WorkflowExecutionInfo>} Final workflow execution info
107054
+ * @param options - Wait options
107055
+ * @returns Final workflow execution info
106638
107056
  */
106639
107057
  async function waitForExecution(options) {
106640
107058
  const { client, workspaceId, executionId, interval, showProgress, trackJobs } = options;
@@ -106694,8 +107112,8 @@ function isTerminalStatus(status) {
106694
107112
  }
106695
107113
  /**
106696
107114
  * Start a workflow and return a handle to wait for completion.
106697
- * @param {StartWorkflowOptions} options - Start options
106698
- * @returns {Promise<StartWorkflowResultWithWait>} Start result with wait helper
107115
+ * @param options - Start options
107116
+ * @returns Start result with wait helper
106699
107117
  */
106700
107118
  async function startWorkflow(options) {
106701
107119
  const client = await initOperatorClient(await loadAccessToken({
@@ -106795,8 +107213,8 @@ const startCommand = defineCommand({
106795
107213
  //#region src/cli/workflow/resume.ts
106796
107214
  /**
106797
107215
  * Resume a suspended workflow execution and return a handle to wait for completion.
106798
- * @param {ResumeWorkflowOptions} options - Resume options
106799
- * @returns {Promise<ResumeWorkflowResultWithWait>} Resume result with wait helper
107216
+ * @param options - Resume options
107217
+ * @returns Resume result with wait helper
106800
107218
  */
106801
107219
  async function resumeWorkflow(options) {
106802
107220
  const client = await initOperatorClient(await loadAccessToken({
@@ -106908,8 +107326,8 @@ const validateRegion = async (region, client) => {
106908
107326
  };
106909
107327
  /**
106910
107328
  * Create a new workspace with the given options.
106911
- * @param {CreateWorkspaceOptions} options - Workspace creation options
106912
- * @returns {Promise<WorkspaceInfo>} Created workspace info
107329
+ * @param options - Workspace creation options
107330
+ * @returns Created workspace info
106913
107331
  */
106914
107332
  async function createWorkspace(options) {
106915
107333
  const result = createWorkspaceOptionsSchema.safeParse(options);
@@ -106990,8 +107408,8 @@ async function loadOptions(options) {
106990
107408
  }
106991
107409
  /**
106992
107410
  * Delete a workspace by ID.
106993
- * @param {DeleteWorkspaceOptions} options - Workspace deletion options
106994
- * @returns {Promise<void>} Promise that resolves when deletion completes
107411
+ * @param options - Workspace deletion options
107412
+ * @returns Promise that resolves when deletion completes
106995
107413
  */
106996
107414
  async function deleteWorkspace(options) {
106997
107415
  const { client, workspaceId } = await loadOptions(options);
@@ -107041,8 +107459,8 @@ const deleteCommand = defineCommand({
107041
107459
  const limitSchema = z.coerce.number().int().positive().optional();
107042
107460
  /**
107043
107461
  * List workspaces with an optional limit.
107044
- * @param {ListWorkspacesOptions} [options] - Workspace listing options
107045
- * @returns {Promise<WorkspaceInfo[]>} List of workspaces
107462
+ * @param options - Workspace listing options
107463
+ * @returns List of workspaces
107046
107464
  */
107047
107465
  async function listWorkspaces(options) {
107048
107466
  const limit = options?.limit;
@@ -107097,5 +107515,5 @@ const listCommand = defineCommand({
107097
107515
  });
107098
107516
 
107099
107517
  //#endregion
107100
- export { withCommonArgs as $, generate as A, loadWorkspaceId as B, listOAuth2Clients as C, tokenCommand as D, getMachineUserToken as E, loadConfig as F, initOAuth2Client as G, writePlatformConfig as H, apiCall as I, PATScope as J, initOperatorClient as K, apiCommand as L, apply as M, applyCommand as N, listCommand$3 as O, generateUserTypes as P, jsonArgs as Q, fetchLatestToken as R, listCommand$2 as S, getOAuth2Client as T, fetchAll as U, readPlatformConfig as V, fetchUserInfo as W, confirmationArgs as X, commonArgs as Y, deploymentArgs as Z, listWorkflowExecutions as _, createCommand as a, remove as b, resumeWorkflow as c, listCommand$1 as d, workspaceArgs as et, listWorkflows as f, getWorkflowExecution as g, executionsCommand as h, deleteWorkspace as i, generateCommand as j, listMachineUsers as k, startCommand as l, getWorkflow as m, listWorkspaces as n, createWorkspace as o, getCommand as p, readPackageJson as q, deleteCommand as r, resumeCommand as s, listCommand as t, logger as tt, startWorkflow as u, show as v, getCommand$1 as w, removeCommand as x, showCommand as y, loadAccessToken as z };
107101
- //# sourceMappingURL=list-WMFoshbx.mjs.map
107518
+ export { deploymentArgs as $, listCommand$3 as A, fetchLatestToken as B, removeCommand as C, getOAuth2Client as D, getCommand$1 as E, applyCommand as F, fetchAll as G, loadWorkspaceId as H, generateUserTypes as I, initOperatorClient as J, fetchUserInfo as K, loadConfig as L, generate as M, generateCommand as N, getMachineUserToken as O, apply as P, confirmationArgs as Q, apiCall as R, remove as S, listOAuth2Clients as T, readPlatformConfig as U, loadAccessToken as V, writePlatformConfig as W, PATScope as X, readPackageJson as Y, commonArgs as Z, listWorkflowExecutions as _, createCommand as a, show as b, resumeWorkflow as c, listCommand$1 as d, jsonArgs as et, listWorkflows as f, getWorkflowExecution as g, executionsCommand as h, deleteWorkspace as i, listMachineUsers as j, tokenCommand as k, startCommand as l, getWorkflow as m, listWorkspaces as n, workspaceArgs as nt, createWorkspace as o, getCommand as p, initOAuth2Client as q, deleteCommand as r, logger as rt, resumeCommand as s, listCommand as t, withCommonArgs as tt, startWorkflow as u, truncate as v, listCommand$2 as w, showCommand as x, truncateCommand as y, apiCommand as z };
107519
+ //# sourceMappingURL=list-1cs_CGF8.mjs.map