{"version":3,"file":"index.cjs","names":[],"sources":["../src/main/index.ts"],"sourcesContent":["// 方針:\n// - setDefaultConfig / setLoggerConfig で設定する。\n//  - prefixFormat のプレースホルダ\n//    - %loggerName: ロガー名\n//    - %logLevel: ログレベル\n//    - 任意のプレースホルダー（例: %appName, %app-name）を placeholders 経由で指定\n//    - %%: %\n// - getLogger でロガーを取得する。\n\ntype LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\ntype PlaceholderValue = string | (() => string);\ntype Placeholders = Record<string, PlaceholderValue>;\ntype LoggerMethodName = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\";\ntype LogMethod = (...args: unknown[]) => void;\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n  trace: 10,\n  debug: 20,\n  info: 30,\n  warn: 40,\n  error: 50,\n  silent: 100,\n};\n\nconst VALID_LEVELS = new Set<string>(Object.keys(LEVEL_ORDER));\nconst PLACEHOLDER_KEY_BODY_PATTERN = \"[A-Za-z0-9_]+(?:-[A-Za-z0-9_]+)*\";\nconst PLACEHOLDER_KEY_PATTERN = new RegExp(`^%${PLACEHOLDER_KEY_BODY_PATTERN}$`);\nconst PLACEHOLDER_TOKEN_PATTERN = new RegExp(`%%|%${PLACEHOLDER_KEY_BODY_PATTERN}`, \"g\");\nconst RESERVED_PLACEHOLDER_KEYS = new Set<string>([\"%%\", \"%loggerName\", \"%logLevel\"]);\n\nfunction isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\n  if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n    return false;\n  }\n\n  const proto = Object.getPrototypeOf(value);\n  // 別realmのObject.prototypeも終端はnullになるため、通常オブジェクトとして受け入れる。\n  return proto === null || Object.getPrototypeOf(proto) === null;\n}\n\nfunction formatInvalidValue(value: unknown): string {\n  if (typeof value === \"object\" && value !== null && !Array.isArray(value) && !isPlainObject(value)) {\n    return Object.prototype.toString.call(value);\n  }\n\n  try {\n    const json = JSON.stringify(value);\n    if (json !== undefined) return json;\n  } catch {\n    // JSON化できない値は文字列表現へフォールバックする。\n  }\n\n  if (typeof value === \"function\") return `[function ${value.name || \"anonymous\"}]`;\n  return String(value);\n}\n\nfunction validateLevel(level: unknown): void {\n  if (typeof level !== \"string\") {\n    throw new TypeError(`invalid log level: ${formatInvalidValue(level)}`);\n  }\n\n  if (!VALID_LEVELS.has(level)) {\n    throw new Error(`invalid log level: ${formatInvalidValue(level)}`);\n  }\n}\n\nfunction validatePrefixEnabled(prefixEnabled: unknown): void {\n  if (typeof prefixEnabled !== \"boolean\") {\n    throw new TypeError(`invalid prefixEnabled: ${formatInvalidValue(prefixEnabled)}`);\n  }\n}\n\nfunction validatePrefixFormat(prefixFormat: unknown): void {\n  if (typeof prefixFormat !== \"string\") {\n    throw new TypeError(`invalid prefixFormat: ${formatInvalidValue(prefixFormat)}`);\n  }\n}\n\nfunction validateFormatTemplate(template: unknown): void {\n  if (typeof template !== \"string\") {\n    throw new TypeError(`invalid format template: ${formatInvalidValue(template)}`);\n  }\n}\n\nfunction validatePlaceholderKey(key: PropertyKey): void {\n  if (typeof key !== \"string\") {\n    throw new TypeError(`invalid placeholder key: ${formatInvalidValue(key)}`);\n  }\n\n  if (RESERVED_PLACEHOLDER_KEYS.has(key)) {\n    throw new Error(`reserved placeholder key: ${formatInvalidValue(key)}`);\n  }\n\n  if (!PLACEHOLDER_KEY_PATTERN.test(key)) {\n    throw new Error(`invalid placeholder key: ${formatInvalidValue(key)}`);\n  }\n}\n\nfunction validatePatchPlaceholders(placeholders: unknown): void {\n  if (placeholders === null) {\n    return;\n  }\n\n  if (!isPlainObject(placeholders)) {\n    throw new TypeError(`invalid placeholders: ${formatInvalidValue(placeholders)}`);\n  }\n\n  for (const key of Reflect.ownKeys(placeholders)) {\n    if (!Object.prototype.propertyIsEnumerable.call(placeholders, key)) {\n      continue;\n    }\n\n    validatePlaceholderKey(key);\n\n    const value = placeholders[key];\n    if (value !== null && typeof value !== \"string\" && typeof value !== \"function\") {\n      throw new TypeError(`invalid placeholder value for ${JSON.stringify(key)}: ${formatInvalidValue(value)}`);\n    }\n  }\n}\n\nfunction validateConfigObject(partial: unknown): void {\n  if (!isPlainObject(partial)) {\n    throw new TypeError(`invalid config: ${formatInvalidValue(partial)}`);\n  }\n}\n\ntype LoggerConfig = {\n  level: LogLevel;\n  prefixEnabled: boolean;\n  prefixFormat: string;\n  placeholders: Placeholders;\n};\n\ntype LoggerConfigPatch = {\n  level?: LogLevel | null;\n  prefixEnabled?: boolean | null;\n  prefixFormat?: string | null;\n  placeholders?: Record<string, PlaceholderValue | null> | null;\n};\n\ntype LoggerConfigOverrides = Partial<LoggerConfig>;\n\n// TODO: いつか消す\n/** @deprecated Compatibility alias only. Prefer LoggerConfigOverrides for read-side overrides in new code. */\ntype PerLoggerConfig = LoggerConfigOverrides; // NOSONAR\n\ntype FormattedLogger = {\n  trace: LogMethod;\n  debug: LogMethod;\n  info: LogMethod;\n  warn: LogMethod;\n  error: LogMethod;\n};\n\ntype Logger = {\n  readonly name: string;\n  format: (template: string) => FormattedLogger;\n  trace: LogMethod;\n  debug: LogMethod;\n  info: LogMethod;\n  warn: LogMethod;\n  error: LogMethod;\n};\n\nconst FORMATTED_LOGGER_CACHE = Symbol(\"formattedLoggerCache\");\n\ntype InternalLogger = Logger & {\n  [FORMATTED_LOGGER_CACHE]: Map<string, FormattedLogger>;\n};\n\ntype State = {\n  libraryDefaults: LoggerConfig;\n  defaults: LoggerConfig;\n  loggerOverrides: Record<string, LoggerConfigOverrides>;\n  loggers: Map<string, InternalLogger>;\n};\n\nfunction clonePlaceholders(placeholders: Placeholders): Placeholders {\n  return { ...placeholders };\n}\n\nfunction cloneLoggerConfig(config: LoggerConfig): LoggerConfig {\n  return {\n    ...config,\n    placeholders: clonePlaceholders(config.placeholders),\n  };\n}\n\nfunction cloneLoggerConfigOverrides(config: LoggerConfigOverrides): LoggerConfigOverrides {\n  const clone: LoggerConfigOverrides = { ...config };\n\n  if (Object.hasOwn(config, \"placeholders\")) {\n    clone.placeholders = clonePlaceholders(config.placeholders as Placeholders);\n  }\n\n  return clone;\n}\n\nfunction applyPlaceholdersPatch(\n  base: Placeholders,\n  patch: Record<string, PlaceholderValue | null>,\n): Placeholders {\n  const next = clonePlaceholders(base);\n\n  for (const key of Object.keys(patch)) {\n    const value = patch[key];\n    if (value === null) {\n      delete next[key];\n      continue;\n    }\n\n    next[key] = value;\n  }\n\n  return next;\n}\n\nfunction noop(): void { }\n\nfunction getConsoleMethod(\n  method: LoggerMethodName,\n): LogMethod {\n  const c: Partial<Console> | undefined = globalThis.console;\n\n  const fn = c?.[method];\n  if (typeof fn === \"function\") return fn.bind(console);\n\n  const fallback = c?.log;\n  if (typeof fallback === \"function\") return fallback.bind(console);\n\n  return noop;\n}\n\nfunction createLibraryDefaults(): LoggerConfig {\n  return {\n    level: \"info\",\n    prefixEnabled: true,\n    prefixFormat: \"(%loggerName) %logLevel:\",\n    placeholders: {},\n  };\n}\n\nfunction createState(): State {\n  const libraryDefaults = createLibraryDefaults();\n  return {\n    libraryDefaults,\n    defaults: cloneLoggerConfig(libraryDefaults),\n    loggerOverrides: {},\n    loggers: new Map(),\n  };\n}\n\nconst state: State = createState();\n\nfunction getState(): State {\n  return state;\n}\n\nfunction formatPrefix(\n  template: string,\n  loggerName: string,\n  level: LogLevel,\n  placeholders: Placeholders,\n): string {\n  const lvl = level.toUpperCase();\n  return template.replaceAll(PLACEHOLDER_TOKEN_PATTERN, (token) => {\n    if (token === \"%%\") return \"%\";\n    if (token === \"%loggerName\") return loggerName;\n    if (token === \"%logLevel\") return lvl;\n    if (Object.hasOwn(placeholders, token)) {\n      const value = placeholders[token];\n      return typeof value === \"function\" ? String(value()) : String(value);\n    }\n    return token;\n  });\n}\n\nfunction resolveEffectiveConfig(loggerName: string): LoggerConfig {\n  const state = getState();\n  const d = state.defaults;\n  const loggerOverrides = state.loggerOverrides[loggerName] ?? {};\n\n  return {\n    level: loggerOverrides.level ?? d.level,\n    prefixEnabled: loggerOverrides.prefixEnabled ?? d.prefixEnabled,\n    prefixFormat: loggerOverrides.prefixFormat ?? d.prefixFormat,\n    placeholders: { ...d.placeholders, ...(loggerOverrides.placeholders ?? {}) },\n  };\n}\n\ntype DeferredPrefixArg = {\n  toString: () => string;\n};\n\nfunction createDeferredPrefixArg(\n  loggerName: string,\n  level: LogLevel,\n  config: LoggerConfig,\n): DeferredPrefixArg {\n  return {\n    toString: () => formatPrefix(config.prefixFormat, loggerName, level, config.placeholders),\n  };\n}\n\nfunction createLogMethod(\n  loggerName: string,\n  config: LoggerConfig,\n  level: LoggerMethodName,\n  template?: string,\n): LogMethod {\n  if (LEVEL_ORDER[config.level] > LEVEL_ORDER[level]) {\n    return noop;\n  }\n\n  const fn = getConsoleMethod(level);\n  if (template === undefined) {\n    if (!config.prefixEnabled) return fn;\n    return fn.bind(null, \"%s\", createDeferredPrefixArg(loggerName, level, config));\n  }\n\n  if (!config.prefixEnabled) {\n    return fn.bind(null, template);\n  }\n\n  return fn.bind(null, `%s ${template}`, createDeferredPrefixArg(loggerName, level, config));\n}\n\nfunction createNoopFormattedLogger(): FormattedLogger {\n  return {\n    trace: noop,\n    debug: noop,\n    info: noop,\n    warn: noop,\n    error: noop,\n  };\n}\n\nfunction applyConfigToFormattedLogger(\n  formattedLogger: FormattedLogger,\n  loggerName: string,\n  config: LoggerConfig,\n  template: string,\n): void {\n  formattedLogger.trace = createLogMethod(loggerName, config, \"trace\", template);\n  formattedLogger.debug = createLogMethod(loggerName, config, \"debug\", template);\n  formattedLogger.info = createLogMethod(loggerName, config, \"info\", template);\n  formattedLogger.warn = createLogMethod(loggerName, config, \"warn\", template);\n  formattedLogger.error = createLogMethod(loggerName, config, \"error\", template);\n}\n\nfunction applyConfigToLogger(logger: InternalLogger): void {\n  const name = logger.name;\n  const cfg = resolveEffectiveConfig(name);\n  const formattedLoggers = logger[FORMATTED_LOGGER_CACHE];\n\n  logger.format = (template: string) => {\n    validateFormatTemplate(template);\n\n    const cached = formattedLoggers.get(template);\n    if (cached) return cached;\n\n    const currentConfig = resolveEffectiveConfig(name);\n    const formattedLogger = createNoopFormattedLogger();\n    formattedLoggers.set(template, formattedLogger);\n    applyConfigToFormattedLogger(formattedLogger, name, currentConfig, template);\n    return formattedLogger;\n  };\n  logger.trace = createLogMethod(name, cfg, \"trace\");\n  logger.debug = createLogMethod(name, cfg, \"debug\");\n  logger.info = createLogMethod(name, cfg, \"info\");\n  logger.warn = createLogMethod(name, cfg, \"warn\");\n  logger.error = createLogMethod(name, cfg, \"error\");\n\n  for (const [template, formattedLogger] of formattedLoggers) {\n    applyConfigToFormattedLogger(formattedLogger, name, cfg, template);\n  }\n}\n\nfunction reapplyAllLoggers(): void {\n  const state = getState();\n  for (const logger of state.loggers.values()) {\n    applyConfigToLogger(logger);\n  }\n}\n\nfunction validateConfigPatch(patch: LoggerConfigPatch): void {\n  validateConfigObject(patch);\n\n  if (Object.hasOwn(patch, \"level\")) {\n    if (patch.level !== null) {\n      validateLevel(patch.level);\n    }\n  }\n  if (Object.hasOwn(patch, \"prefixEnabled\")) {\n    if (patch.prefixEnabled !== null) {\n      validatePrefixEnabled(patch.prefixEnabled);\n    }\n  }\n  if (Object.hasOwn(patch, \"prefixFormat\")) {\n    if (patch.prefixFormat !== null) {\n      validatePrefixFormat(patch.prefixFormat);\n    }\n  }\n  if (Object.hasOwn(patch, \"placeholders\")) {\n    validatePatchPlaceholders(patch.placeholders);\n  }\n}\n\n/**\n * デフォルト設定関数\n */\nfunction setDefaultConfig(patch: LoggerConfigPatch): void {\n  const state = getState();\n  validateConfigPatch(patch);\n\n  if (Object.hasOwn(patch, \"level\")) {\n    state.defaults.level = patch.level ?? state.libraryDefaults.level;\n  }\n\n  if (Object.hasOwn(patch, \"prefixEnabled\")) {\n    state.defaults.prefixEnabled = patch.prefixEnabled ?? state.libraryDefaults.prefixEnabled;\n  }\n\n  if (Object.hasOwn(patch, \"prefixFormat\")) {\n    state.defaults.prefixFormat = patch.prefixFormat ?? state.libraryDefaults.prefixFormat;\n  }\n\n  if (Object.hasOwn(patch, \"placeholders\")) {\n    state.defaults.placeholders = patch.placeholders == null\n      ? clonePlaceholders(state.libraryDefaults.placeholders)\n      : applyPlaceholdersPatch(state.defaults.placeholders, patch.placeholders);\n  }\n\n  reapplyAllLoggers();\n}\n\n/**\n * ロガー設定関数\n */\nfunction setLoggerConfig(name: string, patch: LoggerConfigPatch): void {\n  const state = getState();\n  const key = name?.trim();\n  if (!key) {\n    throw new Error(\"logger name must be a non-empty string\");\n  }\n\n  validateConfigPatch(patch);\n\n  const current = state.loggerOverrides[key] ?? {};\n  const next = cloneLoggerConfigOverrides(current);\n\n  if (Object.hasOwn(patch, \"level\")) {\n    if (patch.level == null) {\n      delete next.level;\n    } else {\n      next.level = patch.level;\n    }\n  }\n\n  if (Object.hasOwn(patch, \"prefixEnabled\")) {\n    if (patch.prefixEnabled == null) {\n      delete next.prefixEnabled;\n    } else {\n      next.prefixEnabled = patch.prefixEnabled;\n    }\n  }\n\n  if (Object.hasOwn(patch, \"prefixFormat\")) {\n    if (patch.prefixFormat == null) {\n      delete next.prefixFormat;\n    } else {\n      next.prefixFormat = patch.prefixFormat;\n    }\n  }\n\n  if (Object.hasOwn(patch, \"placeholders\")) {\n    if (patch.placeholders == null) {\n      delete next.placeholders;\n    } else {\n      const nextPlaceholders = applyPlaceholdersPatch(next.placeholders ?? {}, patch.placeholders);\n      if (Object.keys(nextPlaceholders).length === 0) {\n        delete next.placeholders;\n      } else {\n        next.placeholders = nextPlaceholders;\n      }\n    }\n  }\n\n  if (Object.keys(next).length === 0) {\n    delete state.loggerOverrides[key];\n  } else {\n    state.loggerOverrides[key] = next;\n  }\n\n  const logger = state.loggers.get(key);\n  if (logger) applyConfigToLogger(logger);\n}\n\n/**\n * ユーティリティ関数\n */\nfunction setLogLevel(level: LogLevel): void {\n  setDefaultConfig({ level });\n}\nfunction setLoggerLevel(name: string, level: LogLevel): void {\n  setLoggerConfig(name, { level });\n}\n\n/**\n * ロガー取得関数\n */\nfunction getLogger(name: string): Logger {\n  const state = getState();\n  const key = name?.trim();\n  if (!key) {\n    throw new Error(\"logger name must be a non-empty string\");\n  }\n\n  const cached = state.loggers.get(key);\n  if (cached) return cached;\n\n  const logger: InternalLogger = {\n    name: key,\n    [FORMATTED_LOGGER_CACHE]: new Map(),\n    format: createNoopFormattedLogger,\n    trace: noop,\n    debug: noop,\n    info: noop,\n    warn: noop,\n    error: noop,\n  };\n\n  state.loggers.set(key, logger);\n  applyConfigToLogger(logger);\n  return logger;\n}\n\n/**\n * 参照用関数\n */\nfunction getDefaultConfig(): Readonly<LoggerConfig> {\n  return cloneLoggerConfig(getState().defaults);\n}\nfunction getLoggerOverrides(name: string): Readonly<LoggerConfigOverrides> {\n  const state = getState();\n  const key = name?.trim();\n  if (!key) {\n    throw new Error(\"logger name must be a non-empty string\");\n  }\n  return cloneLoggerConfigOverrides(state.loggerOverrides[key] ?? {});\n}\nfunction getEffectiveLoggerConfig(name: string): Readonly<LoggerConfig> {\n  const key = name?.trim();\n  if (!key) {\n    throw new Error(\"logger name must be a non-empty string\");\n  }\n  return resolveEffectiveConfig(key);\n}\nfunction getLibraryDefaults(): Readonly<LoggerConfig> {\n  return cloneLoggerConfig(getState().libraryDefaults);\n}\n\n/**\n * エクスポート\n */\nexport {\n  getDefaultConfig,\n  getEffectiveLoggerConfig,\n  getLibraryDefaults,\n  getLogger,\n  getLoggerOverrides,\n  setDefaultConfig,\n  setLogLevel,\n  setLoggerConfig,\n  setLoggerLevel,\n};\n\nexport type {\n  FormattedLogger,\n  LogLevel,\n  LoggerConfig,\n  LoggerConfigOverrides,\n  LoggerConfigPatch,\n  Logger,\n  PerLoggerConfig,\n  PlaceholderValue,\n  Placeholders,\n};\n"],"mappings":"mEAeA,IAAM,EAAwC,CAC5C,MAAO,GACP,MAAO,GACP,KAAM,GACN,KAAM,GACN,MAAO,GACP,OAAQ,IACT,CAEK,EAAe,IAAI,IAAY,OAAO,KAAK,EAAY,CAAC,CACxD,EAA+B,mCAC/B,EAA8B,OAAO,KAAK,EAA6B,GAAG,CAC1E,EAAgC,OAAO,OAAO,IAAgC,IAAI,CAClF,EAA4B,IAAI,IAAY,CAAC,KAAM,cAAe,YAAY,CAAC,CAErF,SAAS,EAAc,EAAuD,CAC5E,GAAI,OAAO,GAAU,WAAY,GAAkB,MAAM,QAAQ,EAAM,CACrE,MAAO,GAGT,IAAM,EAAQ,OAAO,eAAe,EAAM,CAE1C,OAAO,IAAU,MAAQ,OAAO,eAAe,EAAM,GAAK,KAG5D,SAAS,EAAmB,EAAwB,CAClD,GAAI,OAAO,GAAU,UAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,EAAI,CAAC,EAAc,EAAM,CAC/F,OAAO,OAAO,UAAU,SAAS,KAAK,EAAM,CAG9C,GAAI,CACF,IAAM,EAAO,KAAK,UAAU,EAAM,CAClC,GAAI,IAAS,IAAA,GAAW,OAAO,OACzB,EAKR,OADI,OAAO,GAAU,WAAmB,aAAa,EAAM,MAAQ,YAAY,GACxE,OAAO,EAAM,CAGtB,SAAS,EAAc,EAAsB,CAC3C,GAAI,OAAO,GAAU,SACnB,MAAU,UAAU,sBAAsB,EAAmB,EAAM,GAAG,CAGxE,GAAI,CAAC,EAAa,IAAI,EAAM,CAC1B,MAAU,MAAM,sBAAsB,EAAmB,EAAM,GAAG,CAItE,SAAS,EAAsB,EAA8B,CAC3D,GAAI,OAAO,GAAkB,UAC3B,MAAU,UAAU,0BAA0B,EAAmB,EAAc,GAAG,CAItF,SAAS,EAAqB,EAA6B,CACzD,GAAI,OAAO,GAAiB,SAC1B,MAAU,UAAU,yBAAyB,EAAmB,EAAa,GAAG,CAIpF,SAAS,EAAuB,EAAyB,CACvD,GAAI,OAAO,GAAa,SACtB,MAAU,UAAU,4BAA4B,EAAmB,EAAS,GAAG,CAInF,SAAS,EAAuB,EAAwB,CACtD,GAAI,OAAO,GAAQ,SACjB,MAAU,UAAU,4BAA4B,EAAmB,EAAI,GAAG,CAG5E,GAAI,EAA0B,IAAI,EAAI,CACpC,MAAU,MAAM,6BAA6B,EAAmB,EAAI,GAAG,CAGzE,GAAI,CAAC,EAAwB,KAAK,EAAI,CACpC,MAAU,MAAM,4BAA4B,EAAmB,EAAI,GAAG,CAI1E,SAAS,EAA0B,EAA6B,CAC1D,OAAiB,KAIrB,IAAI,CAAC,EAAc,EAAa,CAC9B,MAAU,UAAU,yBAAyB,EAAmB,EAAa,GAAG,CAGlF,IAAK,IAAM,KAAO,QAAQ,QAAQ,EAAa,CAAE,CAC/C,GAAI,CAAC,OAAO,UAAU,qBAAqB,KAAK,EAAc,EAAI,CAChE,SAGF,EAAuB,EAAI,CAE3B,IAAM,EAAQ,EAAa,GAC3B,GAAI,IAAU,MAAQ,OAAO,GAAU,UAAY,OAAO,GAAU,WAClE,MAAU,UAAU,iCAAiC,KAAK,UAAU,EAAI,CAAC,IAAI,EAAmB,EAAM,GAAG,GAK/G,SAAS,EAAqB,EAAwB,CACpD,GAAI,CAAC,EAAc,EAAQ,CACzB,MAAU,UAAU,mBAAmB,EAAmB,EAAQ,GAAG,CA0CzE,IAAM,EAAyB,OAAO,uBAAuB,CAa7D,SAAS,EAAkB,EAA0C,CACnE,MAAO,CAAE,GAAG,EAAc,CAG5B,SAAS,EAAkB,EAAoC,CAC7D,MAAO,CACL,GAAG,EACH,aAAc,EAAkB,EAAO,aAAa,CACrD,CAGH,SAAS,EAA2B,EAAsD,CACxF,IAAM,EAA+B,CAAE,GAAG,EAAQ,CAMlD,OAJI,OAAO,OAAO,EAAQ,eAAe,GACvC,EAAM,aAAe,EAAkB,EAAO,aAA6B,EAGtE,EAGT,SAAS,EACP,EACA,EACc,CACd,IAAM,EAAO,EAAkB,EAAK,CAEpC,IAAK,IAAM,KAAO,OAAO,KAAK,EAAM,CAAE,CACpC,IAAM,EAAQ,EAAM,GACpB,GAAI,IAAU,KAAM,CAClB,OAAO,EAAK,GACZ,SAGF,EAAK,GAAO,EAGd,OAAO,EAGT,SAAS,GAAa,EAEtB,SAAS,EACP,EACW,CACX,IAAM,EAAkC,WAAW,QAE7C,EAAK,IAAI,GACf,GAAI,OAAO,GAAO,WAAY,OAAO,EAAG,KAAK,QAAQ,CAErD,IAAM,EAAW,GAAG,IAGpB,OAFI,OAAO,GAAa,WAAmB,EAAS,KAAK,QAAQ,CAE1D,EAGT,SAAS,GAAsC,CAC7C,MAAO,CACL,MAAO,OACP,cAAe,GACf,aAAc,2BACd,aAAc,EAAE,CACjB,CAGH,SAAS,GAAqB,CAC5B,IAAM,EAAkB,GAAuB,CAC/C,MAAO,CACL,kBACA,SAAU,EAAkB,EAAgB,CAC5C,gBAAiB,EAAE,CACnB,QAAS,IAAI,IACd,CAGH,IAAM,EAAe,GAAa,CAElC,SAAS,GAAkB,CACzB,OAAO,EAGT,SAAS,EACP,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAM,EAAM,aAAa,CAC/B,OAAO,EAAS,WAAW,EAA4B,GAAU,CAC/D,GAAI,IAAU,KAAM,MAAO,IAC3B,GAAI,IAAU,cAAe,OAAO,EACpC,GAAI,IAAU,YAAa,OAAO,EAClC,GAAI,OAAO,OAAO,EAAc,EAAM,CAAE,CACtC,IAAM,EAAQ,EAAa,GAC3B,OAAqC,OAA9B,OAAO,GAAU,WAAoB,GAAO,CAAW,EAAM,CAEtE,OAAO,GACP,CAGJ,SAAS,EAAuB,EAAkC,CAChE,IAAM,EAAQ,GAAU,CAClB,EAAI,EAAM,SACV,EAAkB,EAAM,gBAAgB,IAAe,EAAE,CAE/D,MAAO,CACL,MAAO,EAAgB,OAAS,EAAE,MAClC,cAAe,EAAgB,eAAiB,EAAE,cAClD,aAAc,EAAgB,cAAgB,EAAE,aAChD,aAAc,CAAE,GAAG,EAAE,aAAc,GAAI,EAAgB,cAAgB,EAAE,CAAG,CAC7E,CAOH,SAAS,EACP,EACA,EACA,EACmB,CACnB,MAAO,CACL,aAAgB,EAAa,EAAO,aAAc,EAAY,EAAO,EAAO,aAAa,CAC1F,CAGH,SAAS,EACP,EACA,EACA,EACA,EACW,CACX,GAAI,EAAY,EAAO,OAAS,EAAY,GAC1C,OAAO,EAGT,IAAM,EAAK,EAAiB,EAAM,CAUlC,OATI,IAAa,IAAA,GACV,EAAO,cACL,EAAG,KAAK,KAAM,KAAM,EAAwB,EAAY,EAAO,EAAO,CAAC,CAD5C,EAI/B,EAAO,cAIL,EAAG,KAAK,KAAM,MAAM,IAAY,EAAwB,EAAY,EAAO,EAAO,CAAC,CAHjF,EAAG,KAAK,KAAM,EAAS,CAMlC,SAAS,GAA6C,CACpD,MAAO,CACL,MAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,MAAO,EACR,CAGH,SAAS,EACP,EACA,EACA,EACA,EACM,CACN,EAAgB,MAAQ,EAAgB,EAAY,EAAQ,QAAS,EAAS,CAC9E,EAAgB,MAAQ,EAAgB,EAAY,EAAQ,QAAS,EAAS,CAC9E,EAAgB,KAAO,EAAgB,EAAY,EAAQ,OAAQ,EAAS,CAC5E,EAAgB,KAAO,EAAgB,EAAY,EAAQ,OAAQ,EAAS,CAC5E,EAAgB,MAAQ,EAAgB,EAAY,EAAQ,QAAS,EAAS,CAGhF,SAAS,EAAoB,EAA8B,CACzD,IAAM,EAAO,EAAO,KACd,EAAM,EAAuB,EAAK,CAClC,EAAmB,EAAO,GAEhC,EAAO,OAAU,GAAqB,CACpC,EAAuB,EAAS,CAEhC,IAAM,EAAS,EAAiB,IAAI,EAAS,CAC7C,GAAI,EAAQ,OAAO,EAEnB,IAAM,EAAgB,EAAuB,EAAK,CAC5C,EAAkB,GAA2B,CAGnD,OAFA,EAAiB,IAAI,EAAU,EAAgB,CAC/C,EAA6B,EAAiB,EAAM,EAAe,EAAS,CACrE,GAET,EAAO,MAAQ,EAAgB,EAAM,EAAK,QAAQ,CAClD,EAAO,MAAQ,EAAgB,EAAM,EAAK,QAAQ,CAClD,EAAO,KAAO,EAAgB,EAAM,EAAK,OAAO,CAChD,EAAO,KAAO,EAAgB,EAAM,EAAK,OAAO,CAChD,EAAO,MAAQ,EAAgB,EAAM,EAAK,QAAQ,CAElD,IAAK,GAAM,CAAC,EAAU,KAAoB,EACxC,EAA6B,EAAiB,EAAM,EAAK,EAAS,CAItE,SAAS,GAA0B,CACjC,IAAM,EAAQ,GAAU,CACxB,IAAK,IAAM,KAAU,EAAM,QAAQ,QAAQ,CACzC,EAAoB,EAAO,CAI/B,SAAS,EAAoB,EAAgC,CAC3D,EAAqB,EAAM,CAEvB,OAAO,OAAO,EAAO,QAAQ,EAC3B,EAAM,QAAU,MAClB,EAAc,EAAM,MAAM,CAG1B,OAAO,OAAO,EAAO,gBAAgB,EACnC,EAAM,gBAAkB,MAC1B,EAAsB,EAAM,cAAc,CAG1C,OAAO,OAAO,EAAO,eAAe,EAClC,EAAM,eAAiB,MACzB,EAAqB,EAAM,aAAa,CAGxC,OAAO,OAAO,EAAO,eAAe,EACtC,EAA0B,EAAM,aAAa,CAOjD,SAAS,EAAiB,EAAgC,CACxD,IAAM,EAAQ,GAAU,CACxB,EAAoB,EAAM,CAEtB,OAAO,OAAO,EAAO,QAAQ,GAC/B,EAAM,SAAS,MAAQ,EAAM,OAAS,EAAM,gBAAgB,OAG1D,OAAO,OAAO,EAAO,gBAAgB,GACvC,EAAM,SAAS,cAAgB,EAAM,eAAiB,EAAM,gBAAgB,eAG1E,OAAO,OAAO,EAAO,eAAe,GACtC,EAAM,SAAS,aAAe,EAAM,cAAgB,EAAM,gBAAgB,cAGxE,OAAO,OAAO,EAAO,eAAe,GACtC,EAAM,SAAS,aAAe,EAAM,cAAgB,KAChD,EAAkB,EAAM,gBAAgB,aAAa,CACrD,EAAuB,EAAM,SAAS,aAAc,EAAM,aAAa,EAG7E,GAAmB,CAMrB,SAAS,EAAgB,EAAc,EAAgC,CACrE,IAAM,EAAQ,GAAU,CAClB,EAAM,GAAM,MAAM,CACxB,GAAI,CAAC,EACH,MAAU,MAAM,yCAAyC,CAG3D,EAAoB,EAAM,CAG1B,IAAM,EAAO,EADG,EAAM,gBAAgB,IAAQ,EAAE,CACA,CA0BhD,GAxBI,OAAO,OAAO,EAAO,QAAQ,GAC3B,EAAM,OAAS,KACjB,OAAO,EAAK,MAEZ,EAAK,MAAQ,EAAM,OAInB,OAAO,OAAO,EAAO,gBAAgB,GACnC,EAAM,eAAiB,KACzB,OAAO,EAAK,cAEZ,EAAK,cAAgB,EAAM,eAI3B,OAAO,OAAO,EAAO,eAAe,GAClC,EAAM,cAAgB,KACxB,OAAO,EAAK,aAEZ,EAAK,aAAe,EAAM,cAI1B,OAAO,OAAO,EAAO,eAAe,CACtC,GAAI,EAAM,cAAgB,KACxB,OAAO,EAAK,iBACP,CACL,IAAM,EAAmB,EAAuB,EAAK,cAAgB,EAAE,CAAE,EAAM,aAAa,CACxF,OAAO,KAAK,EAAiB,CAAC,SAAW,EAC3C,OAAO,EAAK,aAEZ,EAAK,aAAe,EAKtB,OAAO,KAAK,EAAK,CAAC,SAAW,EAC/B,OAAO,EAAM,gBAAgB,GAE7B,EAAM,gBAAgB,GAAO,EAG/B,IAAM,EAAS,EAAM,QAAQ,IAAI,EAAI,CACjC,GAAQ,EAAoB,EAAO,CAMzC,SAAS,EAAY,EAAuB,CAC1C,EAAiB,CAAE,QAAO,CAAC,CAE7B,SAAS,EAAe,EAAc,EAAuB,CAC3D,EAAgB,EAAM,CAAE,QAAO,CAAC,CAMlC,SAAS,EAAU,EAAsB,CACvC,IAAM,EAAQ,GAAU,CAClB,EAAM,GAAM,MAAM,CACxB,GAAI,CAAC,EACH,MAAU,MAAM,yCAAyC,CAG3D,IAAM,EAAS,EAAM,QAAQ,IAAI,EAAI,CACrC,GAAI,EAAQ,OAAO,EAEnB,IAAM,EAAyB,CAC7B,KAAM,GACL,GAAyB,IAAI,IAC9B,OAAQ,EACR,MAAO,EACP,MAAO,EACP,KAAM,EACN,KAAM,EACN,MAAO,EACR,CAID,OAFA,EAAM,QAAQ,IAAI,EAAK,EAAO,CAC9B,EAAoB,EAAO,CACpB,EAMT,SAAS,GAA2C,CAClD,OAAO,EAAkB,GAAU,CAAC,SAAS,CAE/C,SAAS,EAAmB,EAA+C,CACzE,IAAM,EAAQ,GAAU,CAClB,EAAM,GAAM,MAAM,CACxB,GAAI,CAAC,EACH,MAAU,MAAM,yCAAyC,CAE3D,OAAO,EAA2B,EAAM,gBAAgB,IAAQ,EAAE,CAAC,CAErE,SAAS,EAAyB,EAAsC,CACtE,IAAM,EAAM,GAAM,MAAM,CACxB,GAAI,CAAC,EACH,MAAU,MAAM,yCAAyC,CAE3D,OAAO,EAAuB,EAAI,CAEpC,SAAS,GAA6C,CACpD,OAAO,EAAkB,GAAU,CAAC,gBAAgB"}