@real-router/core 0.22.0 → 0.23.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.
Files changed (80) hide show
  1. package/README.md +1 -3
  2. package/dist/cjs/index.d.ts +1 -1
  3. package/dist/cjs/index.js +1 -1
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/metafile-cjs.json +1 -1
  6. package/dist/esm/index.d.mts +1 -1
  7. package/dist/esm/index.mjs +1 -1
  8. package/dist/esm/index.mjs.map +1 -1
  9. package/dist/esm/metafile-esm.json +1 -1
  10. package/package.json +7 -5
  11. package/src/Router.ts +1174 -0
  12. package/src/RouterError.ts +324 -0
  13. package/src/constants.ts +112 -0
  14. package/src/createRouter.ts +32 -0
  15. package/src/fsm/index.ts +5 -0
  16. package/src/fsm/routerFSM.ts +129 -0
  17. package/src/getNavigator.ts +15 -0
  18. package/src/helpers.ts +194 -0
  19. package/src/index.ts +46 -0
  20. package/src/namespaces/CloneNamespace/CloneNamespace.ts +120 -0
  21. package/src/namespaces/CloneNamespace/index.ts +3 -0
  22. package/src/namespaces/CloneNamespace/types.ts +46 -0
  23. package/src/namespaces/DependenciesNamespace/DependenciesNamespace.ts +250 -0
  24. package/src/namespaces/DependenciesNamespace/index.ts +3 -0
  25. package/src/namespaces/DependenciesNamespace/validators.ts +105 -0
  26. package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +272 -0
  27. package/src/namespaces/EventBusNamespace/index.ts +5 -0
  28. package/src/namespaces/EventBusNamespace/types.ts +11 -0
  29. package/src/namespaces/MiddlewareNamespace/MiddlewareNamespace.ts +206 -0
  30. package/src/namespaces/MiddlewareNamespace/index.ts +5 -0
  31. package/src/namespaces/MiddlewareNamespace/types.ts +28 -0
  32. package/src/namespaces/MiddlewareNamespace/validators.ts +96 -0
  33. package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +308 -0
  34. package/src/namespaces/NavigationNamespace/index.ts +5 -0
  35. package/src/namespaces/NavigationNamespace/transition/executeLifecycleHooks.ts +84 -0
  36. package/src/namespaces/NavigationNamespace/transition/executeMiddleware.ts +56 -0
  37. package/src/namespaces/NavigationNamespace/transition/index.ts +107 -0
  38. package/src/namespaces/NavigationNamespace/transition/makeError.ts +37 -0
  39. package/src/namespaces/NavigationNamespace/transition/mergeStates.ts +54 -0
  40. package/src/namespaces/NavigationNamespace/transition/processLifecycleResult.ts +81 -0
  41. package/src/namespaces/NavigationNamespace/transition/wrapSyncError.ts +82 -0
  42. package/src/namespaces/NavigationNamespace/types.ts +129 -0
  43. package/src/namespaces/NavigationNamespace/validators.ts +87 -0
  44. package/src/namespaces/OptionsNamespace/OptionsNamespace.ts +50 -0
  45. package/src/namespaces/OptionsNamespace/constants.ts +41 -0
  46. package/src/namespaces/OptionsNamespace/helpers.ts +51 -0
  47. package/src/namespaces/OptionsNamespace/index.ts +11 -0
  48. package/src/namespaces/OptionsNamespace/validators.ts +252 -0
  49. package/src/namespaces/PluginsNamespace/PluginsNamespace.ts +325 -0
  50. package/src/namespaces/PluginsNamespace/constants.ts +35 -0
  51. package/src/namespaces/PluginsNamespace/index.ts +7 -0
  52. package/src/namespaces/PluginsNamespace/types.ts +32 -0
  53. package/src/namespaces/PluginsNamespace/validators.ts +79 -0
  54. package/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts +389 -0
  55. package/src/namespaces/RouteLifecycleNamespace/index.ts +5 -0
  56. package/src/namespaces/RouteLifecycleNamespace/types.ts +17 -0
  57. package/src/namespaces/RouteLifecycleNamespace/validators.ts +65 -0
  58. package/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts +140 -0
  59. package/src/namespaces/RouterLifecycleNamespace/constants.ts +25 -0
  60. package/src/namespaces/RouterLifecycleNamespace/index.ts +5 -0
  61. package/src/namespaces/RouterLifecycleNamespace/types.ts +23 -0
  62. package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +1482 -0
  63. package/src/namespaces/RoutesNamespace/constants.ts +14 -0
  64. package/src/namespaces/RoutesNamespace/helpers.ts +532 -0
  65. package/src/namespaces/RoutesNamespace/index.ts +9 -0
  66. package/src/namespaces/RoutesNamespace/stateBuilder.ts +70 -0
  67. package/src/namespaces/RoutesNamespace/types.ts +82 -0
  68. package/src/namespaces/RoutesNamespace/validators.ts +331 -0
  69. package/src/namespaces/StateNamespace/StateNamespace.ts +317 -0
  70. package/src/namespaces/StateNamespace/helpers.ts +43 -0
  71. package/src/namespaces/StateNamespace/index.ts +5 -0
  72. package/src/namespaces/StateNamespace/types.ts +15 -0
  73. package/src/namespaces/index.ts +42 -0
  74. package/src/transitionPath.ts +441 -0
  75. package/src/typeGuards.ts +74 -0
  76. package/src/types.ts +194 -0
  77. package/src/wiring/RouterWiringBuilder.ts +235 -0
  78. package/src/wiring/index.ts +7 -0
  79. package/src/wiring/types.ts +53 -0
  80. package/src/wiring/wireRouter.ts +29 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../event-emitter/src/EventEmitter.ts","../../../type-guards/src/guards/navigation.ts","../../../type-guards/src/internal/router-error.ts","../../../type-guards/src/guards/routes.ts","../../../type-guards/src/guards/params.ts","../../../type-guards/src/internal/meta-fields.ts","../../../type-guards/src/guards/state.ts","../../../type-guards/src/guards/primitives.ts","../../../type-guards/src/validators/routes.ts","../../../type-guards/src/utilities/type-description.ts","../../../type-guards/src/validators/state.ts","../../src/constants.ts","../../src/fsm/routerFSM.ts","../../src/helpers.ts","../../src/namespaces/DependenciesNamespace/validators.ts","../../src/namespaces/DependenciesNamespace/DependenciesNamespace.ts","../../src/namespaces/OptionsNamespace/constants.ts","../../src/namespaces/OptionsNamespace/helpers.ts","../../src/namespaces/OptionsNamespace/validators.ts","../../src/namespaces/OptionsNamespace/OptionsNamespace.ts","../../src/namespaces/StateNamespace/helpers.ts","../../src/namespaces/StateNamespace/StateNamespace.ts","../../src/namespaces/MiddlewareNamespace/validators.ts","../../src/namespaces/MiddlewareNamespace/MiddlewareNamespace.ts","../../src/namespaces/PluginsNamespace/constants.ts","../../src/namespaces/PluginsNamespace/validators.ts","../../src/namespaces/PluginsNamespace/PluginsNamespace.ts","../../src/namespaces/RouteLifecycleNamespace/validators.ts","../../src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts","../../../route-tree/src/builder/buildTree.ts","../../../route-tree/src/builder/computeCaches.ts","../../../route-tree/src/builder/createRouteTree.ts","../../../route-tree/src/operations/query.ts","../../../route-tree/src/operations/routeTreeToDefinitions.ts","../../../search-params/src/decode.ts","../../../search-params/src/strategies/array.ts","../../../search-params/src/strategies/boolean.ts","../../../search-params/src/strategies/null.ts","../../../search-params/src/strategies/index.ts","../../../search-params/src/encode.ts","../../../search-params/src/utils.ts","../../../search-params/src/searchParams.ts","../../../route-tree/src/createMatcher.ts","../../../route-tree/src/validation/routes.ts","../../../route-tree/src/validation/route-batch.ts","../../src/namespaces/RoutesNamespace/constants.ts","../../src/namespaces/RoutesNamespace/helpers.ts","../../src/namespaces/RoutesNamespace/stateBuilder.ts","../../src/namespaces/RoutesNamespace/validators.ts","../../src/transitionPath.ts","../../src/namespaces/RoutesNamespace/RoutesNamespace.ts","../../src/namespaces/NavigationNamespace/transition/wrapSyncError.ts","../../src/RouterError.ts","../../src/namespaces/NavigationNamespace/transition/makeError.ts","../../src/namespaces/NavigationNamespace/transition/mergeStates.ts","../../src/namespaces/NavigationNamespace/transition/processLifecycleResult.ts","../../src/namespaces/NavigationNamespace/transition/executeLifecycleHooks.ts","../../src/namespaces/NavigationNamespace/transition/executeMiddleware.ts","../../src/namespaces/NavigationNamespace/transition/index.ts","../../src/namespaces/NavigationNamespace/validators.ts","../../src/namespaces/NavigationNamespace/NavigationNamespace.ts","../../src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts","../../src/namespaces/CloneNamespace/CloneNamespace.ts","../../src/namespaces/EventBusNamespace/EventBusNamespace.ts","../../src/namespaces/RouterLifecycleNamespace/constants.ts","../../src/typeGuards.ts","../../src/wiring/RouterWiringBuilder.ts","../../src/wiring/wireRouter.ts","../../src/Router.ts","../../src/createRouter.ts","../../src/getNavigator.ts"],"names":["v","DEFAULT_LIMITS","FSM","logger","i","plugins","unsubscribed","unsubscribe","p","encodeValue","createRouterError","HAS_NON_WHITESPACE","MAX_ROUTE_NAME_LENGTH","getTypeDescription","validateRouteName","r","DEFAULT_ROUTE_NAME","n","s"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n EventEmitterLimits,\n EventEmitterOptions,\n Unsubscribe,\n} from \"./types\";\n\nconst DEFAULT_LIMITS: EventEmitterLimits = {\n maxListeners: 0,\n warnListeners: 0,\n maxEventDepth: 0,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\ntype AnyCallback = Function;\n\n/**\n * Sentinel error for recursion depth violations.\n * Re-thrown from the per-listener catch so it propagates to the caller.\n */\nclass RecursionDepthError extends Error {}\n\n/**\n * Generic typed event emitter with listener limits, duplicate detection,\n * recursion depth protection, and per-listener error isolation.\n *\n * All features are opt-in via constructor options and limits.\n */\nexport class EventEmitter<TEventMap extends Record<string, unknown[]>> {\n readonly #callbacks = new Map<string, Set<AnyCallback>>();\n #depthMap: Map<string, number> | null = null;\n #limits: EventEmitterLimits = DEFAULT_LIMITS;\n readonly #onListenerError:\n | ((eventName: string, error: unknown) => void)\n | null;\n readonly #onListenerWarn: ((eventName: string, count: number) => void) | null;\n\n constructor(options?: EventEmitterOptions) {\n if (options?.limits) {\n this.#limits = options.limits;\n }\n\n this.#onListenerError = options?.onListenerError ?? null;\n this.#onListenerWarn = options?.onListenerWarn ?? null;\n }\n\n /**\n * Validates that a callback is a function.\n */\n static validateCallback(\n cb: unknown,\n eventName: string,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n ): asserts cb is Function {\n if (typeof cb !== \"function\") {\n throw new TypeError(\n `Expected callback to be a function for event ${eventName}`,\n );\n }\n }\n\n /**\n * Replaces current limits with the provided limits.\n */\n setLimits(limits: EventEmitterLimits): void {\n this.#limits = limits;\n }\n\n /**\n * Adds an event listener and returns an unsubscribe function.\n * Throws on duplicate listeners or when maxListeners is reached.\n */\n on<E extends keyof TEventMap & string>(\n eventName: E,\n cb: (...args: TEventMap[E]) => void,\n ): Unsubscribe {\n const set = this.#getCallbackSet(eventName);\n\n if (set.has(cb as AnyCallback)) {\n throw new Error(`Duplicate listener for \"${eventName}\"`);\n }\n\n const { maxListeners, warnListeners } = this.#limits;\n\n if (warnListeners !== 0 && set.size === warnListeners) {\n this.#onListenerWarn?.(eventName, warnListeners);\n }\n\n if (maxListeners !== 0 && set.size >= maxListeners) {\n throw new Error(\n `Listener limit (${maxListeners}) reached for \"${eventName}\"`,\n );\n }\n\n set.add(cb as AnyCallback);\n\n return () => {\n this.off(eventName, cb);\n };\n }\n\n /**\n * Removes an event listener.\n */\n off<E extends keyof TEventMap & string>(\n eventName: E,\n cb: (...args: TEventMap[E]) => void,\n ): void {\n this.#callbacks.get(eventName)?.delete(cb as AnyCallback);\n }\n\n /**\n * Emits an event, calling all registered listeners with the provided args.\n * Uses snapshot iteration — listeners added/removed during emit don't affect\n * the current invocation. Per-listener errors are caught and reported via\n * the onListenerError callback. RecursionDepthError is re-thrown.\n */\n emit<E extends keyof TEventMap & string>(\n eventName: E,\n ...args: TEventMap[E]\n ): void {\n const set = this.#callbacks.get(eventName);\n\n if (!set || set.size === 0) {\n return;\n }\n\n if (this.#limits.maxEventDepth === 0) {\n this.#emitFast(set, eventName, args);\n\n return;\n }\n\n this.#emitWithDepthTracking(set, eventName, args);\n }\n\n /**\n * Removes all listeners and resets the depth map.\n */\n clearAll(): void {\n this.#callbacks.clear();\n this.#depthMap = null;\n }\n\n /**\n * Returns the number of listeners for the given event.\n */\n listenerCount(eventName: keyof TEventMap & string): number {\n return this.#callbacks.get(eventName)?.size ?? 0;\n }\n\n // ===========================================================================\n // Private methods\n // ===========================================================================\n\n /**\n * Fast emit path — no depth tracking, no try/finally overhead.\n * Used when maxEventDepth === 0 (depth protection disabled).\n */\n #emitFast(set: Set<AnyCallback>, eventName: string, args: unknown[]): void {\n const listeners = [...set];\n\n for (const cb of listeners) {\n try {\n switch (args.length) {\n case 0: {\n (cb as () => void)();\n\n break;\n }\n case 1: {\n (cb as (a: unknown) => void)(args[0]);\n\n break;\n }\n case 2: {\n (cb as (a: unknown, b: unknown) => void)(args[0], args[1]);\n\n break;\n }\n case 3: {\n (cb as (a: unknown, b: unknown, c: unknown) => void)(\n args[0],\n args[1],\n args[2],\n );\n\n break;\n }\n default: {\n Function.prototype.apply.call(cb, undefined, args);\n }\n }\n } catch (error) {\n this.#onListenerError?.(eventName, error);\n }\n }\n }\n\n /**\n * Emit path with recursion depth tracking and protection.\n * Used when maxEventDepth > 0.\n */\n #emitWithDepthTracking(\n set: Set<AnyCallback>,\n eventName: string,\n args: unknown[],\n ): void {\n this.#depthMap ??= new Map();\n const depthMap = this.#depthMap;\n const depth = depthMap.get(eventName) ?? 0;\n\n if (depth >= this.#limits.maxEventDepth) {\n throw new RecursionDepthError(\n `Maximum recursion depth (${this.#limits.maxEventDepth}) exceeded for event: ${eventName}`,\n );\n }\n\n try {\n depthMap.set(eventName, depth + 1);\n\n const listeners = [...set];\n\n for (const cb of listeners) {\n try {\n switch (args.length) {\n case 0: {\n (cb as () => void)();\n\n break;\n }\n case 1: {\n (cb as (a: unknown) => void)(args[0]);\n\n break;\n }\n case 2: {\n (cb as (a: unknown, b: unknown) => void)(args[0], args[1]);\n\n break;\n }\n case 3: {\n (cb as (a: unknown, b: unknown, c: unknown) => void)(\n args[0],\n args[1],\n args[2],\n );\n\n break;\n }\n default: {\n Function.prototype.apply.call(cb, undefined, args);\n }\n }\n } catch (error) {\n if (error instanceof RecursionDepthError) {\n throw error;\n }\n\n this.#onListenerError?.(eventName, error);\n }\n }\n } finally {\n // Safe: depthMap.set() at try start guarantees the value exists\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n depthMap.set(eventName, depthMap.get(eventName)! - 1);\n }\n }\n\n /**\n * Gets or creates a Set for the given event name (lazy initialization).\n */\n #getCallbackSet(eventName: string): Set<AnyCallback> {\n const existing = this.#callbacks.get(eventName);\n\n if (existing) {\n return existing;\n }\n\n const set = new Set<AnyCallback>();\n\n this.#callbacks.set(eventName, set);\n\n return set;\n }\n}\n","// packages/type-guards/modules/guards/navigation.ts\n\nimport type { NavigationOptions } from \"@real-router/types\";\n\n// Constant in module scope - created once, not on every call\nconst NAVIGATION_OPTIONS_FIELDS = [\n \"replace\",\n \"reload\",\n \"force\",\n \"forceDeactivate\",\n \"redirected\",\n] as const;\n\n/**\n * Type guard for NavigationOptions.\n * Validates all optional boolean fields.\n *\n * @param value - Value to check\n * @returns true if value is a valid NavigationOptions object\n *\n * @example\n * isNavigationOptions({ replace: true }); // true\n * isNavigationOptions({ reload: false, force: true }); // true\n * isNavigationOptions({ replace: \"true\" }); // false (not boolean)\n * isNavigationOptions(null); // false\n */\nexport function isNavigationOptions(\n value: unknown,\n): value is NavigationOptions {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n // for-of instead of .every() - no iterator/callback allocation\n for (const field of NAVIGATION_OPTIONS_FIELDS) {\n const fieldValue = obj[field];\n\n if (fieldValue !== undefined && typeof fieldValue !== \"boolean\") {\n return false;\n }\n }\n\n return true;\n}\n","// packages/type-guards/modules/internal/router-error.ts\n\n/**\n * Checks if string contains at least one non-whitespace character.\n * Used to validate that route name is not empty or only whitespace.\n * Matches: any non-whitespace character (\\S = [^ \\t\\n\\r\\f])\n *\n * @internal\n */\nexport const HAS_NON_WHITESPACE = /\\S/;\n\n/**\n * Pattern for complete route validation (all segments at once).\n * Matches: single segment or multiple segments separated by dots.\n * Each segment must start with letter/underscore, followed by alphanumeric/hyphen/underscore.\n * Rejects: leading/trailing/consecutive dots, segments starting with numbers/hyphens.\n * Note: Empty string is handled by early return in validateRouteName.\n *\n * @internal\n */\nexport const FULL_ROUTE_PATTERN = /^[A-Z_a-z][\\w-]*(?:\\.[A-Z_a-z][\\w-]*)*$/;\n\n/**\n * Maximum route name length to prevent DoS and performance issues.\n * This is a technical limit, not a business constraint.\n * Real route names rarely exceed 200 characters even with deep nesting.\n *\n * @internal\n */\nexport const MAX_ROUTE_NAME_LENGTH = 10_000;\n\n/**\n * Creates a TypeError with consistent router error message format.\n *\n * @param methodName - Name of the method that triggered the error\n * @param message - Error message\n * @returns TypeError with formatted message\n * @internal\n */\nexport function createRouterError(\n methodName: string,\n message: string,\n): TypeError {\n return new TypeError(`[router.${methodName}] ${message}`);\n}\n","// packages/type-guards/modules/guards/routes.ts\n\nimport {\n FULL_ROUTE_PATTERN,\n MAX_ROUTE_NAME_LENGTH,\n} from \"../internal/router-error\";\n\n/**\n * Type guard that checks if a value is a valid route name.\n *\n * Route name rules:\n * - Must be a string\n * - Empty string (\"\") is valid and represents the root node\n * - Can use dots (.) for hierarchy (e.g., \"users.profile\")\n * - Each segment must match [a-zA-Z_][a-zA-Z0-9_-]*\n * - No consecutive dots (..)\n * - No leading/trailing dots\n * - Cannot contain only whitespace\n * - System routes (starting with @@) bypass pattern validation\n *\n * @param name - Value to check\n * @returns true if name is a valid route name string\n *\n * @example\n * // Valid names\n * isRouteName(\"\"); // true (root node)\n * isRouteName(\"home\"); // true\n * isRouteName(\"users.profile\"); // true\n * isRouteName(\"admin_panel\"); // true\n * isRouteName(\"api-v2\"); // true\n * isRouteName(\"@@router/UNKNOWN_ROUTE\"); // true (system route)\n *\n * @example\n * // Invalid names\n * isRouteName(\" \"); // false (only whitespace)\n * isRouteName(\".users\"); // false (leading dot)\n * isRouteName(\"users.\"); // false (trailing dot)\n * isRouteName(\"users..profile\"); // false (consecutive dots)\n * isRouteName(\"users.123\"); // false (segment starts with number)\n * isRouteName(\"users profile\"); // false (contains space)\n */\nexport function isRouteName(name: unknown): name is string {\n if (typeof name !== \"string\") {\n return false;\n }\n\n // Empty string is valid (represents root node)\n if (name === \"\") {\n return true;\n }\n\n // Too long is invalid\n if (name.length > MAX_ROUTE_NAME_LENGTH) {\n return false;\n }\n\n // System routes are valid (bypass pattern validation)\n if (name.startsWith(\"@@\")) {\n return true;\n }\n\n // Regular routes must match pattern\n // Note: FULL_ROUTE_PATTERN rejects whitespace-only strings\n return FULL_ROUTE_PATTERN.test(name);\n}\n","// packages/type-guards/modules/guards/params.ts\n\nimport type { Params } from \"@real-router/types\";\n\n/**\n * Internal helper to check if value is serializable (no circular refs, functions, instances).\n * Recursively validates the entire object tree with protection against circular references.\n *\n * @param value - Value to check\n * @param visited - Set of visited objects to detect circular references\n * @returns true if value can be serialized\n * @internal\n */\nfunction isSerializable(\n value: unknown,\n visited = new WeakSet<object>(),\n): boolean {\n // null/undefined are serializable (JSON.stringify handles them)\n if (value === null || value === undefined) {\n return true;\n }\n\n const type = typeof value;\n\n // Primitives: string, boolean\n if (type === \"string\" || type === \"boolean\") {\n return true;\n }\n\n // Numbers: must be finite (reject NaN and Infinity)\n if (type === \"number\") {\n return Number.isFinite(value);\n }\n\n // Functions and symbols cannot be serialized\n if (type === \"function\" || type === \"symbol\") {\n return false;\n }\n\n // Arrays (including nested arrays)\n if (Array.isArray(value)) {\n // Circular reference detection\n if (visited.has(value)) {\n return false;\n }\n\n visited.add(value);\n\n // Recursively check all items\n return value.every((item) => isSerializable(item, visited));\n }\n\n // Objects\n if (type === \"object\") {\n // Circular reference detection\n if (visited.has(value)) {\n return false;\n }\n\n // Add to visited set\n visited.add(value);\n\n // Only allow plain objects (reject Date, RegExp, Map, Set, etc.)\n const proto = Object.getPrototypeOf(value) as object | null;\n\n if (proto !== null && proto !== Object.prototype) {\n return false; // Instance of a class\n }\n\n // Recursively check all values\n return Object.values(value).every((v) => isSerializable(v, visited));\n }\n\n return false;\n}\n\n/**\n * Fast path check for primitive values (no recursion needed).\n * Returns true if primitive, false if needs deeper inspection.\n *\n * @internal\n */\nfunction isPrimitiveValue(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n const type = typeof value;\n\n if (type === \"string\" || type === \"boolean\") {\n return true;\n }\n\n if (type === \"number\") {\n return Number.isFinite(value);\n }\n\n // object, array, function, symbol — need deeper check\n return false;\n}\n\n/**\n * Type guard for Params object.\n * Validates that all values are serializable (primitives, arrays, nested arrays, or nested objects).\n * Rejects circular references, functions, symbols, and class instances.\n * Allows null/undefined anywhere (objects and arrays).\n *\n * Performance optimization: Uses two-phase validation.\n * Phase 1 (fast path): Check if all values are primitives — O(p) without recursion.\n * Phase 2 (slow path): Full recursive validation only if nested structures detected.\n *\n * @param value - Value to check\n * @returns true if value is a valid Params object\n *\n * @example\n * // Valid\n * isParams({ id: '123', page: 1 }); // true (fast path)\n * isParams({ sort: ['name', 'age'] }); // true (slow path)\n * isParams({ filter: { status: 'active' } }); // true (slow path)\n * isParams({ teamId: null, orgId: undefined }); // true (fast path)\n * isParams({ matrix: [[1, 2], [3, 4]] }); // true (slow path)\n * isParams({ users: [{ id: 1 }, { id: 2 }] }); // true (slow path)\n * isParams({ scores: [100, null, 85] }); // true (slow path)\n *\n * // Invalid\n * isParams({ fn: () => {} }); // false (function)\n * isParams({ date: new Date() }); // false (class instance)\n * isParams({ self: circularRef }); // false (circular reference)\n * isParams(null); // false (not an object)\n * isParams([]); // false (array, not object)\n */\nexport function isParams(value: unknown): value is Params {\n // Reject null, undefined, and arrays (must be a plain object)\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n // Reject objects with custom prototype (e.g., Object.create(proto), class instances)\n // This check is required for both fast and slow paths\n const proto = Object.getPrototypeOf(value) as object | null;\n\n if (proto !== null && proto !== Object.prototype) {\n return false;\n }\n\n // Phase 1: Fast path for flat objects (95%+ of real-world params)\n // Check if all values are primitives — no recursion, no WeakSet allocation\n let needsDeepCheck = false;\n\n for (const key in value) {\n // Skip inherited properties (only check own properties for fast path)\n // Note: With proto === Object.prototype check above, inherited properties\n // would only come from Object.prototype, which has no enumerable properties.\n // This check is defensive against Object.prototype pollution.\n /* v8 ignore next 3 -- @preserve Defensive: Object.prototype pollution */\n if (!Object.hasOwn(value, key)) {\n continue;\n }\n\n const val = (value as Record<string, unknown>)[key];\n\n if (!isPrimitiveValue(val)) {\n // Found non-primitive — need full validation\n // But first check for obvious invalids (functions, symbols)\n const type = typeof val;\n\n if (type === \"function\" || type === \"symbol\") {\n return false; // Early reject\n }\n\n needsDeepCheck = true;\n\n break; // Exit fast path, proceed to slow path\n }\n }\n\n // Fast path: all primitives, valid params\n if (!needsDeepCheck) {\n return true;\n }\n\n // Phase 2: Slow path — full recursive validation\n return isSerializable(value);\n}\n\n/**\n * Internal helper for strict param validation (browser plugin).\n * Only allows primitives and arrays of primitives, no nested objects.\n *\n * @param value - Value to check\n * @returns true if value is valid\n * @internal\n */\nexport function isValidParamValueStrict(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n const type = typeof value;\n\n // Primitives: string, boolean, finite number\n if (type === \"string\" || type === \"boolean\") {\n return true;\n }\n\n if (type === \"number\") {\n return Number.isFinite(value as number);\n }\n\n // Arrays of primitives only\n if (Array.isArray(value)) {\n return value.every((item) => {\n const itemType = typeof item;\n\n // Primitives: string, boolean, finite number\n if (itemType === \"string\" || itemType === \"boolean\") {\n return true;\n }\n\n if (itemType === \"number\") {\n return Number.isFinite(item);\n }\n\n // Reject everything else (objects, arrays, functions, symbols, etc.)\n return false;\n });\n }\n\n // Reject objects, functions, symbols, etc.\n return false;\n}\n\n/**\n * Strict type guard for Params (browser plugin version).\n * Only allows primitives and arrays of primitives, no nested objects.\n *\n * @param value - Value to check\n * @returns true if value is a valid Params object\n */\nexport function isParamsStrict(value: unknown): value is Params {\n // Check if value is an object (null returns \"object\" but fails Array.isArray and other checks)\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n // Check all own properties have valid param values\n for (const key in value) {\n if (!Object.hasOwn(value, key)) {\n continue; // Skip inherited properties\n }\n\n const val = (value as Record<string, unknown>)[key];\n\n if (!isValidParamValueStrict(val)) {\n return false;\n }\n }\n\n return true;\n}\n","// packages/type-guards/modules/internal/meta-fields.ts\n\nimport { isParams, isParamsStrict } from \"../guards/params\";\nimport { isRouteName } from \"../guards/routes\";\n\nimport type { Params, StateMeta } from \"@real-router/types\";\n\n/**\n * Type guard for meta object fields if present.\n * Used by both isStateStrict and isHistoryState.\n *\n * @param meta - Value to check\n * @returns true if meta has valid StateMeta structure\n * @internal\n */\nexport function isMetaFields<MP extends Params = Params>(\n meta: unknown,\n): meta is StateMeta<MP> {\n // Early check: must be a non-null object\n if (typeof meta !== \"object\" || meta === null) {\n return false;\n }\n\n const obj = meta as Record<string, unknown>;\n\n // Check params field if present\n if (\"params\" in obj && !isParamsStrict(obj.params)) {\n return false;\n }\n\n // Check options field if present\n if (\"options\" in obj && typeof obj.options !== \"object\") {\n return false;\n }\n\n // Check id field if present\n if (\"id\" in obj && typeof obj.id !== \"number\") {\n return false;\n }\n\n // Check redirected field if present\n if (\"redirected\" in obj && typeof obj.redirected !== \"boolean\") {\n return false;\n }\n\n // Check source field if present\n return !(\"source\" in obj && typeof obj.source !== \"string\");\n}\n\n/**\n * Type guard helper that checks if required State fields have valid types.\n * Validates that name, path, and params exist and have correct types.\n * Used by both isStateStrict and isHistoryState.\n *\n * @param obj - Object to check\n * @returns true if object has valid required fields\n * @internal\n */\nexport function isRequiredFields(obj: Record<string, unknown>): boolean {\n return (\n isRouteName(obj.name) &&\n typeof obj.path === \"string\" &&\n isParams(obj.params)\n );\n}\n","// packages/type-guards/modules/guards/state.ts\n\nimport { isMetaFields, isRequiredFields } from \"../internal/meta-fields\";\n\nimport type { Params, State } from \"@real-router/types\";\n\n/**\n * Type guard for State object.\n * Checks for required fields: name, params, path.\n * Does NOT validate meta field deeply.\n *\n * @param value - Value to check\n * @returns true if value is a valid State object\n *\n * @example\n * isState({ name: 'home', params: {}, path: '/' }); // true\n * isState({ name: 'home', path: '/' }); // false (missing params)\n */\nexport function isState<P extends Params = Params, MP extends Params = Params>(\n value: unknown,\n): value is State<P, MP> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n return isRequiredFields(obj);\n}\n\n/**\n * Enhanced type guard for State with deep validation.\n * Checks not only presence but also types of all required fields.\n * Validates params using isParams and meta structure if present.\n *\n * @param value - Value to check\n * @returns true if value is a valid State object with correct types\n *\n * @example\n * isStateStrict({ name: 'home', params: {}, path: '/', meta: { id: 1 } }); // true\n * isStateStrict({ name: 'home', params: 'invalid', path: '/' }); // false\n */\nexport function isStateStrict<\n P extends Params = Params,\n MP extends Params = Params,\n>(value: unknown): value is State<P, MP> {\n // Basic structure check\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n // Check required fields and their types\n if (!isRequiredFields(obj)) {\n return false;\n }\n\n // Validate meta if present\n if (obj.meta !== undefined) {\n return isMetaFields(obj.meta);\n }\n\n return true;\n}\n\n/**\n * Type guard for HistoryState (browser plugin).\n * HistoryState must have meta object with specific structure.\n * This is stricter than regular State validation.\n *\n * @param value - Value to check\n * @returns true if value is a valid HistoryState object\n */\nexport function isHistoryState(value: unknown): value is State & {\n meta: NonNullable<State[\"meta\"]>;\n} {\n // Basic structure check\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n // Check required fields and their types\n if (!isRequiredFields(obj)) {\n return false;\n }\n\n // HistoryState requires meta to be present and valid\n // Note: The check !(\"meta\" in obj) is redundant because isMetaFields(undefined) returns false\n // However, we keep it for clarity and explicit error semantics\n return \"meta\" in obj && isMetaFields(obj.meta);\n}\n","// packages/type-guards/modules/primitives.ts\n\n/**\n * Type guard for string type.\n *\n * @param value - Value to check\n * @returns true if value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Type guard for boolean type.\n *\n * @param value - Value to check\n * @returns true if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === \"boolean\";\n}\n\n/**\n * Type guard for Promise type.\n *\n * @param value - Value to check\n * @returns true if value is a Promise\n */\nexport function isPromise<T = unknown>(value: unknown): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n\n/**\n * Type guard for object key existence.\n * Narrows the key type to a valid key of the object.\n *\n * @param key - Key to check\n * @param obj - Object to check in\n * @returns true if key exists in object\n */\nexport function isObjKey<T extends object>(\n key: string,\n obj: T,\n): key is Extract<keyof T, string> {\n return key in obj;\n}\n\n/**\n * Type guard for primitive values suitable for URL parameters.\n * Only string, number, and boolean are allowed.\n * Rejects NaN and Infinity for numbers.\n *\n * @param value - Value to check\n * @returns true if value is string, number, or boolean\n */\nexport function isPrimitiveValue(\n value: unknown,\n): value is string | number | boolean {\n if (typeof value === \"number\") {\n return Number.isFinite(value);\n }\n\n return typeof value === \"string\" || typeof value === \"boolean\";\n}\n","// packages/type-guards/modules/validators/routes.ts\n\nimport {\n createRouterError,\n FULL_ROUTE_PATTERN,\n HAS_NON_WHITESPACE,\n MAX_ROUTE_NAME_LENGTH,\n} from \"../internal/router-error\";\n\n/**\n * Validates that a route name is a valid string and matches the expected format.\n * Throws a descriptive error if validation fails.\n *\n * Route name rules:\n * - Must be a string\n * - Empty string (\"\") is valid and represents the root node\n * - Can use dots (.) for hierarchy (e.g., \"users.profile\")\n * - Each segment must match [a-zA-Z_][a-zA-Z0-9_-]*\n * - No consecutive dots (..)\n * - No leading/trailing dots\n * - Cannot contain only whitespace\n * - System routes (starting with @@) bypass pattern validation\n *\n * @param name - Route name to validate\n * @param methodName - Name of calling method for error messages\n * @throws {TypeError} If name is invalid\n *\n * @example\n * // Valid names\n * validateRouteName(\"\", \"add\"); // ok (root node)\n * validateRouteName(\"home\", \"add\"); // ok\n * validateRouteName(\"users.profile\", \"add\"); // ok\n * validateRouteName(\"@@router/UNKNOWN_ROUTE\", \"add\"); // ok (system route)\n *\n * @example\n * // Invalid names (throws)\n * validateRouteName(\" \", \"add\"); // throws (only whitespace)\n * validateRouteName(\".users\", \"add\"); // throws (leading dot)\n * validateRouteName(\"users.\", \"add\"); // throws (trailing dot)\n * validateRouteName(\"users..profile\", \"add\"); // throws (consecutive dots)\n * validateRouteName(\"users.123\", \"add\"); // throws (segment starts with number)\n * validateRouteName(\"users profile\", \"add\"); // throws (contains space)\n */\nexport function validateRouteName(\n name: unknown,\n methodName: string,\n): asserts name is string {\n // Type check\n if (typeof name !== \"string\") {\n throw createRouterError(\n methodName,\n `Route name must be a string, got ${typeof name}`,\n );\n }\n\n // Empty string is valid (represents root node) - fast path\n if (name === \"\") {\n return;\n }\n\n // Whitespace-only strings are invalid\n if (!HAS_NON_WHITESPACE.test(name)) {\n throw createRouterError(\n methodName,\n \"Route name cannot contain only whitespace\",\n );\n }\n\n // Length check for technical safety\n if (name.length > MAX_ROUTE_NAME_LENGTH) {\n throw createRouterError(\n methodName,\n `Route name exceeds maximum length of ${MAX_ROUTE_NAME_LENGTH} characters. This is a technical safety limit.`,\n );\n }\n\n // System routes bypass validation (e.g., @@router/UNKNOWN_ROUTE)\n // SECURITY NOTE: System routes are currently created ONLY in router code,\n // not from user input. If this changes, add sanitization for <>\"'&\\x00-\\x1F\n if (name.startsWith(\"@@\")) {\n return;\n }\n\n // Validate route pattern\n if (!FULL_ROUTE_PATTERN.test(name)) {\n throw createRouterError(\n methodName,\n `Invalid route name \"${name}\". Each segment must start with a letter or underscore, followed by letters, numbers, underscores, or hyphens. Segments are separated by dots (e.g., \"users.profile\").`,\n );\n }\n}\n","// packages/type-guards/modules/internal/type-description.ts\n\n/**\n * Gets a human-readable description of a value's type.\n * Used for error messages to provide helpful debugging information.\n *\n * @param value - Value to describe\n * @returns String description of the value's type\n *\n * @example\n * getTypeDescription(null); // \"null\"\n * getTypeDescription([1, 2, 3]); // \"array[3]\"\n * getTypeDescription(new Date()); // \"Date\"\n * getTypeDescription({}); // \"object\"\n * getTypeDescription(\"hello\"); // \"string\"\n */\nexport function getTypeDescription(value: unknown): string {\n // Handle null explicitly (typeof null === \"object\")\n if (value === null) {\n return \"null\";\n }\n\n // Array with length info\n if (Array.isArray(value)) {\n return `array[${value.length}]`;\n }\n\n if (typeof value === \"object\") {\n // Return constructor name for class instances\n if (\"constructor\" in value && value.constructor.name !== \"Object\") {\n return value.constructor.name;\n }\n\n // Plain object\n return \"object\";\n }\n\n // Primitive types (string, number, boolean, undefined, etc.)\n // Note: typeof undefined === \"undefined\", so we don't need explicit check\n return typeof value;\n}\n","// packages/type-guards/modules/validators/state.ts\n\nimport { isState } from \"../guards\";\nimport { getTypeDescription } from \"../utilities/type-description\";\n\nimport type { State } from \"@real-router/types\";\n\n/**\n * Validates that a state has the correct structure.\n * Throws a descriptive error if validation fails.\n *\n * @param state - State to validate\n * @param method - Context for error message\n * @throws {TypeError} If state structure is invalid\n *\n * @example\n * validateState({ name: 'home', params: {}, path: '/' }, 'navigate'); // ok\n * validateState({ name: 'home' }, 'navigate'); // throws (missing params, path)\n * validateState(null, 'navigate'); // throws (not an object)\n */\nexport function validateState(\n state: unknown,\n method: string,\n): asserts state is State {\n if (!isState(state)) {\n throw new TypeError(\n `[${method}] Invalid state structure: ${getTypeDescription(state)}. ` +\n `Expected State object with name, params, and path properties.`,\n );\n }\n}\n","// packages/real-router/modules/constants.ts\n\nimport type {\n EventName,\n EventToNameMap,\n EventToPluginMap,\n ErrorCodeToValueMap,\n ErrorCodeKeys,\n ErrorCodeValues,\n} from \"@real-router/types\";\n\nexport type ConstantsKeys = \"UNKNOWN_ROUTE\";\n\nexport type Constants = Record<ConstantsKeys, string>;\n\n// =============================================================================\n// Error Codes (migrated from router-error)\n// =============================================================================\n\nexport type ErrorCodes = Record<ErrorCodeKeys, ErrorCodeValues>;\n\n/**\n * Error codes for router operations.\n * Used to identify specific failure scenarios in navigation and lifecycle.\n * Frozen to prevent accidental modifications.\n */\nexport const errorCodes: ErrorCodeToValueMap = Object.freeze({\n ROUTER_NOT_STARTED: \"NOT_STARTED\", // navigate() called before start()\n NO_START_PATH_OR_STATE: \"NO_START_PATH_OR_STATE\", // start() without initial route\n ROUTER_ALREADY_STARTED: \"ALREADY_STARTED\", // start() called twice\n ROUTE_NOT_FOUND: \"ROUTE_NOT_FOUND\", // Navigation to non-existent route\n SAME_STATES: \"SAME_STATES\", // Navigate to current route without reload\n CANNOT_DEACTIVATE: \"CANNOT_DEACTIVATE\", // canDeactivate guard blocked navigation\n CANNOT_ACTIVATE: \"CANNOT_ACTIVATE\", // canActivate guard blocked navigation\n TRANSITION_ERR: \"TRANSITION_ERR\", // Generic transition failure\n TRANSITION_CANCELLED: \"CANCELLED\", // Navigation cancelled by user or new navigation\n ROUTER_DISPOSED: \"DISPOSED\", // Router has been disposed\n});\n\n/**\n * General router constants.\n * Special route names and identifiers.\n */\nexport const constants: Constants = {\n UNKNOWN_ROUTE: \"@@router/UNKNOWN_ROUTE\", // Special route for 404/not found states\n};\n\n/**\n * Plugin method names.\n * Maps to methods that plugins can implement to hook into router lifecycle.\n */\nexport const plugins: EventToPluginMap = {\n ROUTER_START: \"onStart\", // Plugin method called when router starts\n ROUTER_STOP: \"onStop\", // Plugin method called when router stops\n TRANSITION_START: \"onTransitionStart\", // Plugin method called when navigation begins\n TRANSITION_CANCEL: \"onTransitionCancel\", // Plugin method called when navigation cancelled\n TRANSITION_SUCCESS: \"onTransitionSuccess\", // Plugin method called when navigation succeeds\n TRANSITION_ERROR: \"onTransitionError\", // Plugin method called when navigation fails\n};\n\n/**\n * Event names for router event system.\n * Used with addEventListener/removeEventListener for reactive subscriptions.\n */\nexport const events: EventToNameMap = {\n ROUTER_START: \"$start\", // Emitted when router.start() succeeds\n ROUTER_STOP: \"$stop\", // Emitted when router.stop() is called\n TRANSITION_START: \"$$start\", // Emitted when navigation begins\n TRANSITION_CANCEL: \"$$cancel\", // Emitted when navigation is cancelled\n TRANSITION_SUCCESS: \"$$success\", // Emitted when navigation completes successfully\n TRANSITION_ERROR: \"$$error\", // Emitted when navigation fails\n};\n\n/**\n * Valid event names for validation.\n */\nexport const validEventNames = new Set<EventName>([\n events.ROUTER_START,\n events.TRANSITION_START,\n events.TRANSITION_SUCCESS,\n events.TRANSITION_ERROR,\n events.TRANSITION_CANCEL,\n events.ROUTER_STOP,\n]);\n\n/**\n * Default limits configuration for the router.\n * These values match the hardcoded constants from the current codebase.\n */\nexport const DEFAULT_LIMITS = {\n maxDependencies: 100,\n maxPlugins: 50,\n maxMiddleware: 50,\n maxListeners: 10_000,\n warnListeners: 1000,\n maxEventDepth: 5,\n maxLifecycleHandlers: 200,\n} as const;\n\n/**\n * Bounds for each limit - defines min and max allowed values.\n * Used for runtime validation in setLimit/withLimits.\n */\nexport const LIMIT_BOUNDS = {\n maxDependencies: { min: 0, max: 10_000 },\n maxPlugins: { min: 0, max: 1000 },\n maxMiddleware: { min: 0, max: 1000 },\n maxListeners: { min: 0, max: 100_000 },\n warnListeners: { min: 0, max: 100_000 },\n maxEventDepth: { min: 0, max: 100 },\n maxLifecycleHandlers: { min: 0, max: 10_000 },\n} as const;\n","// packages/core/src/fsm/routerFSM.ts\n\nimport { FSM } from \"@real-router/fsm\";\n\nimport type { FSMConfig } from \"@real-router/fsm\";\nimport type { NavigationOptions, State } from \"@real-router/types\";\n\n/**\n * Router FSM states.\n *\n * - IDLE: Router not started or stopped\n * - STARTING: Router is initializing\n * - READY: Router is ready for navigation\n * - TRANSITIONING: Navigation in progress\n * - DISPOSED: Router has been disposed (R2+)\n */\nexport const routerStates = {\n IDLE: \"IDLE\",\n STARTING: \"STARTING\",\n READY: \"READY\",\n TRANSITIONING: \"TRANSITIONING\",\n DISPOSED: \"DISPOSED\",\n} as const;\n\nexport type RouterState = (typeof routerStates)[keyof typeof routerStates];\n\n/**\n * Router FSM events.\n *\n * - START: Begin router initialization\n * - STARTED: Router initialization complete\n * - NAVIGATE: Begin navigation\n * - COMPLETE: Navigation completed successfully\n * - FAIL: Navigation or initialization failed\n * - CANCEL: Navigation cancelled\n * - STOP: Stop router\n * - DISPOSE: Dispose router (R2+)\n */\nexport const routerEvents = {\n START: \"START\",\n STARTED: \"STARTED\",\n NAVIGATE: \"NAVIGATE\",\n COMPLETE: \"COMPLETE\",\n FAIL: \"FAIL\",\n CANCEL: \"CANCEL\",\n STOP: \"STOP\",\n DISPOSE: \"DISPOSE\",\n} as const;\n\nexport type RouterEvent = (typeof routerEvents)[keyof typeof routerEvents];\n\n/**\n * Typed payloads for router FSM events.\n *\n * Events without entries have no payload.\n */\nexport interface RouterPayloads {\n NAVIGATE: {\n toState: State;\n fromState: State | undefined;\n };\n COMPLETE: {\n state: State;\n fromState: State | undefined;\n opts: NavigationOptions;\n };\n FAIL: {\n toState?: State | undefined;\n fromState?: State | undefined;\n error?: unknown;\n };\n CANCEL: {\n toState: State;\n fromState: State | undefined;\n };\n}\n\n/**\n * Router FSM configuration.\n *\n * Transitions:\n * - IDLE → STARTING (START), DISPOSED (DISPOSE)\n * - STARTING → READY (STARTED), IDLE (FAIL)\n * - READY → TRANSITIONING (NAVIGATE), READY (FAIL, self-loop for early validation errors), IDLE (STOP)\n * - TRANSITIONING → TRANSITIONING (NAVIGATE, self-loop for canSend), READY (COMPLETE, CANCEL, FAIL)\n * - DISPOSED → (no transitions)\n */\nconst routerFSMConfig: FSMConfig<RouterState, RouterEvent, null> = {\n initial: routerStates.IDLE,\n context: null,\n transitions: {\n [routerStates.IDLE]: {\n [routerEvents.START]: routerStates.STARTING,\n [routerEvents.DISPOSE]: routerStates.DISPOSED,\n },\n [routerStates.STARTING]: {\n [routerEvents.STARTED]: routerStates.READY,\n [routerEvents.FAIL]: routerStates.IDLE,\n },\n [routerStates.READY]: {\n [routerEvents.NAVIGATE]: routerStates.TRANSITIONING,\n [routerEvents.FAIL]: routerStates.READY,\n [routerEvents.STOP]: routerStates.IDLE,\n },\n [routerStates.TRANSITIONING]: {\n [routerEvents.NAVIGATE]: routerStates.TRANSITIONING,\n [routerEvents.COMPLETE]: routerStates.READY,\n [routerEvents.CANCEL]: routerStates.READY,\n [routerEvents.FAIL]: routerStates.READY,\n },\n [routerStates.DISPOSED]: {},\n },\n};\n\n/**\n * Factory function to create a router FSM instance.\n *\n * @returns FSM instance with initial state \"IDLE\"\n */\nexport function createRouterFSM(): FSM<\n RouterState,\n RouterEvent,\n null,\n RouterPayloads\n> {\n return new FSM<RouterState, RouterEvent, null, RouterPayloads>(\n routerFSMConfig,\n );\n}\n","// packages/real-router/modules/helpers.ts\n\nimport { DEFAULT_LIMITS } from \"./constants\";\n\nimport type { Limits } from \"./types\";\nimport type { State, LimitsConfig } from \"@real-router/types\";\n\nexport { getTypeDescription } from \"type-guards\";\n\n// =============================================================================\n// State Helpers\n// =============================================================================\n\n/**\n * Structural type guard for State object.\n * Only checks required fields exist with correct types.\n * Does NOT validate params serializability (allows circular refs).\n *\n * Use `isState` from type-guards for full validation (serializable params).\n * Use this for internal operations like deepFreezeState that handle any object structure.\n *\n * @param value - Value to check\n * @returns true if value has State structure\n * @internal\n */\nfunction isStateStructural(value: unknown): value is State {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n return (\n typeof obj.name === \"string\" &&\n typeof obj.path === \"string\" &&\n typeof obj.params === \"object\" &&\n obj.params !== null\n );\n}\n\n/**\n * Deep freezes State object to prevent mutations.\n * Creates a deep clone first, then recursively freezes the clone and all nested objects.\n * Uses simple recursive freezing after cloning (no need for WeakSet since clone has no circular refs).\n *\n * @param state - The State object to freeze\n * @returns A frozen deep clone of the state\n * @throws {TypeError} If state is not a valid State object\n *\n * @example\n * const state = { name: 'home', params: {}, path: '/' };\n * const frozen = deepFreezeState(state);\n * // frozen.params is now immutable\n * // original state is unchanged\n */\nexport function deepFreezeState<T extends State>(state: T): T {\n // Early return for null/undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!state) {\n return state;\n }\n\n // Validate State structure (structural check, allows circular refs)\n if (!isStateStructural(state)) {\n throw new TypeError(\n `[deepFreezeState] Expected valid State object, got: ${typeof state}`,\n );\n }\n\n // Create a deep clone to avoid mutating the original\n // structuredClone preserves circular references, so we need to track visited objects\n const clonedState = structuredClone(state);\n\n // WeakSet to track visited objects (prevent infinite recursion with circular refs)\n const visited = new WeakSet<object>();\n\n // Recursive freeze function with circular reference protection\n function freezeClonedRecursive(obj: unknown): void {\n // Skip primitives, null, undefined\n // Note: typeof undefined === \"undefined\" !== \"object\", so checking undefined is redundant\n if (obj === null || typeof obj !== \"object\") {\n return;\n }\n\n // Skip already visited objects (circular reference protection)\n if (visited.has(obj)) {\n return;\n }\n\n // Mark as visited\n visited.add(obj);\n\n // Freeze the object/array itself\n Object.freeze(obj);\n\n // Get all values to freeze recursively\n const values = Array.isArray(obj) ? obj : Object.values(obj);\n\n // Recursively freeze nested values\n for (const value of values) {\n freezeClonedRecursive(value);\n }\n }\n\n // Freeze the entire cloned state tree\n freezeClonedRecursive(clonedState);\n\n return clonedState;\n}\n\n// WeakSet to track already frozen root objects for O(1) re-freeze check\nconst frozenRoots = new WeakSet<object>();\n\n// Module-scope recursive freeze function - better JIT optimization, no allocation per call\nfunction freezeRecursive(obj: unknown): void {\n // Skip primitives, null\n if (obj === null || typeof obj !== \"object\") {\n return;\n }\n\n // Skip already frozen objects (handles potential shared refs)\n if (Object.isFrozen(obj)) {\n return;\n }\n\n // Freeze the object/array\n Object.freeze(obj);\n\n // Iterate without Object.values() allocation\n if (Array.isArray(obj)) {\n for (const item of obj) {\n freezeRecursive(item);\n }\n } else {\n for (const key in obj) {\n freezeRecursive((obj as Record<string, unknown>)[key]);\n }\n }\n}\n\n/**\n * Freezes State object in-place without cloning.\n * Optimized for hot paths where state is known to be a fresh object.\n *\n * IMPORTANT: Only use this when you know the state is a fresh object\n * that hasn't been exposed to external code yet (e.g., from makeState()).\n *\n * @param state - The State object to freeze (must be a fresh object)\n * @returns The same state object, now frozen\n * @internal\n */\nexport function freezeStateInPlace<T extends State>(state: T): T {\n // Early return for null/undefined - state from makeState() is never null\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!state) {\n return state;\n }\n\n // Fast path: already processed root object - O(1) check\n if (frozenRoots.has(state)) {\n return state;\n }\n\n // Freeze the entire state tree\n freezeRecursive(state);\n\n // Mark root as processed for future calls\n frozenRoots.add(state);\n\n return state;\n}\n\n/**\n * Computes warning and error thresholds for a given limit.\n * WARN threshold: 20% of limit\n * ERROR threshold: 50% of limit\n */\nexport function computeThresholds(limit: number): {\n warn: number;\n error: number;\n} {\n return {\n warn: Math.floor(limit * 0.2),\n error: Math.floor(limit * 0.5),\n };\n}\n\n/**\n * Merges user limits with defaults.\n * Returns frozen object for immutability.\n */\nexport function createLimits(userLimits: Partial<LimitsConfig> = {}): Limits {\n return { ...DEFAULT_LIMITS, ...userLimits };\n}\n","// packages/core/src/namespaces/DependenciesNamespace/validators.ts\n\n/**\n * Static validation functions for DependenciesNamespace.\n * Called by Router facade before instance methods.\n *\n * Extracted from DependenciesNamespace class for better separation of concerns.\n */\n\nimport { getTypeDescription } from \"type-guards\";\n\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\n/**\n * Validates that dependency name is a string.\n * Called by facade before get/remove/has operations.\n */\nexport function validateDependencyName(\n name: unknown,\n methodName: string,\n): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.${methodName}]: dependency name must be a string, got ${typeof name}`,\n );\n }\n}\n\n/**\n * Validates setDependency name argument.\n * Value is not validated - any value is valid.\n */\nexport function validateSetDependencyArgs(\n name: unknown,\n): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.setDependency]: dependency name must be a string, got ${typeof name}`,\n );\n }\n}\n\n/**\n * Validates that dependencies object is a plain object without getters.\n * Called by facade before setMultiple/constructor.\n */\nexport function validateDependenciesObject(\n deps: unknown,\n methodName: string,\n): asserts deps is Record<string, unknown> {\n // Reject non-plain objects (classes, Date, Map, Array)\n if (!(deps && typeof deps === \"object\" && deps.constructor === Object)) {\n throw new TypeError(\n `[router.${methodName}] Invalid argument: expected plain object, received ${getTypeDescription(deps)}`,\n );\n }\n\n // Getters can throw, return different values, or have side effects\n for (const key in deps) {\n if (Object.getOwnPropertyDescriptor(deps, key)?.get) {\n throw new TypeError(\n `[router.${methodName}] Getters not allowed: \"${key}\"`,\n );\n }\n }\n}\n\n/**\n * Validates that dependency exists (not undefined).\n * Throws ReferenceError if dependency is not found.\n */\nexport function validateDependencyExists(\n value: unknown,\n dependencyName: string,\n): asserts value is NonNullable<unknown> {\n if (value === undefined) {\n throw new ReferenceError(\n `[router.getDependency]: dependency \"${dependencyName}\" not found`,\n );\n }\n}\n\n/**\n * Validates that adding dependencies won't exceed the hard limit.\n * Called before bulk operations to ensure atomicity.\n */\nexport function validateDependencyLimit(\n currentCount: number,\n newCount: number,\n methodName: string,\n maxDependencies: number = DEFAULT_LIMITS.maxDependencies,\n): void {\n if (maxDependencies === 0) {\n return;\n }\n\n const totalCount = currentCount + newCount;\n\n if (totalCount >= maxDependencies) {\n throw new Error(\n `[router.${methodName}] Dependency limit exceeded (${maxDependencies}). ` +\n `Current: ${totalCount}. This is likely a bug in your code.`,\n );\n }\n}\n","// packages/core/src/namespaces/DependenciesNamespace/DependenciesNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport {\n validateDependencyExists,\n validateDependencyLimit,\n validateDependencyName,\n validateDependenciesObject,\n validateSetDependencyArgs,\n} from \"./validators\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\nimport { computeThresholds } from \"../../helpers\";\n\nimport type { Limits } from \"../../types\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\n/**\n * Independent namespace for managing router dependencies.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic (limits, warnings).\n */\nexport class DependenciesNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #dependencies: Partial<Dependencies> = Object.create(\n null,\n ) as Partial<Dependencies>;\n\n #limits: Limits = DEFAULT_LIMITS;\n\n constructor(initialDependencies: Partial<Dependencies> = {} as Dependencies) {\n this.setMultiple(initialDependencies);\n }\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateName(\n name: unknown,\n methodName: string,\n ): asserts name is string {\n validateDependencyName(name, methodName);\n }\n\n static validateSetDependencyArgs(name: unknown): asserts name is string {\n validateSetDependencyArgs(name);\n }\n\n static validateDependenciesObject(\n deps: unknown,\n methodName: string,\n ): asserts deps is Record<string, unknown> {\n validateDependenciesObject(deps, methodName);\n }\n\n static validateDependencyExists(\n value: unknown,\n dependencyName: string,\n ): asserts value is NonNullable<unknown> {\n validateDependencyExists(value, dependencyName);\n }\n\n static validateDependencyLimit(\n currentCount: number,\n newCount: number,\n methodName: string,\n maxDependencies?: number,\n ): void {\n validateDependencyLimit(\n currentCount,\n newCount,\n methodName,\n maxDependencies,\n );\n }\n\n setLimits(limits: Limits): void {\n this.#limits = limits;\n }\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Sets a single dependency.\n * Returns true if set, false if value was undefined (no-op).\n *\n * @param dependencyName - Already validated by facade\n * @param dependencyValue - Value to set\n */\n set<K extends keyof Dependencies & string>(\n dependencyName: K,\n dependencyValue: Dependencies[K],\n ): boolean {\n // undefined = \"don't set\" (feature for conditional setting)\n if (dependencyValue === undefined) {\n return false;\n }\n\n const isNewKey = !Object.hasOwn(this.#dependencies, dependencyName);\n\n if (isNewKey) {\n // Only check limit when adding new keys (overwrites don't increase count)\n this.#checkDependencyCount(\"setDependency\");\n } else {\n const oldValue = this.#dependencies[dependencyName];\n const isChanging = oldValue !== dependencyValue;\n // Special case for NaN idempotency (NaN !== NaN is always true)\n const bothAreNaN =\n Number.isNaN(oldValue) && Number.isNaN(dependencyValue);\n\n if (isChanging && !bothAreNaN) {\n logger.warn(\n \"router.setDependency\",\n \"Router dependency already exists and is being overwritten:\",\n dependencyName,\n );\n }\n }\n\n this.#dependencies[dependencyName] = dependencyValue;\n\n return true;\n }\n\n /**\n * Sets multiple dependencies at once.\n * Limit check should be done by facade before calling this method.\n *\n * @param deps - Already validated by facade\n */\n setMultiple(deps: Partial<Dependencies>): void {\n const overwrittenKeys: string[] = [];\n\n for (const key in deps) {\n if (deps[key] !== undefined) {\n if (Object.hasOwn(this.#dependencies, key)) {\n overwrittenKeys.push(key);\n }\n\n this.#dependencies[key] = deps[key];\n }\n }\n\n if (overwrittenKeys.length > 0) {\n logger.warn(\n \"router.setDependencies\",\n \"Overwritten:\",\n overwrittenKeys.join(\", \"),\n );\n }\n }\n\n /**\n * Gets a single dependency.\n * Throws if not found.\n *\n * @param dependencyName - Already validated by facade\n */\n get<K extends keyof Dependencies>(dependencyName: K): Dependencies[K] {\n return this.#dependencies[dependencyName] as Dependencies[K];\n }\n\n /**\n * Gets all dependencies as a shallow copy.\n */\n getAll(): Partial<Dependencies> {\n return { ...this.#dependencies };\n }\n\n /**\n * Gets the current number of dependencies.\n */\n count(): number {\n return Object.keys(this.#dependencies).length;\n }\n\n /**\n * Removes a dependency by name.\n * Logs warning if dependency doesn't exist.\n */\n remove(dependencyName: keyof Dependencies): void {\n if (!Object.hasOwn(this.#dependencies, dependencyName)) {\n logger.warn(\n `router.removeDependency`,\n `Attempted to remove non-existent dependency: \"${getTypeDescription(dependencyName)}\"`,\n );\n }\n\n delete this.#dependencies[dependencyName];\n }\n\n /**\n * Checks if a dependency exists.\n */\n has(dependencyName: keyof Dependencies): boolean {\n return Object.hasOwn(this.#dependencies, dependencyName);\n }\n\n /**\n * Removes all dependencies.\n */\n reset(): void {\n for (const key in this.#dependencies) {\n delete this.#dependencies[key];\n }\n }\n\n // =========================================================================\n // Private methods (business logic)\n // =========================================================================\n\n #checkDependencyCount(methodName: string): void {\n const maxDependencies = this.#limits.maxDependencies;\n\n if (maxDependencies === 0) {\n return;\n }\n\n const currentCount = Object.keys(this.#dependencies).length;\n\n const { warn, error } = computeThresholds(maxDependencies);\n\n if (currentCount === warn) {\n logger.warn(\n `router.${methodName}`,\n `${warn} dependencies registered. ` + `Consider if all are necessary.`,\n );\n } else if (currentCount === error) {\n logger.error(\n `router.${methodName}`,\n `${error} dependencies registered! ` +\n `This indicates architectural problems. ` +\n `Hard limit at ${maxDependencies}.`,\n );\n } else if (currentCount >= maxDependencies) {\n throw new Error(\n `[router.${methodName}] Dependency limit exceeded (${maxDependencies}). ` +\n `Current: ${currentCount}. This is likely a bug in your code. ` +\n `If you genuinely need more dependencies, your architecture needs refactoring.`,\n );\n }\n }\n}\n","// packages/core/src/namespaces/OptionsNamespace/constants.ts\n\nimport type { Options } from \"@real-router/types\";\n\n/**\n * Default options for the router.\n */\nexport const defaultOptions: Options = {\n defaultRoute: \"\",\n defaultParams: {},\n trailingSlash: \"preserve\",\n queryParamsMode: \"loose\",\n queryParams: {\n arrayFormat: \"none\",\n booleanFormat: \"none\",\n nullFormat: \"default\",\n },\n urlParamsEncoding: \"default\",\n allowNotFound: true,\n rewritePathOnMatch: true,\n noValidate: false,\n} satisfies Options;\n\n/**\n * Valid values for string enum options.\n * Used for runtime validation in constructor options.\n */\nexport const VALID_OPTION_VALUES = {\n trailingSlash: [\"strict\", \"never\", \"always\", \"preserve\"] as const,\n queryParamsMode: [\"default\", \"strict\", \"loose\"] as const,\n urlParamsEncoding: [\"default\", \"uri\", \"uriComponent\", \"none\"] as const,\n} as const;\n\n/**\n * Valid keys and values for queryParams option.\n */\nexport const VALID_QUERY_PARAMS = {\n arrayFormat: [\"none\", \"brackets\", \"index\", \"comma\"] as const,\n booleanFormat: [\"none\", \"string\", \"empty-true\"] as const,\n nullFormat: [\"default\", \"hidden\"] as const,\n} as const;\n","// packages/core/src/namespaces/OptionsNamespace/helpers.ts\n\nimport type { Options, Params } from \"@real-router/types\";\n\n/**\n * Recursively freezes an object and all nested objects.\n * Only freezes plain objects, not primitives or special objects.\n */\nexport function deepFreeze<T extends object>(obj: T): Readonly<T> {\n Object.freeze(obj);\n\n for (const key of Object.keys(obj)) {\n const value = (obj as Record<string, unknown>)[key];\n\n if (value && typeof value === \"object\" && value.constructor === Object) {\n deepFreeze(value);\n }\n }\n\n return obj;\n}\n\n/**\n * Resolves an option value that can be static or a callback.\n * If the value is a function, calls it with getDependency and returns the result.\n * Otherwise, returns the value as-is.\n */\nexport function resolveOption(\n value: Options[\"defaultRoute\"],\n getDependency: (name: string) => unknown,\n): string;\n\nexport function resolveOption(\n value: Options[\"defaultParams\"],\n getDependency: (name: string) => unknown,\n): Params;\n\n// eslint-disable-next-line sonarjs/function-return-type -- overloads: string for defaultRoute, Params for defaultParams\nexport function resolveOption(\n value: Options[\"defaultRoute\"] | Options[\"defaultParams\"],\n getDependency: (name: string) => unknown,\n): string | Params {\n if (typeof value === \"function\") {\n // Runtime getDependency is (name: string) => unknown, but DefaultRouteCallback<object>\n // expects <K extends keyof object>(name: K) => object[K] where keyof object = never.\n // Cast needed to bridge generic constraint mismatch.\n return value(getDependency as never);\n }\n\n return value;\n}\n","// packages/core/src/namespaces/OptionsNamespace/validators.ts\n\n/**\n * Static validation functions for OptionsNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { isObjKey, getTypeDescription } from \"type-guards\";\n\nimport {\n defaultOptions,\n VALID_OPTION_VALUES,\n VALID_QUERY_PARAMS,\n} from \"./constants\";\nimport { LIMIT_BOUNDS } from \"../../constants\";\n\nimport type { LimitsConfig, Options } from \"@real-router/types\";\n\n/**\n * Validates that value is a plain object without getters.\n */\nexport function validatePlainObject(\n value: unknown,\n optionName: string,\n methodName: string,\n): asserts value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || value.constructor !== Object) {\n throw new TypeError(\n `[router.${methodName}] Invalid type for \"${optionName}\": ` +\n `expected plain object, got ${getTypeDescription(value)}`,\n );\n }\n\n // Getters can throw, return different values, or have side effects\n for (const key in value) {\n if (Object.getOwnPropertyDescriptor(value, key)?.get) {\n throw new TypeError(\n `[router.${methodName}] Getters not allowed in \"${optionName}\": \"${key}\"`,\n );\n }\n }\n}\n\n/**\n * Validates queryParams keys and values against allowed enums.\n */\nexport function validateQueryParams(\n value: Record<string, unknown>,\n methodName: string,\n): void {\n for (const key in value) {\n if (!isObjKey(key, VALID_QUERY_PARAMS)) {\n const validKeys = Object.keys(VALID_QUERY_PARAMS)\n .map((k) => `\"${k}\"`)\n .join(\", \");\n\n throw new TypeError(\n `[router.${methodName}] Unknown queryParams key: \"${key}\". ` +\n `Valid keys: ${validKeys}`,\n );\n }\n\n const paramValue = value[key];\n const validValues = VALID_QUERY_PARAMS[key];\n const isValid = (validValues as readonly string[]).includes(\n paramValue as string,\n );\n\n if (!isValid) {\n const allowedValues = validValues.map((v) => `\"${v}\"`).join(\", \");\n\n throw new TypeError(\n `[router.${methodName}] Invalid value for queryParams.${key}: ` +\n `expected one of ${allowedValues}, got \"${String(paramValue)}\"`,\n );\n }\n }\n}\n\n/**\n * Validates string enum options against allowed values.\n */\nexport function validateEnumOption(\n optionName: keyof typeof VALID_OPTION_VALUES,\n value: unknown,\n methodName: string,\n): void {\n const validValues = VALID_OPTION_VALUES[optionName];\n const isValid = (validValues as readonly string[]).includes(value as string);\n\n if (!isValid) {\n const allowedValues = validValues.map((v) => `\"${v}\"`).join(\", \");\n\n throw new TypeError(\n `[router.${methodName}] Invalid value for \"${optionName}\": ` +\n `expected one of ${allowedValues}, got \"${String(value)}\"`,\n );\n }\n}\n\n/**\n * Validates a single option value against expected type and constraints.\n * Skips validation for unknown options - validateOptionExists handles that.\n */\nexport function validateOptionValue(\n optionName: keyof Options,\n value: unknown,\n methodName: string,\n): void {\n // Allow callback functions for dynamic default route/params options\n // MUST be first check — before object branch (L140) which would reject\n // functions via validatePlainObject for defaultParams (default = {})\n if (\n typeof value === \"function\" &&\n (optionName === \"defaultRoute\" || optionName === \"defaultParams\")\n ) {\n return; // Valid — callback resolved at runtime\n }\n\n const expectedValue = defaultOptions[optionName];\n\n // For object options - ensure plain objects only (not null, arrays, Date, etc)\n if (expectedValue && typeof expectedValue === \"object\") {\n validatePlainObject(value, optionName, methodName);\n\n if (optionName === \"queryParams\") {\n validateQueryParams(value, methodName);\n }\n\n return;\n }\n\n // For primitives - typeof check first\n if (typeof value !== typeof expectedValue) {\n throw new TypeError(\n `[router.${methodName}] Invalid type for \"${optionName}\": ` +\n `expected ${typeof expectedValue}, got ${typeof value}`,\n );\n }\n\n // For string enum options - validate against allowed values\n if (optionName in VALID_OPTION_VALUES) {\n validateEnumOption(\n optionName as keyof typeof VALID_OPTION_VALUES,\n value,\n methodName,\n );\n }\n}\n\n/**\n * Validates optional fields not in defaultOptions.\n * Note: logger is handled before validateOptions in Router constructor.\n */\nfunction validateOptionalField(\n key: string,\n value: unknown,\n methodName: string,\n): boolean {\n if (key === \"limits\") {\n if (value !== undefined) {\n validateLimits(value, methodName);\n }\n\n return true;\n }\n\n throw new TypeError(`[router.${methodName}] Unknown option: \"${key}\"`);\n}\n\n/**\n * Validates a partial options object.\n * Called by facade before constructor/withOptions.\n */\nexport function validateOptions(\n options: unknown,\n methodName: string,\n): asserts options is Partial<Options> {\n if (\n !options ||\n typeof options !== \"object\" ||\n options.constructor !== Object\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid options: expected plain object, got ${getTypeDescription(options)}`,\n );\n }\n\n for (const [key, value] of Object.entries(options)) {\n // Skip optional fields that aren't in defaultOptions (limits, logger, etc.)\n if (!isObjKey(key, defaultOptions)) {\n validateOptionalField(key, value, methodName);\n continue;\n }\n\n // Skip undefined values for conditional configuration\n if (value === undefined) {\n continue;\n }\n\n validateOptionValue(key, value, methodName);\n }\n}\n\n/**\n * Validates that a limit value is within bounds.\n */\nexport function validateLimitValue(\n limitName: keyof LimitsConfig,\n value: unknown,\n methodName: string,\n): void {\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n throw new TypeError(\n `[router.${methodName}]: limit \"${limitName}\" must be an integer, got ${String(value)}`,\n );\n }\n\n const bounds = LIMIT_BOUNDS[limitName];\n\n if (value < bounds.min || value > bounds.max) {\n throw new RangeError(\n `[router.${methodName}]: limit \"${limitName}\" must be between ${bounds.min} and ${bounds.max}, got ${value}`,\n );\n }\n}\n\n/**\n * Validates a partial limits object.\n */\nexport function validateLimits(\n limits: unknown,\n methodName: string,\n): asserts limits is Partial<LimitsConfig> {\n if (!limits || typeof limits !== \"object\" || limits.constructor !== Object) {\n throw new TypeError(\n `[router.${methodName}]: invalid limits: expected plain object, got ${typeof limits}`,\n );\n }\n\n for (const [key, value] of Object.entries(limits)) {\n if (!Object.hasOwn(LIMIT_BOUNDS, key)) {\n throw new TypeError(`[router.${methodName}]: unknown limit: \"${key}\"`);\n }\n\n if (value === undefined) {\n continue;\n }\n\n validateLimitValue(key as keyof LimitsConfig, value, methodName);\n }\n}\n","// packages/core/src/namespaces/OptionsNamespace/OptionsNamespace.ts\n\nimport { defaultOptions } from \"./constants\";\nimport { deepFreeze } from \"./helpers\";\nimport { validateOptions } from \"./validators\";\n\nimport type { Options } from \"@real-router/types\";\n\n/**\n * Independent namespace for managing router options.\n *\n * Options are immutable after construction.\n * Static methods handle validation (called by facade).\n * Instance methods provide read-only access.\n */\nexport class OptionsNamespace {\n readonly #options: Readonly<Options>;\n\n constructor(initialOptions: Partial<Options> = {}) {\n // Note: validation should be done by facade before calling constructor\n this.#options = deepFreeze({\n ...defaultOptions,\n ...initialOptions,\n });\n }\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateOptions(\n options: unknown,\n methodName: string,\n ): asserts options is Partial<Options> {\n validateOptions(options, methodName);\n }\n\n // =========================================================================\n // Instance methods (read-only access)\n // =========================================================================\n\n /**\n * Returns the frozen options object.\n * Safe to return directly - mutations will throw in strict mode.\n */\n get(): Readonly<Options> {\n return this.#options;\n }\n}\n","// packages/core/src/namespaces/StateNamespace/helpers.ts\n\nimport type { RouteTreeStateMeta } from \"route-tree\";\n\n/**\n * Extracts URL param names from RouteTreeStateMeta.\n * This is an O(segments × params) operation but avoids tree traversal.\n */\nexport function getUrlParamsFromMeta(meta: RouteTreeStateMeta): string[] {\n const urlParams: string[] = [];\n\n for (const segmentName in meta) {\n const paramMap = meta[segmentName];\n\n for (const param in paramMap) {\n if (paramMap[param] === \"url\") {\n urlParams.push(param);\n }\n }\n }\n\n return urlParams;\n}\n\n/**\n * Compares two parameter values for equality.\n * Supports deep equality for arrays (common in route params like tags, ids).\n */\nexport function areParamValuesEqual(val1: unknown, val2: unknown): boolean {\n if (val1 === val2) {\n return true;\n }\n\n if (Array.isArray(val1) && Array.isArray(val2)) {\n if (val1.length !== val2.length) {\n return false;\n }\n\n return val1.every((v, i) => areParamValuesEqual(v, val2[i]));\n }\n\n return false;\n}\n","// packages/core/src/namespaces/StateNamespace/StateNamespace.ts\n\nimport {\n getTypeDescription,\n isParams,\n isString,\n validateState,\n} from \"type-guards\";\n\nimport { areParamValuesEqual, getUrlParamsFromMeta } from \"./helpers\";\nimport { constants } from \"../../constants\";\nimport { freezeStateInPlace } from \"../../helpers\";\n\nimport type { StateNamespaceDependencies } from \"./types\";\nimport type {\n NavigationOptions,\n Params,\n State,\n StateMetaInput,\n} from \"@real-router/types\";\nimport type { RouteTreeStateMeta } from \"route-tree\";\n\n/**\n * Independent namespace for managing router state storage and creation.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle state storage, freezing, and creation.\n */\nexport class StateNamespace {\n /**\n * Auto-incrementing state ID for tracking navigation history.\n */\n #stateId = 0;\n\n /**\n * Cached frozen state - avoids structuredClone on every getState() call.\n */\n #frozenState: State | undefined = undefined;\n\n /**\n * Previous state before the last setState call.\n */\n #previousState: State | undefined = undefined;\n\n /**\n * Dependencies injected from Router.\n */\n #deps!: StateNamespaceDependencies;\n\n /**\n * Cache for URL params by route name.\n */\n readonly #urlParamsCache = new Map<string, string[]>();\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // =========================================================================\n\n /**\n * Validates makeState arguments.\n */\n static validateMakeStateArgs(\n name: unknown,\n params: unknown,\n path: unknown,\n forceId: unknown,\n ): void {\n // Validate name is a string\n if (!isString(name)) {\n throw new TypeError(\n `[router.makeState] Invalid name: ${getTypeDescription(name)}. Expected string.`,\n );\n }\n\n // Validate params if provided\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(\n `[router.makeState] Invalid params: ${getTypeDescription(params)}. Expected plain object.`,\n );\n }\n\n // Validate path if provided\n if (path !== undefined && !isString(path)) {\n throw new TypeError(\n `[router.makeState] Invalid path: ${getTypeDescription(path)}. Expected string.`,\n );\n }\n\n // Validate forceId if provided\n if (forceId !== undefined && typeof forceId !== \"number\") {\n throw new TypeError(\n `[router.makeState] Invalid forceId: ${getTypeDescription(forceId)}. Expected number.`,\n );\n }\n }\n\n /**\n * Validates areStatesEqual arguments.\n */\n static validateAreStatesEqualArgs(\n state1: unknown,\n state2: unknown,\n ignoreQueryParams: unknown,\n ): void {\n // null/undefined are valid (represent \"no state\")\n if (state1 != null) {\n validateState(state1, \"areStatesEqual\");\n }\n\n if (state2 != null) {\n validateState(state2, \"areStatesEqual\");\n }\n\n if (\n ignoreQueryParams !== undefined &&\n typeof ignoreQueryParams !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.areStatesEqual] Invalid ignoreQueryParams: ${getTypeDescription(ignoreQueryParams)}. Expected boolean.`,\n );\n }\n }\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Returns the current router state.\n *\n * The returned state is deeply frozen (immutable) for safety.\n * Returns `undefined` if the router has not been started or has been stopped.\n */\n get<P extends Params = Params, MP extends Params = Params>():\n | State<P, MP>\n | undefined {\n return this.#frozenState as State<P, MP> | undefined;\n }\n\n /**\n * Sets the current router state.\n *\n * The state is deeply frozen before storage to ensure immutability.\n * The previous state is preserved and accessible via `getPrevious()`.\n *\n * @param state - Already validated by facade, or undefined to clear\n */\n set(state: State | undefined): void {\n // Preserve current state as previous before updating\n this.#previousState = this.#frozenState;\n\n // If state is already frozen (from makeState()), use it directly.\n // For external states, freeze in place without cloning.\n this.#frozenState = state ? freezeStateInPlace(state) : undefined;\n }\n\n /**\n * Returns the previous router state (before the last navigation).\n */\n getPrevious<P extends Params = Params, MP extends Params = Params>():\n | State<P, MP>\n | undefined {\n return this.#previousState as State<P, MP> | undefined;\n }\n\n reset(): void {\n this.#frozenState = undefined;\n this.#previousState = undefined;\n this.#urlParamsCache.clear();\n this.#stateId = 0;\n }\n\n // =========================================================================\n // Dependency Injection\n // =========================================================================\n\n /**\n * Sets dependencies for state creation methods.\n * Must be called before using makeState, areStatesEqual, etc.\n */\n setDependencies(deps: StateNamespaceDependencies): void {\n this.#deps = deps;\n }\n\n // =========================================================================\n // State Creation Methods\n // =========================================================================\n\n /**\n * Creates a frozen state object for a route.\n */\n makeState<P extends Params = Params, MP extends Params = Params>(\n name: string,\n params?: P,\n path?: string,\n meta?: StateMetaInput<MP>,\n forceId?: number,\n ): State<P, MP> {\n const madeMeta = meta\n ? {\n ...meta,\n id: forceId ?? ++this.#stateId,\n params: meta.params,\n options: meta.options,\n redirected: meta.redirected,\n }\n : undefined;\n\n // Optimization: O(1) lookup instead of O(depth) ancestor iteration\n const defaultParamsConfig = this.#deps.getDefaultParams();\n const hasDefaultParams = Object.hasOwn(defaultParamsConfig, name);\n\n // Conditional allocation: avoid spreading when no defaultParams exist\n let mergedParams: P;\n\n if (hasDefaultParams) {\n mergedParams = { ...defaultParamsConfig[name], ...params } as P;\n } else if (params) {\n mergedParams = { ...params };\n } else {\n mergedParams = {} as P;\n }\n\n const state: State<P, MP> = {\n name,\n params: mergedParams,\n path: path ?? this.#deps.buildPath(name, params),\n meta: madeMeta,\n };\n\n return freezeStateInPlace(state);\n }\n\n /**\n * Creates a frozen state object for the \"not found\" route.\n */\n makeNotFoundState(path: string, options: NavigationOptions): State {\n return this.makeState<{ path: string }>(\n constants.UNKNOWN_ROUTE,\n { path },\n path,\n {\n options,\n params: {},\n redirected: false,\n },\n );\n }\n\n // =========================================================================\n // State Comparison Methods\n // =========================================================================\n\n /**\n * Compares two states for equality.\n * By default, ignores query params (only compares URL params).\n */\n areStatesEqual(\n state1: State | undefined,\n state2: State | undefined,\n ignoreQueryParams = true,\n ): boolean {\n if (!state1 || !state2) {\n return !!state1 === !!state2;\n }\n\n if (state1.name !== state2.name) {\n return false;\n }\n\n if (ignoreQueryParams) {\n const stateMeta = (state1.meta?.params ?? state2.meta?.params) as\n | RouteTreeStateMeta\n | undefined;\n\n const urlParams = stateMeta\n ? getUrlParamsFromMeta(stateMeta)\n : this.#getUrlParams(state1.name);\n\n return urlParams.every((param) =>\n areParamValuesEqual(state1.params[param], state2.params[param]),\n );\n }\n\n const state1Keys = Object.keys(state1.params);\n const state2Keys = Object.keys(state2.params);\n\n if (state1Keys.length !== state2Keys.length) {\n return false;\n }\n\n return state1Keys.every(\n (param) =>\n param in state2.params &&\n areParamValuesEqual(state1.params[param], state2.params[param]),\n );\n }\n\n // =========================================================================\n // Private Helpers\n // =========================================================================\n\n /**\n * Gets URL params for a route name, using cache for performance.\n */\n #getUrlParams(name: string): string[] {\n const cached = this.#urlParamsCache.get(name);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const result = this.#deps.getUrlParams(name);\n\n this.#urlParamsCache.set(name, result);\n\n return result;\n }\n}\n","// packages/core/src/namespaces/MiddlewareNamespace/validators.ts\n\n/**\n * Static validation functions for MiddlewareNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { getTypeDescription } from \"type-guards\";\n\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\nimport type { MiddlewareFactory } from \"../../types\";\nimport type { DefaultDependencies, Middleware } from \"@real-router/types\";\n\n/**\n * Gets a displayable name for a factory function.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction getFactoryName(factory: Function): string {\n return factory.name || \"anonymous\";\n}\n\n/**\n * Validates useMiddleware arguments - each must be a function.\n */\nexport function validateUseMiddlewareArgs<D extends DefaultDependencies>(\n middlewares: unknown[],\n): asserts middlewares is MiddlewareFactory<D>[] {\n for (const [i, middleware] of middlewares.entries()) {\n if (typeof middleware !== \"function\") {\n throw new TypeError(\n `[router.useMiddleware] Expected middleware factory function at index ${i}, ` +\n `got ${getTypeDescription(middleware)}`,\n );\n }\n }\n}\n\n/**\n * Validates that a middleware factory returned a valid middleware function.\n */\nexport function validateMiddleware<D extends DefaultDependencies>(\n middleware: unknown,\n factory: MiddlewareFactory<D>,\n): asserts middleware is Middleware {\n if (typeof middleware !== \"function\") {\n throw new TypeError(\n `[router.useMiddleware] Middleware factory must return a function, ` +\n `got ${getTypeDescription(middleware)}. ` +\n `Factory: ${getFactoryName(factory)}`,\n );\n }\n}\n\n/**\n * Validates that no duplicate factories are being registered.\n */\nexport function validateNoDuplicates<D extends DefaultDependencies>(\n newFactories: MiddlewareFactory<D>[],\n existingFactories: MiddlewareFactory<D>[],\n): void {\n const existingSet = new Set(existingFactories);\n\n for (const factory of newFactories) {\n if (existingSet.has(factory)) {\n throw new Error(\n `[router.useMiddleware] Middleware factory already registered. ` +\n `To re-register, first unsubscribe the existing middleware. ` +\n `Factory: ${getFactoryName(factory)}`,\n );\n }\n }\n}\n\n/**\n * Validates that adding middleware won't exceed the hard limit.\n */\nexport function validateMiddlewareLimit(\n currentCount: number,\n newCount: number,\n maxMiddleware: number = DEFAULT_LIMITS.maxMiddleware,\n): void {\n if (maxMiddleware === 0) {\n return;\n }\n\n const totalSize = currentCount + newCount;\n\n if (totalSize > maxMiddleware) {\n throw new Error(\n `[router.useMiddleware] Middleware limit exceeded (${maxMiddleware}). ` +\n `Current: ${currentCount}, Attempting to add: ${newCount}. ` +\n `This indicates an architectural problem. Consider consolidating middleware.`,\n );\n }\n}\n","// packages/core/src/namespaces/MiddlewareNamespace/MiddlewareNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\n\nimport {\n validateMiddleware,\n validateMiddlewareLimit,\n validateNoDuplicates,\n validateUseMiddlewareArgs,\n} from \"./validators\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\nimport { computeThresholds } from \"../../helpers\";\n\nimport type { InitializedMiddleware, MiddlewareDependencies } from \"./types\";\nimport type { Router } from \"../../Router\";\nimport type { Limits, MiddlewareFactory } from \"../../types\";\nimport type {\n DefaultDependencies,\n Middleware,\n Unsubscribe,\n} from \"@real-router/types\";\n\n/**\n * Independent namespace for managing middleware.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic.\n */\nexport class MiddlewareNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #factories = new Set<MiddlewareFactory<Dependencies>>();\n readonly #factoryToMiddleware = new Map<\n MiddlewareFactory<Dependencies>,\n Middleware\n >();\n\n #router!: Router<Dependencies>;\n #deps!: MiddlewareDependencies<Dependencies>;\n #limits: Limits = DEFAULT_LIMITS;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateUseMiddlewareArgs<D extends DefaultDependencies>(\n middlewares: unknown[],\n ): asserts middlewares is MiddlewareFactory<D>[] {\n validateUseMiddlewareArgs<D>(middlewares);\n }\n\n static validateMiddleware<D extends DefaultDependencies>(\n middleware: unknown,\n factory: MiddlewareFactory<D>,\n ): asserts middleware is Middleware {\n validateMiddleware<D>(middleware, factory);\n }\n\n static validateNoDuplicates<D extends DefaultDependencies>(\n newFactories: MiddlewareFactory<D>[],\n existingFactories: MiddlewareFactory<D>[],\n ): void {\n validateNoDuplicates<D>(newFactories, existingFactories);\n }\n\n static validateMiddlewareLimit(\n currentCount: number,\n newCount: number,\n maxMiddleware?: number,\n ): void {\n validateMiddlewareLimit(currentCount, newCount, maxMiddleware);\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n setRouter(router: Router<Dependencies>): void {\n this.#router = router;\n }\n\n setDependencies(deps: MiddlewareDependencies<Dependencies>): void {\n this.#deps = deps;\n }\n\n setLimits(limits: Limits): void {\n this.#limits = limits;\n }\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Returns the current number of registered middleware.\n */\n count(): number {\n return this.#factories.size;\n }\n\n /**\n * Initializes middleware factories without committing to storage.\n * Returns array of initialized middleware for validation by facade.\n *\n * @param factories - Already validated by facade\n */\n initialize(\n ...factories: MiddlewareFactory<Dependencies>[]\n ): InitializedMiddleware<Dependencies>[] {\n const initialized: InitializedMiddleware<Dependencies>[] = [];\n\n for (const factory of factories) {\n // Middleware factories receive full router as part of their public API\n const middleware = factory(this.#router, this.#deps.getDependency);\n\n initialized.push({ factory, middleware });\n }\n\n return initialized;\n }\n\n /**\n * Commits initialized middleware to storage.\n * Returns unsubscribe function to remove all added middleware.\n *\n * @param initialized - Already validated by facade\n */\n commit(initialized: InitializedMiddleware<Dependencies>[]): Unsubscribe {\n // Check count thresholds and log warnings if needed\n this.#checkCountThresholds(initialized.length);\n\n // Add to storage\n for (const { factory, middleware } of initialized) {\n this.#factories.add(factory);\n this.#factoryToMiddleware.set(factory, middleware);\n }\n\n // Return unsubscribe function specific to THIS call's middleware\n let unsubscribed = false;\n\n return (): void => {\n if (unsubscribed) {\n return;\n }\n\n unsubscribed = true;\n\n for (const { factory } of initialized) {\n this.#factories.delete(factory);\n this.#factoryToMiddleware.delete(factory);\n }\n };\n }\n\n /**\n * Returns a copy of registered middleware factories.\n * Preserves insertion order.\n */\n getFactories(): MiddlewareFactory<Dependencies>[] {\n return [...this.#factories];\n }\n\n /**\n * Returns the actual middleware functions in execution order.\n */\n getFunctions(): Middleware[] {\n return [...this.#factoryToMiddleware.values()];\n }\n\n clearAll(): void {\n this.#factories.clear();\n this.#factoryToMiddleware.clear();\n }\n\n // =========================================================================\n // Private methods\n // =========================================================================\n\n #checkCountThresholds(newCount: number): void {\n const maxMiddleware = this.#limits.maxMiddleware;\n\n if (maxMiddleware === 0) {\n return;\n }\n\n const totalSize = newCount + this.#factories.size;\n\n const { warn, error } = computeThresholds(maxMiddleware);\n\n if (totalSize >= error) {\n logger.error(\n \"router.useMiddleware\",\n `${totalSize} middleware registered! ` +\n `This is excessive and will impact performance. ` +\n `Hard limit at ${maxMiddleware}.`,\n );\n } else if (totalSize >= warn) {\n logger.warn(\n \"router.useMiddleware\",\n `${totalSize} middleware registered. ` +\n `Consider if all are necessary.`,\n );\n }\n }\n}\n","// packages/core/src/namespaces/PluginsNamespace/constants.ts\n\nimport { isObjKey } from \"type-guards\";\n\nimport {\n events as EVENTS_CONST,\n plugins as PLUGINS_CONST,\n} from \"../../constants\";\n\nimport type { EventName } from \"@real-router/types\";\n\n/**\n * Maps plugin method names to router event names.\n */\nexport const EVENTS_MAP = {\n [PLUGINS_CONST.ROUTER_START]: EVENTS_CONST.ROUTER_START,\n [PLUGINS_CONST.ROUTER_STOP]: EVENTS_CONST.ROUTER_STOP,\n [PLUGINS_CONST.TRANSITION_SUCCESS]: EVENTS_CONST.TRANSITION_SUCCESS,\n [PLUGINS_CONST.TRANSITION_START]: EVENTS_CONST.TRANSITION_START,\n [PLUGINS_CONST.TRANSITION_ERROR]: EVENTS_CONST.TRANSITION_ERROR,\n [PLUGINS_CONST.TRANSITION_CANCEL]: EVENTS_CONST.TRANSITION_CANCEL,\n} as const satisfies Record<\n (typeof PLUGINS_CONST)[keyof typeof PLUGINS_CONST],\n EventName\n>;\n\n/**\n * Plugin method names that correspond to router events.\n */\nexport const EVENT_METHOD_NAMES = Object.keys(EVENTS_MAP).filter(\n (eventName): eventName is keyof typeof EVENTS_MAP =>\n isObjKey<typeof EVENTS_MAP>(eventName, EVENTS_MAP),\n);\n\nexport const LOGGER_CONTEXT = \"router.usePlugin\";\n","// packages/core/src/namespaces/PluginsNamespace/validators.ts\n\n/**\n * Static validation functions for PluginsNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { getTypeDescription, isObjKey } from \"type-guards\";\n\nimport { EVENTS_MAP } from \"./constants\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\nimport type { PluginFactory } from \"../../types\";\nimport type { DefaultDependencies, Plugin } from \"@real-router/types\";\n\n/**\n * Validates usePlugin arguments - all must be functions.\n */\nexport function validateUsePluginArgs<D extends DefaultDependencies>(\n plugins: unknown[],\n): asserts plugins is PluginFactory<D>[] {\n for (const plugin of plugins) {\n if (typeof plugin !== \"function\") {\n throw new TypeError(\n `[router.usePlugin] Expected plugin factory function, got ${typeof plugin}`,\n );\n }\n }\n}\n\n/**\n * Validates that a plugin factory returned a valid plugin object.\n */\nexport function validatePlugin(plugin: Plugin): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!(plugin && typeof plugin === \"object\") || Array.isArray(plugin)) {\n throw new TypeError(\n `[router.usePlugin] Plugin factory must return an object, got ${getTypeDescription(\n plugin,\n )}`,\n );\n }\n\n // Detect async factory (returns Promise)\n if (typeof (plugin as unknown as { then?: unknown }).then === \"function\") {\n throw new TypeError(\n `[router.usePlugin] Async plugin factories are not supported. ` +\n `Factory returned a Promise instead of a plugin object.`,\n );\n }\n\n for (const key in plugin) {\n if (!(key === \"teardown\" || isObjKey<typeof EVENTS_MAP>(key, EVENTS_MAP))) {\n throw new TypeError(\n `[router.usePlugin] Unknown property '${key}'. ` +\n `Plugin must only contain event handlers and optional teardown.`,\n );\n }\n }\n}\n\n/**\n * Validates that adding new plugins won't exceed the hard limit.\n */\nexport function validatePluginLimit(\n currentCount: number,\n newCount: number,\n maxPlugins: number = DEFAULT_LIMITS.maxPlugins,\n): void {\n if (maxPlugins === 0) {\n return;\n }\n\n const totalCount = currentCount + newCount;\n\n if (totalCount > maxPlugins) {\n throw new Error(`[router.usePlugin] Plugin limit exceeded (${maxPlugins})`);\n }\n}\n","// packages/core/src/namespaces/PluginsNamespace/PluginsNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\n\nimport { EVENTS_MAP, EVENT_METHOD_NAMES, LOGGER_CONTEXT } from \"./constants\";\nimport {\n validatePlugin,\n validatePluginLimit,\n validateUsePluginArgs,\n} from \"./validators\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\nimport { computeThresholds } from \"../../helpers\";\n\nimport type { PluginsDependencies } from \"./types\";\nimport type { Router } from \"../../Router\";\nimport type { Limits, PluginFactory } from \"../../types\";\nimport type {\n DefaultDependencies,\n Plugin,\n Unsubscribe,\n} from \"@real-router/types\";\n\n/**\n * Independent namespace for managing plugins.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic.\n */\nexport class PluginsNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #plugins = new Set<PluginFactory<Dependencies>>();\n readonly #unsubscribes = new Set<Unsubscribe>();\n\n #router!: Router<Dependencies>;\n #deps!: PluginsDependencies<Dependencies>;\n #limits: Limits = DEFAULT_LIMITS;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateUsePluginArgs<D extends DefaultDependencies>(\n plugins: unknown[],\n ): asserts plugins is PluginFactory<D>[] {\n validateUsePluginArgs<D>(plugins);\n }\n\n static validatePlugin(plugin: Plugin): void {\n validatePlugin(plugin);\n }\n\n static validatePluginLimit(\n currentCount: number,\n newCount: number,\n maxPlugins?: number,\n ): void {\n validatePluginLimit(currentCount, newCount, maxPlugins);\n }\n\n static validateNoDuplicatePlugins<D extends DefaultDependencies>(\n newFactories: PluginFactory<D>[],\n hasPlugin: (factory: PluginFactory<D>) => boolean,\n ): void {\n for (const factory of newFactories) {\n if (hasPlugin(factory)) {\n throw new Error(\n `[router.usePlugin] Plugin factory already registered. ` +\n `To re-register, first unsubscribe the existing plugin.`,\n );\n }\n }\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n setRouter(router: Router<Dependencies>): void {\n this.#router = router;\n }\n\n setDependencies(deps: PluginsDependencies<Dependencies>): void {\n this.#deps = deps;\n }\n\n setLimits(limits: Limits): void {\n this.#limits = limits;\n }\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Returns the number of registered plugins.\n * Used by facade for limit validation.\n */\n count(): number {\n return this.#plugins.size;\n }\n\n /**\n * Registers one or more plugin factories.\n * Returns unsubscribe function to remove all added plugins.\n * Input already validated by facade (limit, duplicates).\n *\n * @param factories - Already validated by facade\n */\n use(...factories: PluginFactory<Dependencies>[]): Unsubscribe {\n // Emit warnings for count thresholds (not validation, just warnings)\n this.#checkCountThresholds(factories.length);\n\n // Fast path for single plugin (common case)\n if (factories.length === 1) {\n const factory = factories[0];\n const cleanup = this.#startPlugin(factory);\n\n this.#plugins.add(factory);\n\n let unsubscribed = false;\n\n const unsubscribe: Unsubscribe = () => {\n if (unsubscribed) {\n return;\n }\n\n unsubscribed = true;\n this.#plugins.delete(factory);\n this.#unsubscribes.delete(unsubscribe);\n try {\n cleanup();\n } catch (error) {\n logger.error(LOGGER_CONTEXT, \"Error during cleanup:\", error);\n }\n };\n\n this.#unsubscribes.add(unsubscribe);\n\n return unsubscribe;\n }\n\n // Deduplicate batch with warning (validation already done by facade)\n const seenInBatch = this.#deduplicateBatch(factories);\n\n // Track successfully initialized plugins for cleanup\n const initializedPlugins: {\n factory: PluginFactory<Dependencies>;\n cleanup: Unsubscribe;\n }[] = [];\n\n // Initialize deduplicated plugins sequentially\n try {\n for (const plugin of seenInBatch) {\n const cleanup = this.#startPlugin(plugin);\n\n initializedPlugins.push({ factory: plugin, cleanup });\n }\n } catch (error) {\n // Rollback on failure - cleanup all initialized plugins\n for (const { cleanup } of initializedPlugins) {\n try {\n cleanup();\n } catch (cleanupError) {\n logger.error(LOGGER_CONTEXT, \"Cleanup error:\", cleanupError);\n }\n }\n\n throw error;\n }\n\n // Commit phase - add to registry\n for (const { factory } of initializedPlugins) {\n this.#plugins.add(factory);\n }\n\n // Return unsubscribe function\n let unsubscribed = false;\n\n const unsubscribe: Unsubscribe = () => {\n if (unsubscribed) {\n return;\n }\n\n unsubscribed = true;\n this.#unsubscribes.delete(unsubscribe);\n\n for (const { factory } of initializedPlugins) {\n this.#plugins.delete(factory);\n }\n\n for (const { cleanup } of initializedPlugins) {\n try {\n cleanup();\n } catch (error) {\n logger.error(LOGGER_CONTEXT, \"Error during cleanup:\", error);\n }\n }\n };\n\n this.#unsubscribes.add(unsubscribe);\n\n return unsubscribe;\n }\n\n /**\n * Returns registered plugin factories.\n */\n getAll(): PluginFactory<Dependencies>[] {\n return [...this.#plugins];\n }\n\n /**\n * Checks if a plugin factory is registered.\n * Used internally by validation to avoid array allocation.\n */\n has(factory: PluginFactory<Dependencies>): boolean {\n return this.#plugins.has(factory);\n }\n\n disposeAll(): void {\n for (const unsubscribe of this.#unsubscribes) {\n unsubscribe();\n }\n\n this.#plugins.clear();\n this.#unsubscribes.clear();\n }\n\n // =========================================================================\n // Private methods\n // =========================================================================\n\n #checkCountThresholds(newCount: number): void {\n const maxPlugins = this.#limits.maxPlugins;\n\n if (maxPlugins === 0) {\n return;\n }\n\n const totalCount = newCount + this.#plugins.size;\n\n const { warn, error } = computeThresholds(maxPlugins);\n\n if (totalCount >= error) {\n logger.error(LOGGER_CONTEXT, `${totalCount} plugins registered!`);\n } else if (totalCount >= warn) {\n logger.warn(LOGGER_CONTEXT, `${totalCount} plugins registered`);\n }\n }\n\n /**\n * Deduplicates batch with warning for duplicates within batch.\n * Validation (existing duplicates) is done by facade.\n */\n #deduplicateBatch(\n plugins: PluginFactory<Dependencies>[],\n ): Set<PluginFactory<Dependencies>> {\n const seenInBatch = new Set<PluginFactory<Dependencies>>();\n\n for (const plugin of plugins) {\n if (seenInBatch.has(plugin)) {\n logger.warn(\n LOGGER_CONTEXT,\n \"Duplicate factory in batch, will be registered once\",\n );\n } else {\n seenInBatch.add(plugin);\n }\n }\n\n return seenInBatch;\n }\n\n #startPlugin(pluginFactory: PluginFactory<Dependencies>): Unsubscribe {\n // Bind getDependency to preserve 'this' context when called from factory\n // Plugin factories receive full router as part of their public API\n const appliedPlugin = pluginFactory(this.#router, this.#deps.getDependency);\n\n PluginsNamespace.validatePlugin(appliedPlugin);\n\n Object.freeze(appliedPlugin);\n\n // Collect all unsubscribe functions\n const removeEventListeners: Unsubscribe[] = [];\n\n // Subscribe plugin methods to corresponding router events\n for (const methodName of EVENT_METHOD_NAMES) {\n if (methodName in appliedPlugin) {\n if (typeof appliedPlugin[methodName] === \"function\") {\n removeEventListeners.push(\n this.#deps.addEventListener(\n EVENTS_MAP[methodName],\n appliedPlugin[methodName],\n ),\n );\n\n if (methodName === \"onStart\" && this.#deps.canNavigate()) {\n logger.warn(\n LOGGER_CONTEXT,\n \"Router already started, onStart will not be called\",\n );\n }\n } else {\n logger.warn(\n LOGGER_CONTEXT,\n `Property '${methodName}' is not a function, skipping`,\n );\n }\n }\n }\n\n // Return composite cleanup function\n return () => {\n for (const removeListener of removeEventListeners) {\n removeListener();\n }\n\n if (typeof appliedPlugin.teardown === \"function\") {\n appliedPlugin.teardown();\n }\n };\n }\n}\n","// packages/core/src/namespaces/RouteLifecycleNamespace/validators.ts\n\n/**\n * Static validation functions for RouteLifecycleNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { isBoolean, getTypeDescription } from \"type-guards\";\n\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\nimport type { ActivationFnFactory } from \"../../types\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\n/**\n * Validates that a handler is either a boolean or a factory function.\n */\nexport function validateHandler<D extends DefaultDependencies>(\n handler: unknown,\n methodName: string,\n): asserts handler is ActivationFnFactory<D> | boolean {\n if (!isBoolean(handler) && typeof handler !== \"function\") {\n throw new TypeError(\n `[router.${methodName}] Handler must be a boolean or factory function, ` +\n `got ${getTypeDescription(handler)}`,\n );\n }\n}\n\n/**\n * Validates that a route is not currently being registered.\n * Prevents self-modification during factory compilation.\n */\nexport function validateNotRegistering(\n isRegistering: boolean,\n name: string,\n methodName: string,\n): void {\n if (isRegistering) {\n throw new Error(\n `[router.${methodName}] Cannot modify route \"${name}\" during its own registration`,\n );\n }\n}\n\n/**\n * Validates that adding a new handler won't exceed the hard limit.\n */\nexport function validateHandlerLimit(\n currentCount: number,\n methodName: string,\n maxLifecycleHandlers: number = DEFAULT_LIMITS.maxLifecycleHandlers,\n): void {\n if (maxLifecycleHandlers === 0) {\n return;\n }\n\n if (currentCount >= maxLifecycleHandlers) {\n throw new Error(\n `[router.${methodName}] Lifecycle handler limit exceeded (${maxLifecycleHandlers}). ` +\n `This indicates too many routes with individual handlers. ` +\n `Consider using middleware for cross-cutting concerns.`,\n );\n }\n}\n","// packages/core/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { isBoolean, isPromise, getTypeDescription } from \"type-guards\";\n\nimport {\n validateHandler,\n validateHandlerLimit,\n validateNotRegistering,\n} from \"./validators\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\nimport { computeThresholds } from \"../../helpers\";\n\nimport type { RouteLifecycleDependencies } from \"./types\";\nimport type { Router } from \"../../Router\";\nimport type { ActivationFnFactory, Limits } from \"../../types\";\nimport type {\n ActivationFn,\n DefaultDependencies,\n State,\n} from \"@real-router/types\";\n\n/**\n * Converts a boolean value to an activation function factory.\n * Used for the shorthand syntax where true/false is passed instead of a function.\n */\nfunction booleanToFactory<Dependencies extends DefaultDependencies>(\n value: boolean,\n): ActivationFnFactory<Dependencies> {\n const activationFn: ActivationFn = () => value;\n\n return () => activationFn;\n}\n\n/**\n * Independent namespace for managing route lifecycle handlers.\n *\n * Static methods handle input validation (called by facade).\n * Instance methods handle state-dependent validation, storage and business logic.\n */\nexport class RouteLifecycleNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #canDeactivateFactories = new Map<\n string,\n ActivationFnFactory<Dependencies>\n >();\n readonly #canActivateFactories = new Map<\n string,\n ActivationFnFactory<Dependencies>\n >();\n readonly #canDeactivateFunctions = new Map<string, ActivationFn>();\n readonly #canActivateFunctions = new Map<string, ActivationFn>();\n\n readonly #registering = new Set<string>();\n\n #router!: Router<Dependencies>;\n #deps!: RouteLifecycleDependencies<Dependencies>;\n #limits: Limits = DEFAULT_LIMITS;\n\n // =========================================================================\n // Static validation methods (called by facade for input validation)\n // =========================================================================\n\n static validateHandler<D extends DefaultDependencies>(\n handler: unknown,\n methodName: string,\n ): asserts handler is ActivationFnFactory<D> | boolean {\n validateHandler<D>(handler, methodName);\n }\n\n setRouter(router: Router<Dependencies>): void {\n this.#router = router;\n }\n\n setDependencies(deps: RouteLifecycleDependencies<Dependencies>): void {\n this.#deps = deps;\n }\n\n setLimits(limits: Limits): void {\n this.#limits = limits;\n }\n\n // =========================================================================\n // Instance methods\n // =========================================================================\n\n /**\n * Adds a canActivate guard for a route.\n * Handles state-dependent validation, overwrite detection, and registration.\n *\n * @param name - Route name (input-validated by facade)\n * @param handler - Guard function or boolean (input-validated by facade)\n * @param skipValidation - True when called during route config building (#noValidate)\n */\n addCanActivate(\n name: string,\n handler: ActivationFnFactory<Dependencies> | boolean,\n skipValidation: boolean,\n ): void {\n if (!skipValidation) {\n validateNotRegistering(\n this.#registering.has(name),\n name,\n \"addActivateGuard\",\n );\n }\n\n const isOverwrite = this.#canActivateFactories.has(name);\n\n if (!isOverwrite && !skipValidation) {\n validateHandlerLimit(\n this.#canActivateFactories.size + 1,\n \"addActivateGuard\",\n this.#limits.maxLifecycleHandlers,\n );\n }\n\n this.#registerHandler(\n \"activate\",\n name,\n handler,\n this.#canActivateFactories,\n this.#canActivateFunctions,\n \"canActivate\",\n isOverwrite,\n );\n }\n\n /**\n * Adds a canDeactivate guard for a route.\n * Handles state-dependent validation, overwrite detection, and registration.\n *\n * @param name - Route name (input-validated by facade)\n * @param handler - Guard function or boolean (input-validated by facade)\n * @param skipValidation - True when called during route config building (#noValidate)\n */\n addCanDeactivate(\n name: string,\n handler: ActivationFnFactory<Dependencies> | boolean,\n skipValidation: boolean,\n ): void {\n if (!skipValidation) {\n validateNotRegistering(\n this.#registering.has(name),\n name,\n \"addDeactivateGuard\",\n );\n }\n\n const isOverwrite = this.#canDeactivateFactories.has(name);\n\n if (!isOverwrite && !skipValidation) {\n validateHandlerLimit(\n this.#canDeactivateFactories.size + 1,\n \"addDeactivateGuard\",\n this.#limits.maxLifecycleHandlers,\n );\n }\n\n this.#registerHandler(\n \"deactivate\",\n name,\n handler,\n this.#canDeactivateFactories,\n this.#canDeactivateFunctions,\n \"canDeactivate\",\n isOverwrite,\n );\n }\n\n /**\n * Removes a canActivate guard for a route.\n * Input already validated by facade (not registering).\n *\n * @param name - Route name (already validated by facade)\n */\n clearCanActivate(name: string): void {\n this.#canActivateFactories.delete(name);\n this.#canActivateFunctions.delete(name);\n }\n\n /**\n * Removes a canDeactivate guard for a route.\n * Input already validated by facade (not registering).\n *\n * @param name - Route name (already validated by facade)\n */\n clearCanDeactivate(name: string): void {\n this.#canDeactivateFactories.delete(name);\n this.#canDeactivateFunctions.delete(name);\n }\n\n /**\n * Clears all lifecycle handlers (canActivate and canDeactivate).\n * Used by clearRoutes to reset all lifecycle state.\n */\n clearAll(): void {\n this.#canActivateFactories.clear();\n this.#canActivateFunctions.clear();\n this.#canDeactivateFactories.clear();\n this.#canDeactivateFunctions.clear();\n }\n\n /**\n * Returns lifecycle factories as records for cloning.\n *\n * @returns Tuple of [canDeactivateFactories, canActivateFactories]\n */\n getFactories(): [\n Record<string, ActivationFnFactory<Dependencies>>,\n Record<string, ActivationFnFactory<Dependencies>>,\n ] {\n const deactivateRecord: Record<\n string,\n ActivationFnFactory<Dependencies>\n > = {};\n const activateRecord: Record<\n string,\n ActivationFnFactory<Dependencies>\n > = {};\n\n for (const [name, factory] of this.#canDeactivateFactories) {\n deactivateRecord[name] = factory;\n }\n\n for (const [name, factory] of this.#canActivateFactories) {\n activateRecord[name] = factory;\n }\n\n return [deactivateRecord, activateRecord];\n }\n\n /**\n * Returns compiled lifecycle functions for transition execution.\n *\n * @returns Tuple of [canDeactivateFunctions, canActivateFunctions] as Maps\n */\n getFunctions(): [Map<string, ActivationFn>, Map<string, ActivationFn>] {\n return [this.#canDeactivateFunctions, this.#canActivateFunctions];\n }\n\n checkActivateGuardSync(\n name: string,\n toState: State,\n fromState: State | undefined,\n ): boolean {\n return this.#checkGuardSync(\n this.#canActivateFunctions,\n name,\n toState,\n fromState,\n \"checkActivateGuardSync\",\n );\n }\n\n checkDeactivateGuardSync(\n name: string,\n toState: State,\n fromState: State | undefined,\n ): boolean {\n return this.#checkGuardSync(\n this.#canDeactivateFunctions,\n name,\n toState,\n fromState,\n \"checkDeactivateGuardSync\",\n );\n }\n\n // =========================================================================\n // Private methods (business logic)\n // =========================================================================\n\n /**\n * Registers a handler.\n * Handles overwrite warning, count threshold warnings, and factory compilation.\n */\n #registerHandler(\n type: \"activate\" | \"deactivate\",\n name: string,\n handler: ActivationFnFactory<Dependencies> | boolean,\n factories: Map<string, ActivationFnFactory<Dependencies>>,\n functions: Map<string, ActivationFn>,\n methodName: string,\n isOverwrite: boolean,\n ): void {\n // Emit warnings\n if (isOverwrite) {\n logger.warn(\n `router.${methodName}`,\n `Overwriting existing ${type} handler for route \"${name}\"`,\n );\n } else {\n this.#checkCountThresholds(factories.size + 1, methodName);\n }\n\n // Convert boolean to factory if needed\n const factory = isBoolean(handler)\n ? booleanToFactory<Dependencies>(handler)\n : handler;\n\n // Store factory\n factories.set(name, factory);\n\n // Mark route as being registered before calling user factory\n this.#registering.add(name);\n\n try {\n // Lifecycle factories receive full router as part of their public API\n const fn = factory(this.#router, this.#deps.getDependency);\n\n if (typeof fn !== \"function\") {\n throw new TypeError(\n `[router.${methodName}] Factory must return a function, got ${getTypeDescription(fn)}`,\n );\n }\n\n functions.set(name, fn);\n } catch (error) {\n // Rollback on failure to maintain consistency\n factories.delete(name);\n\n throw error;\n } finally {\n this.#registering.delete(name);\n }\n }\n\n #checkGuardSync(\n functions: Map<string, ActivationFn>,\n name: string,\n toState: State,\n fromState: State | undefined,\n methodName: string,\n ): boolean {\n const guardFn = functions.get(name);\n\n if (!guardFn) {\n return true;\n }\n\n try {\n const result = guardFn(toState, fromState);\n\n if (typeof result === \"boolean\") {\n return result;\n }\n\n if (isPromise(result)) {\n logger.warn(\n `router.${methodName}`,\n `Guard for \"${name}\" returned a Promise. Sync check cannot resolve async guards — returning false.`,\n );\n\n return false;\n }\n\n // Guard returned void/State — permissive default\n return true;\n } catch {\n return false;\n }\n }\n\n #checkCountThresholds(currentSize: number, methodName: string): void {\n const maxLifecycleHandlers = this.#limits.maxLifecycleHandlers;\n\n if (maxLifecycleHandlers === 0) {\n return;\n }\n\n const { warn, error } = computeThresholds(maxLifecycleHandlers);\n\n if (currentSize >= error) {\n logger.error(\n `router.${methodName}`,\n `${currentSize} lifecycle handlers registered! ` +\n `This is excessive. Hard limit at ${maxLifecycleHandlers}.`,\n );\n } else if (currentSize >= warn) {\n logger.warn(\n `router.${methodName}`,\n `${currentSize} lifecycle handlers registered. ` +\n `Consider consolidating logic.`,\n );\n }\n }\n}\n","// packages/route-node/modules/builder/buildTree.ts\n\n/**\n * Tree Building.\n *\n * Constructs the mutable tree structure from route definitions.\n *\n * @module builder/buildTree\n */\n\nimport type { RouteDefinition } from \"../types\";\n\n// =============================================================================\n// Mutable Node Type (internal)\n// =============================================================================\n\n/**\n * Mutable version of RouteTree used during building.\n * After building, this is converted to immutable RouteTree.\n */\nexport interface MutableRouteNode {\n name: string;\n path: string;\n absolute: boolean;\n children: MutableRouteNode[];\n parent: MutableRouteNode | null;\n\n // These are computed later by computeCaches\n nonAbsoluteChildren: MutableRouteNode[];\n fullName: string;\n}\n\n// =============================================================================\n// Building Functions\n// =============================================================================\n\n/**\n * Creates a mutable node from a route definition.\n *\n * @param definition - Route definition object\n * @param definition.name - Route name\n * @param definition.path - Route path\n * @param definition.children - Optional child routes\n * @param parent - Parent node (null for root)\n * @returns Mutable node\n */\nfunction createNode(\n definition: {\n name: string;\n path: string;\n children?: RouteDefinition[] | undefined;\n },\n parent: MutableRouteNode | null,\n): MutableRouteNode {\n const path = definition.path;\n const absolute = path.startsWith(\"~\");\n const normalizedPath = absolute ? path.slice(1) : path;\n\n const node: MutableRouteNode = {\n name: definition.name,\n path: normalizedPath,\n absolute,\n children: [],\n parent,\n // These will be computed by computeCaches\n nonAbsoluteChildren: [],\n fullName: \"\",\n };\n\n // Recursively add children\n if (definition.children) {\n for (const childDef of definition.children) {\n const childNode = createNode(childDef, node);\n\n node.children.push(childNode);\n }\n }\n\n return node;\n}\n\n/**\n * Builds the mutable tree structure from route definitions.\n *\n * Simplified single-pass algorithm:\n * - Creates root node\n * - Adds each route as direct child of root\n * - createNode() handles nested children recursively\n *\n * @param rootName - Root node name (typically \"\")\n * @param rootPath - Root node path (typically \"\")\n * @param routes - Route definitions\n * @returns Mutable root node\n */\nexport function buildTree(\n rootName: string,\n rootPath: string,\n routes: readonly RouteDefinition[],\n): MutableRouteNode {\n const root = createNode({ name: rootName, path: rootPath }, null);\n\n for (const route of routes) {\n const node = createNode(route, root);\n\n root.children.push(node);\n }\n\n return root;\n}\n","// packages/route-node/modules/builder/computeCaches.ts\n\n/**\n * Cache Computation.\n *\n * Computes all pre-computed caches and freezes the tree.\n *\n * @module builder/computeCaches\n */\n\nimport { buildParamMeta } from \"path-matcher\";\n\nimport type { MutableRouteNode } from \"./buildTree\";\nimport type { RouteTree } from \"../types\";\n\n// =============================================================================\n// Cache Computation Functions\n// =============================================================================\n\n/**\n * Computes the full dot-notation name for a node.\n * Parent fullName is always computed before children.\n *\n * @param node - Node to compute for\n * @returns Full name (e.g., \"users.profile\")\n */\nfunction computeFullName(node: RouteTree): string {\n if (!node.parent?.name) {\n return node.name;\n }\n\n // Parent fullName is always set before children are processed\n return `${node.parent.fullName}.${node.name}`;\n}\n\n/**\n * Joins two path segments, preventing double slashes at the join point.\n *\n * @param base - Base path (e.g., \"/users/\")\n * @param suffix - Path to append (e.g., \"/profile\")\n * @returns Joined path without double slashes (e.g., \"/users/profile\")\n */\nfunction joinPaths(base: string, suffix: string): string {\n if (base.endsWith(\"/\") && suffix.startsWith(\"/\")) {\n return base + suffix.slice(1);\n }\n\n return base + suffix;\n}\n\n/**\n * Computes static path for routes without parameters.\n *\n * Returns pre-built path string for fast buildPath lookup,\n * or null if the route has any dynamic parameters.\n *\n * @param node - Node to compute for\n * @returns Static path or null\n */\nfunction computeStaticPath(node: RouteTree): string | null {\n // Root nodes without path patterns can't have static paths\n if (!node.path) {\n return null;\n }\n\n const { urlParams, queryParams, spatParams } = node.paramMeta;\n\n // If route has any parameters, we can't pre-compute\n if (urlParams.length > 0 || queryParams.length > 0 || spatParams.length > 0) {\n return null;\n }\n\n // Build the full path from parent segments + this segment\n // Collect parent segments via parent chain (unshift for correct order)\n const parentSegments: RouteTree[] = [];\n let current = node.parent;\n\n while (current?.path) {\n parentSegments.unshift(current);\n current = current.parent;\n }\n\n let path = \"\";\n\n for (const segment of parentSegments) {\n const {\n urlParams: segUrlParams,\n queryParams: segQueryParams,\n spatParams: segSpatParams,\n } = segment.paramMeta;\n\n // Parent segments with params invalidate static path\n if (\n segUrlParams.length > 0 ||\n segQueryParams.length > 0 ||\n segSpatParams.length > 0\n ) {\n return null;\n }\n\n path = segment.absolute ? segment.path : joinPaths(path, segment.path);\n }\n\n // Add this node's path\n return node.absolute ? node.path : joinPaths(path, node.path);\n}\n\n// =============================================================================\n// Main Computation Function\n// =============================================================================\n\n/**\n * Computes children Map from mutable children array.\n *\n * Children are stored in definition order. Matching priority is handled\n * by the segment trie, not by iteration order.\n *\n * @param childrenArray - Array of processed child nodes\n * @returns ReadonlyMap of child name -> child node (in definition order)\n */\nfunction computeChildrenMap(\n childrenArray: RouteTree[],\n): ReadonlyMap<string, RouteTree> {\n const map = new Map<string, RouteTree>();\n\n for (const child of childrenArray) {\n map.set(child.name, child);\n }\n\n return map;\n}\n\n/**\n * Builds a paramTypeMap from route parameter metadata.\n *\n * @param paramMeta - Parameter metadata from buildParamMeta\n * @param paramMeta.urlParams - URL parameter names\n * @param paramMeta.queryParams - Query parameter names\n * @returns Map of parameter names to their types\n */\nfunction buildParamTypeMap(paramMeta: {\n readonly urlParams: readonly string[];\n readonly queryParams: readonly string[];\n}): Record<string, \"url\" | \"query\"> {\n const map: Record<string, \"url\" | \"query\"> = {};\n\n for (const p of paramMeta.urlParams) {\n map[p] = \"url\";\n }\n\n for (const p of paramMeta.queryParams) {\n map[p] = \"query\";\n }\n\n return map;\n}\n\n/**\n * Recursively processes child nodes and computes the children map.\n *\n * @param mutableChildren - Array of mutable child nodes\n * @param parent - Already-processed parent node\n * @param freeze - Whether to freeze the result\n * @returns Children map and non-absolute children array\n */\nfunction processChildren(\n mutableChildren: readonly MutableRouteNode[],\n parent: RouteTree,\n freeze: boolean,\n): {\n childrenMap: ReadonlyMap<string, RouteTree>;\n nonAbsoluteChildren: RouteTree[];\n} {\n const childrenArray: RouteTree[] = [];\n const nonAbsoluteChildren: RouteTree[] = [];\n\n for (const childMutable of mutableChildren) {\n const child = processNode(childMutable, parent, freeze);\n\n childrenArray.push(child);\n\n if (!child.absolute) {\n nonAbsoluteChildren.push(child);\n }\n }\n\n return {\n childrenMap: computeChildrenMap(childrenArray),\n nonAbsoluteChildren,\n };\n}\n\n/**\n * Recursively processes a mutable node into a RouteTree.\n *\n * This creates a new object with all caches computed.\n * Optionally freezes the result for immutability.\n *\n * @param mutable - Mutable node to process\n * @param parent - Already-processed parent node (null for root)\n * @param freeze - Whether to freeze the result\n * @returns RouteTree (frozen if freeze=true)\n */\nfunction processNode(\n mutable: MutableRouteNode,\n parent: RouteTree | null,\n freeze: boolean,\n): RouteTree {\n const paramMeta = buildParamMeta(mutable.path);\n const paramTypeMap = buildParamTypeMap(paramMeta);\n\n // Skeleton node: children and nonAbsoluteChildren are set after recursive\n // child processing, which requires a parent reference to this node.\n const node = {\n name: mutable.name,\n path: mutable.path,\n absolute: mutable.absolute,\n parent,\n children: undefined as unknown as ReadonlyMap<string, RouteTree>,\n paramMeta,\n nonAbsoluteChildren: undefined as unknown as RouteTree[],\n fullName: \"\",\n staticPath: null as string | null,\n paramTypeMap,\n };\n\n node.fullName = computeFullName(node as RouteTree);\n\n const { childrenMap, nonAbsoluteChildren } = processChildren(\n mutable.children,\n node as RouteTree,\n freeze,\n );\n\n node.children = childrenMap;\n node.nonAbsoluteChildren = nonAbsoluteChildren;\n node.staticPath = computeStaticPath(node as RouteTree);\n\n if (freeze) {\n Object.freeze(nonAbsoluteChildren);\n Object.freeze(paramTypeMap);\n Object.freeze(node.children);\n Object.freeze(node);\n }\n\n return node as RouteTree;\n}\n\n/**\n * Computes all caches and optionally freezes the tree.\n *\n * This is the final step in building a RouteTree.\n * When freeze=true (default), the tree is completely immutable.\n *\n * @param mutableRoot - Mutable root node\n * @param freeze - Whether to freeze the result (default: true)\n * @returns RouteTree (frozen if freeze=true)\n */\nexport function computeCaches(\n mutableRoot: MutableRouteNode,\n freeze = true,\n): RouteTree {\n return processNode(mutableRoot, null, freeze);\n}\n","// packages/route-node/modules/builder/createRouteTree.ts\n\n/**\n * Route Tree Builder.\n *\n * Creates immutable RouteTree from route definitions.\n *\n * @module builder/createRouteTree\n */\n\nimport { buildTree } from \"./buildTree\";\nimport { computeCaches } from \"./computeCaches\";\n\nimport type {\n RouteDefinition,\n RouteTree,\n RouteTreeBuilder,\n TreeBuildOptions,\n} from \"../types\";\n\n// =============================================================================\n// Builder Implementation\n// =============================================================================\n\n/**\n * Creates a RouteTreeBuilder for constructing route trees.\n *\n * @param name - Root node name (typically empty string)\n * @param path - Root node path (typically empty string)\n * @returns RouteTreeBuilder instance\n *\n * @example\n * ```typescript\n * const tree = createRouteTreeBuilder(\"\", \"\")\n * .add({ name: \"users\", path: \"/users\" })\n * .add({ name: \"users.profile\", path: \"/:id\" })\n * .build();\n * ```\n */\nexport function createRouteTreeBuilder(\n name: string,\n path: string,\n): RouteTreeBuilder {\n const routes: RouteDefinition[] = [];\n\n return {\n add(route: RouteDefinition): RouteTreeBuilder {\n routes.push(route);\n\n return this;\n },\n\n addMany(newRoutes: readonly RouteDefinition[]): RouteTreeBuilder {\n routes.push(...newRoutes);\n\n return this;\n },\n\n build(options?: TreeBuildOptions): RouteTree {\n // Step 1: Build mutable tree structure\n const mutableTree = buildTree(name, path, routes);\n\n // Step 2: Compute all caches and optionally freeze\n const freeze = !options?.skipFreeze;\n\n return computeCaches(mutableTree, freeze);\n },\n };\n}\n\n// =============================================================================\n// Convenience Function\n// =============================================================================\n\n/**\n * Creates a RouteTree directly from route definitions.\n *\n * Convenience wrapper around createRouteTreeBuilder().\n *\n * @param name - Root node name (typically empty string)\n * @param path - Root node path (typically empty string)\n * @param routes - Route definitions to add\n * @param options - Build options (e.g., skipFreeze)\n * @returns Immutable RouteTree\n *\n * @example\n * ```typescript\n * const tree = createRouteTree(\"\", \"\", [\n * { name: \"users\", path: \"/users\" },\n * { name: \"users.profile\", path: \"/:id\" },\n * ]);\n * ```\n */\nexport function createRouteTree(\n name: string,\n path: string,\n routes: readonly RouteDefinition[],\n options?: TreeBuildOptions,\n): RouteTree {\n return createRouteTreeBuilder(name, path).addMany(routes).build(options);\n}\n","// packages/route-node/modules/operations/query.ts\n\n/**\n * Route Query Operations.\n *\n * Pure functions for querying route information from the tree.\n *\n * @module operations/query\n */\n\nimport type { RouteTree } from \"../types\";\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Finds route nodes by dot-notation name.\n *\n * Returns an array of segments from root to the target node.\n * All returned segments have parsers (root included only if it has parser).\n * Uses children Map for O(1) lookup at each level.\n *\n * @param tree - Route tree to search in\n * @param routeName - Dot-notation route name (e.g., \"users.profile\")\n * @returns Array of route segments or null if not found\n *\n * @example\n * ```typescript\n * const segments = getSegmentsByName(tree, \"users.profile\");\n * // → [usersNode, profileNode]\n * ```\n */\nexport function getSegmentsByName(\n tree: RouteTree,\n routeName: string,\n): readonly RouteTree[] | null {\n const segments: RouteTree[] = [];\n\n // Optimize: avoid split() allocation for simple names without dots\n const names = routeName.includes(\".\") ? routeName.split(\".\") : [routeName];\n\n // Handle root with path (include it as first segment)\n if (tree.path !== \"\") {\n segments.push(tree);\n }\n\n // Navigate through the tree using O(1) Map lookups\n let currentNode: RouteTree = tree;\n\n for (const name of names) {\n const segment = currentNode.children.get(name);\n\n if (!segment) {\n return null;\n }\n\n segments.push(segment);\n currentNode = segment;\n }\n\n return segments;\n}\n","// packages/route-tree/modules/operations/routeTreeToDefinitions.ts\n\n/**\n * RouteTree to RouteDefinition Converter.\n *\n * Converts a RouteTree back to an array of RouteDefinition objects.\n * Used for serialization and router cloning.\n *\n * @module operations/routeTreeToDefinitions\n */\n\nimport type { RouteDefinition, RouteTree } from \"../types\";\n\n/**\n * Converts a single RouteTree node to a RouteDefinition.\n *\n * If the node has absolute=true, the path is prefixed with '~'\n * to reconstruct the original definition format.\n *\n * @param node - RouteTree node to convert\n * @returns RouteDefinition with name, path, and optional children\n */\nexport function nodeToDefinition(node: RouteTree): RouteDefinition {\n // Reconstruct absolute path marker if needed\n const path = node.absolute ? `~${node.path}` : node.path;\n\n const def: RouteDefinition = {\n name: node.name,\n path,\n };\n\n if (node.children.size > 0) {\n def.children = [...node.children.values()].map((child) =>\n nodeToDefinition(child),\n );\n }\n\n return def;\n}\n\n/**\n * Converts a RouteTree back to an array of RouteDefinition objects.\n *\n * This is the inverse of createRouteTree - it extracts the minimal\n * definition data (name, path, children) from the computed tree.\n *\n * Note: Extra properties stored in RouteDefinition (like canActivate,\n * forwardTo, encodeParams, etc.) are NOT preserved in RouteTree,\n * so they won't be present in the output.\n *\n * @example\n * ```ts\n * const tree = createRouteTree(\"\", \"\", [\n * { name: \"users\", path: \"/users\", children: [\n * { name: \"profile\", path: \"/:id\" }\n * ]}\n * ]);\n *\n * const definitions = routeTreeToDefinitions(tree);\n * // [{ name: \"users\", path: \"/users\", children: [{ name: \"profile\", path: \"/:id\" }] }]\n * ```\n *\n * @param tree - RouteTree to convert\n * @returns Array of RouteDefinition objects (top-level routes only)\n */\nexport function routeTreeToDefinitions(tree: RouteTree): RouteDefinition[] {\n return [...tree.children.values()].map((child) => nodeToDefinition(child));\n}\n","// packages/route-node/modules/search-params/decode.ts\n\n/**\n * Decoding functions for search-params.\n *\n * Extracted from encode.ts for better separation of concerns.\n *\n * @module search-params/decode\n */\n\nimport type { ResolvedStrategies } from \"./strategies\";\nimport type { DecodeResult } from \"./types\";\n\n// =============================================================================\n// Value Decoding\n// =============================================================================\n\n/**\n * Decodes a URL-encoded value, handling + as space.\n * Optimized: only replaces + if present, skips decodeURIComponent if not needed.\n *\n * Uses indexOf for checking presence - more mutation-resistant than includes\n * because indexOf(\"x\") returns -1 when not found, while includes(\"\") always returns true.\n */\nexport const decodeValue = (value: string): string => {\n const percentIdx = value.indexOf(\"%\");\n const plusIdx = value.indexOf(\"+\");\n\n // Fast path: no encoding needed (common case - most values are simple)\n if (percentIdx === -1 && plusIdx === -1) {\n return value;\n }\n\n // Only replace + if present (avoid regex overhead)\n const withSpaces = plusIdx === -1 ? value : value.split(\"+\").join(\" \");\n\n // Only decode if % is present\n return percentIdx === -1 ? withSpaces : decodeURIComponent(withSpaces);\n};\n\n// =============================================================================\n// Main Decode\n// =============================================================================\n\n/**\n * Decodes a query parameter value using resolved strategies.\n *\n * @param value - Raw value from query string (undefined for key-only params)\n * @param strategies - Pre-resolved format strategies\n * @returns Decoded value (string, boolean, or null)\n */\nexport const decode = (\n value: string | undefined,\n strategies: ResolvedStrategies,\n): DecodeResult => {\n // Handle undefined (key-only params like ?flag)\n if (value === undefined) {\n return strategies.boolean.decodeUndefined();\n }\n\n // Check raw value for boolean formats (e.g., \"true\"/\"false\")\n const rawResult = strategies.boolean.decodeRaw(value);\n\n if (rawResult !== null) {\n return rawResult;\n }\n\n // Decode URI and check decoded value for boolean formats (e.g., ✓/✗)\n const decoded = decodeValue(value);\n\n return strategies.boolean.decodeValue(decoded);\n};\n","// packages/route-node/modules/search-params/strategies/array.ts\n\n/**\n * Array encoding strategies.\n *\n * @module search-params/strategies/array\n */\n\nimport type { ArrayFormat } from \"../types\";\n\n// =============================================================================\n// Strategy Interface\n// =============================================================================\n\n/**\n * Strategy for encoding array values.\n */\nexport interface ArrayStrategy {\n /**\n * Encodes an array as a query string segment.\n *\n * @param name - URL-encoded parameter name\n * @param values - Array values to encode\n * @returns Query string segment (e.g., \"items=a&items=b\" or \"items=a,b\")\n */\n encodeArray: (name: string, values: unknown[]) => string;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nconst encodeValue = (value: unknown): string => {\n const type = typeof value;\n\n if (type !== \"string\" && type !== \"number\" && type !== \"boolean\") {\n const received = type === \"object\" && value === null ? \"null\" : type;\n\n throw new TypeError(\n `[search-params] Array element must be a string, number, or boolean — received ${received}`,\n );\n }\n\n return encodeURIComponent(value as string | number | boolean);\n};\n\n// =============================================================================\n// Strategy Implementations\n// =============================================================================\n\n/**\n * Repeated keys without brackets.\n * Example: items=a&items=b\n */\nexport const noneArrayStrategy: ArrayStrategy = {\n encodeArray: (name, values) =>\n values.map((val) => `${name}=${encodeValue(val)}`).join(\"&\"),\n};\n\n/**\n * Bracket notation without index.\n * Example: items[]=a&items[]=b\n */\nexport const bracketsArrayStrategy: ArrayStrategy = {\n encodeArray: (name, values) =>\n values.map((val) => `${name}[]=${encodeValue(val)}`).join(\"&\"),\n};\n\n/**\n * Indexed bracket notation.\n * Example: items[0]=a&items[1]=b\n */\nexport const indexArrayStrategy: ArrayStrategy = {\n encodeArray: (name, values) =>\n values.map((val, i) => `${name}[${i}]=${encodeValue(val)}`).join(\"&\"),\n};\n\n/**\n * Comma-separated values.\n * Example: items=a,b,c\n */\nexport const commaArrayStrategy: ArrayStrategy = {\n encodeArray: (name, values) =>\n `${name}=${values.map((val) => encodeValue(val)).join(\",\")}`,\n};\n\n/**\n * Map of array format to strategy implementation.\n */\nexport const arrayStrategies: Record<ArrayFormat, ArrayStrategy> = {\n none: noneArrayStrategy,\n brackets: bracketsArrayStrategy,\n index: indexArrayStrategy,\n comma: commaArrayStrategy,\n};\n","// packages/route-node/modules/search-params/strategies/boolean.ts\n\n/**\n * Boolean encoding/decoding strategies.\n *\n * @module search-params/strategies/boolean\n */\n\nimport type { DecodeResult, BooleanFormat } from \"../types\";\n\n// =============================================================================\n// Strategy Map\n// =============================================================================\n\n// =============================================================================\n// Strategy Interface\n// =============================================================================\n\n/**\n * Strategy for encoding/decoding boolean values.\n */\nexport interface BooleanStrategy {\n /**\n * Encodes a boolean value as a query string segment.\n *\n * @param name - URL-encoded parameter name\n * @param value - Boolean value to encode\n * @returns Query string segment (e.g., \"flag=true\" or just \"flag\")\n */\n encode: (name: string, value: boolean) => string;\n\n /**\n * Handles undefined value (key-only params like ?flag).\n *\n * @returns Decoded value for undefined\n */\n decodeUndefined: () => DecodeResult;\n\n /**\n * Decodes a raw (not URI-decoded) value before decodeValue() is called.\n * Used for formats that check raw values (e.g., \"string\" checks \"true\"/\"false\").\n *\n * @param rawValue - Raw value before URI decoding\n * @returns boolean if matched, null to continue with URI decoding\n */\n decodeRaw: (rawValue: string) => boolean | null;\n\n /**\n * Decodes a URI-decoded value.\n *\n * @param decodedValue - Value after URI decoding\n * @returns Decoded value (boolean or the same string)\n */\n decodeValue: (decodedValue: string) => DecodeResult;\n}\n\n// =============================================================================\n// Strategy Implementations\n// =============================================================================\n\n/**\n * No special boolean handling - values are treated as strings.\n */\nexport const noneBooleanStrategy: BooleanStrategy = {\n encode: (name, value) => `${name}=${value}`,\n decodeUndefined: () => null,\n decodeRaw: () => null, // No raw value matching\n decodeValue: (decoded) => decoded, // Return as-is\n};\n\n/**\n * Parse \"true\"/\"false\" strings as boolean values.\n * Checks raw value before URI decoding.\n */\nexport const stringBooleanStrategy: BooleanStrategy = {\n encode: (name, value) => `${name}=${value}`,\n decodeUndefined: () => null,\n decodeRaw: (raw) => {\n if (raw === \"true\") {\n return true;\n }\n if (raw === \"false\") {\n return false;\n }\n\n return null; // Continue with URI decoding\n },\n decodeValue: (decoded) => decoded, // Return decoded string\n};\n\n/**\n * True values are key-only (no =value), false values are omitted.\n * Example: ?flag instead of ?flag=true\n */\nexport const emptyTrueBooleanStrategy: BooleanStrategy = {\n encode: (name, value) => (value ? name : `${name}=false`),\n decodeUndefined: () => true, // Key-only means true\n decodeRaw: () => null, // No raw value matching\n decodeValue: (decoded) => decoded, // Return as-is\n};\n\n/**\n * Map of boolean format to strategy implementation.\n */\nexport const booleanStrategies: Record<BooleanFormat, BooleanStrategy> = {\n none: noneBooleanStrategy,\n string: stringBooleanStrategy,\n \"empty-true\": emptyTrueBooleanStrategy,\n};\n","// packages/route-node/modules/search-params/strategies/null.ts\n\n/**\n * Null encoding/decoding strategies.\n *\n * @module search-params/strategies/null\n */\n\n// =============================================================================\n// Strategy Interface\n// =============================================================================\n\n/**\n * Strategy for encoding/decoding null values.\n */\n// =============================================================================\n// Strategy Map\n// =============================================================================\n\nimport type { NullFormat } from \"../types\";\n\nexport interface NullStrategy {\n /**\n * Encodes a null value as a query string segment.\n *\n * @param name - URL-encoded parameter name\n * @returns Query string segment (e.g., \"key\" or \"\")\n */\n encode: (name: string) => string;\n}\n\n// =============================================================================\n// Strategy Implementations\n// =============================================================================\n\n/**\n * Default null format - key only without value.\n * Example: ?key (no equals sign)\n */\nexport const defaultNullStrategy: NullStrategy = {\n encode: (name) => name,\n};\n\n/**\n * Null values are hidden (omitted from query string).\n * Example: (nothing)\n */\nexport const hiddenNullStrategy: NullStrategy = {\n encode: () => \"\",\n};\n\n/**\n * Map of null format to strategy implementation.\n */\nexport const nullStrategies: Record<NullFormat, NullStrategy> = {\n default: defaultNullStrategy,\n hidden: hiddenNullStrategy,\n};\n","// packages/route-node/modules/search-params/strategies/index.ts\n\n/**\n * Search Params Strategies - Factory and Types.\n *\n * Provides a unified interface for format-specific encoding/decoding strategies.\n * Strategies are resolved once when options are created, avoiding repeated\n * format checks during encode/decode operations.\n *\n * @module search-params/strategies\n */\n\nimport { arrayStrategies, type ArrayStrategy } from \"./array\";\nimport { booleanStrategies, type BooleanStrategy } from \"./boolean\";\nimport { nullStrategies, type NullStrategy } from \"./null\";\n\nimport type { FinalOptions } from \"../types\";\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport type { ArrayStrategy } from \"./array\";\n\nexport type { BooleanStrategy } from \"./boolean\";\n\nexport type { NullStrategy } from \"./null\";\n\n// =============================================================================\n// Resolved Strategies\n// =============================================================================\n\n/**\n * Pre-resolved strategies based on options.\n * Created once when makeOptions() is called, avoiding repeated lookups.\n */\nexport interface ResolvedStrategies {\n readonly boolean: BooleanStrategy;\n readonly null: NullStrategy;\n readonly array: ArrayStrategy;\n}\n\n/**\n * Resolves strategies based on format options.\n *\n * @param arrayFormat - Array format\n * @param booleanFormat - Boolean format\n * @param nullFormat - Null format\n * @returns Resolved strategy implementations\n */\nexport const resolveStrategies = (\n arrayFormat: FinalOptions[\"arrayFormat\"],\n booleanFormat: FinalOptions[\"booleanFormat\"],\n nullFormat: FinalOptions[\"nullFormat\"],\n): ResolvedStrategies => ({\n boolean: booleanStrategies[booleanFormat],\n null: nullStrategies[nullFormat],\n array: arrayStrategies[arrayFormat],\n});\n\n// =============================================================================\n// Default Strategies\n// =============================================================================\n\n/**\n * Default strategies matching DEFAULT_OPTIONS.\n * Used when no custom options are provided.\n */\nexport const DEFAULT_STRATEGIES: ResolvedStrategies = {\n boolean: booleanStrategies.none,\n null: nullStrategies.default,\n array: arrayStrategies.none,\n};\n","// packages/route-node/modules/search-params/encode.ts\n\n/**\n * Encoding functions for search-params.\n *\n * Uses Strategy pattern for format-specific encoding.\n * Strategies are resolved once when options are created.\n *\n * @module search-params/encode\n */\n\nimport {\n DEFAULT_STRATEGIES,\n resolveStrategies,\n type ResolvedStrategies,\n} from \"./strategies\";\n\nimport type { FinalOptions, Options } from \"./types\";\n\n// =============================================================================\n// Options with Strategies\n// =============================================================================\n\n/**\n * Extended options with pre-resolved strategies.\n */\nexport interface OptionsWithStrategies extends FinalOptions {\n readonly strategies: ResolvedStrategies;\n}\n\n/**\n * Cached default options with strategies - avoids allocation when no options passed.\n */\nconst DEFAULT_OPTIONS: OptionsWithStrategies = {\n arrayFormat: \"none\",\n booleanFormat: \"none\",\n nullFormat: \"default\",\n strategies: DEFAULT_STRATEGIES,\n};\n\n/**\n * Creates options with defaults and pre-resolved strategies.\n * Returns cached DEFAULT_OPTIONS when no custom options are specified.\n */\nexport const makeOptions = (opts?: Options): OptionsWithStrategies => {\n if (\n !opts ||\n (opts.arrayFormat === undefined &&\n opts.booleanFormat === undefined &&\n opts.nullFormat === undefined)\n ) {\n return DEFAULT_OPTIONS;\n }\n\n // Avoid object spread - direct property assignment is faster\n const arrayFormat = opts.arrayFormat ?? \"none\";\n const booleanFormat = opts.booleanFormat ?? \"none\";\n const nullFormat = opts.nullFormat ?? \"default\";\n\n return {\n arrayFormat,\n booleanFormat,\n nullFormat,\n strategies: resolveStrategies(arrayFormat, booleanFormat, nullFormat),\n };\n};\n\n// =============================================================================\n// Value Encoding\n// =============================================================================\n\n/**\n * Encodes a value for use in a URL query string.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\nexport const encodeValue = (value: any): string => encodeURIComponent(value);\n\n// =============================================================================\n// Main Encode\n// =============================================================================\n\n/**\n * Encodes a parameter name and value as a query string segment.\n *\n * Uses pre-resolved strategies for format-specific encoding.\n * Strategies handle all formats uniformly - no inline optimizations\n * to avoid equivalent mutants in mutation testing.\n *\n * @param name - Parameter name\n * @param value - Parameter value\n * @param opts - Options with pre-resolved strategies\n * @returns Query string segment (e.g., \"key=value\")\n */\nexport const encode = (\n name: string,\n value: unknown,\n opts: OptionsWithStrategies,\n): string => {\n const encodedName = encodeValue(name);\n\n // Handle each type using strategies\n switch (typeof value) {\n case \"string\":\n case \"number\": {\n return `${encodedName}=${encodeValue(value)}`;\n }\n case \"boolean\": {\n return opts.strategies.boolean.encode(encodedName, value);\n }\n case \"object\": {\n // Null check\n if (value === null) {\n return opts.strategies.null.encode(encodedName);\n }\n // Array check\n if (Array.isArray(value)) {\n return opts.strategies.array.encodeArray(encodedName, value);\n }\n\n // Fallback for other objects - treat as string\n return `${encodedName}=${encodeValue(value)}`;\n }\n default: {\n // Fallback for other types (undefined handled by caller)\n return `${encodedName}=${encodeValue(value)}`;\n }\n }\n};\n","// packages/route-node/modules/search-params/utils.ts\n\n/**\n * Utility functions for search-params.\n *\n * Internalized from https://github.com/troch/search-params\n *\n * @module search-params/utils\n */\n\n// =============================================================================\n// Query String Extraction\n// =============================================================================\n\n/**\n * Extracts the query string portion from a path.\n * Returns everything after \"?\" or the entire string if no \"?\" exists.\n */\nexport const getSearch = (path: string): string => {\n const pos = path.indexOf(\"?\");\n\n if (pos === -1) {\n return path;\n }\n\n return path.slice(pos + 1);\n};\n","// packages/route-node/modules/search-params/searchParams.ts\n\n/**\n * Search Params - Query String Parsing and Building.\n *\n * Internalized from https://github.com/troch/search-params (MIT License)\n * for better code control and optimization.\n *\n * @module search-params/searchParams\n */\n\nimport { decode, decodeValue } from \"./decode\";\nimport { encode, makeOptions } from \"./encode\";\nimport { getSearch } from \"./utils\";\n\nimport type { ResolvedStrategies } from \"./strategies\";\nimport type { KeepResponse, OmitResponse, Options } from \"./types\";\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\n/**\n * Extracts parameter name from raw name (removes bracket suffix).\n *\n * @internal\n */\nfunction extractParamName(rawName: string): {\n name: string;\n hasBrackets: boolean;\n} {\n const bracketPos = rawName.indexOf(\"[\");\n\n return bracketPos === -1\n ? { name: rawName, hasBrackets: false }\n : { name: rawName.slice(0, bracketPos), hasBrackets: true };\n}\n\n/**\n * Adds a decoded value to params object, handling array accumulation.\n *\n * @internal\n */\nfunction addToParams(\n params: Record<string, unknown>,\n decodedName: string,\n decodedValue: unknown,\n hasBrackets: boolean,\n): void {\n const currentValue = params[decodedName];\n\n if (currentValue === undefined) {\n params[decodedName] = hasBrackets ? [decodedValue] : decodedValue;\n } else if (Array.isArray(currentValue)) {\n currentValue.push(decodedValue);\n } else {\n params[decodedName] = [currentValue, decodedValue];\n }\n}\n\n/**\n * Decodes a parameter value based on whether strategies are provided.\n *\n * @internal\n */\nfunction decodeParamValue(\n searchPart: string,\n eqPos: number,\n end: number,\n hasValue: boolean,\n strategies: ResolvedStrategies | undefined,\n): unknown {\n if (strategies) {\n const rawValue = hasValue ? searchPart.slice(eqPos + 1, end) : undefined;\n\n return decode(rawValue, strategies);\n }\n\n return hasValue ? decodeValue(searchPart.slice(eqPos + 1, end)) : null;\n}\n\n/**\n * Processes a single query parameter chunk and adds to params.\n *\n * @internal\n */\nfunction processParamChunk(\n searchPart: string,\n start: number,\n end: number,\n params: Record<string, unknown>,\n strategies?: ResolvedStrategies,\n): void {\n const eqPos = searchPart.indexOf(\"=\", start);\n const hasValue = eqPos !== -1 && eqPos < end;\n\n const rawName = hasValue\n ? searchPart.slice(start, eqPos)\n : searchPart.slice(start, end);\n\n const { name, hasBrackets } = extractParamName(rawName);\n const decodedName = decodeValue(name);\n const decodedValue = decodeParamValue(\n searchPart,\n eqPos,\n end,\n hasValue,\n strategies,\n );\n\n addToParams(params, decodedName, decodedValue, hasBrackets);\n}\n\n/**\n * Iterates over query string parameters, calling handler for each chunk.\n *\n * @internal\n */\nfunction forEachParam(\n searchPart: string,\n handler: (chunk: string) => void,\n): void {\n let start = 0;\n const len = searchPart.length;\n\n while (start < len) {\n let end = searchPart.indexOf(\"&\", start);\n\n if (end === -1) {\n end = len;\n }\n\n handler(searchPart.slice(start, end));\n start = end + 1;\n }\n}\n\n// =============================================================================\n// Parse\n// =============================================================================\n\n/**\n * Parse a querystring and return an object of parameters.\n *\n * @example\n * ```typescript\n * parse(\"page=1&sort=name\");\n * // => { page: \"1\", sort: \"name\" }\n *\n * parse(\"items[]=a&items[]=b\", { arrayFormat: \"brackets\" });\n * // => { items: [\"a\", \"b\"] }\n * ```\n */\nexport const parse = (\n path: string,\n opts?: Options,\n): Record<string, unknown> => {\n const searchPart = getSearch(path);\n\n // Fast path: empty query string\n if (searchPart === \"\" || searchPart === \"?\") {\n return {};\n }\n\n // Fast path: no options - use simplified parser (skip strategy resolution)\n if (!opts) {\n return parseSimple(searchPart);\n }\n\n const options = makeOptions(opts);\n const params: Record<string, unknown> = {};\n\n // Process each parameter\n let start = 0;\n const len = searchPart.length;\n\n while (start < len) {\n let end = searchPart.indexOf(\"&\", start);\n\n if (end === -1) {\n end = len;\n }\n\n processParamChunk(searchPart, start, end, params, options.strategies);\n start = end + 1;\n }\n\n return params;\n};\n\n/**\n * Simplified parse without strategy resolution.\n * Used when no options are provided (most common case).\n * Returns string values only (no boolean/null conversion).\n *\n * @internal\n */\nfunction parseSimple(searchPart: string): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n parseIntoInternal(searchPart, params);\n\n return params;\n}\n\n/**\n * Parse query string directly into a target object.\n * Avoids creating intermediate object and Object.assign.\n * Optimized for loose mode query params handling.\n *\n * @param queryString - Query string without leading \"?\"\n * @param target - Object to add params to\n */\nexport function parseInto(\n queryString: string,\n target: Record<string, unknown>,\n): void {\n if (queryString === \"\") {\n return;\n }\n\n parseIntoInternal(queryString, target);\n}\n\n/**\n * Internal function to parse query string into target object.\n * Shared by parseSimple and parseInto.\n *\n * @internal\n */\nfunction parseIntoInternal(\n searchPart: string,\n params: Record<string, unknown>,\n): void {\n let start = 0;\n const len = searchPart.length;\n\n while (start < len) {\n let end = searchPart.indexOf(\"&\", start);\n\n if (end === -1) {\n end = len;\n }\n\n // No strategies = simple decoding\n processParamChunk(searchPart, start, end, params);\n start = end + 1;\n }\n}\n\n// =============================================================================\n// Build\n// =============================================================================\n\n/**\n * Build a querystring from an object of parameters.\n *\n * Note: Empty arrays produce an empty string, so `parse(build({ items: [] }))`\n * will not contain the `items` key. This is expected behavior for all array\n * formats except `comma` (which produces `\"items=\"` for empty arrays).\n *\n * @example\n * ```typescript\n * build({ page: 1, sort: \"name\" });\n * // => \"page=1&sort=name\"\n *\n * build({ items: [\"a\", \"b\"] }, { arrayFormat: \"brackets\" });\n * // => \"items[]=a&items[]=b\"\n * ```\n */\nexport const build = (\n params: Record<string, unknown>,\n opts?: Options,\n): string => {\n // Fast path for empty params (common case)\n const keys = Object.keys(params);\n\n if (keys.length === 0) {\n return \"\";\n }\n\n const options = makeOptions(opts);\n\n // Optimized: single loop instead of filter().map().filter().join()\n // Avoids creating 3 intermediate arrays\n const parts: string[] = [];\n\n for (const key of keys) {\n const value = params[key];\n\n // Skip undefined values (not serialisable)\n if (value === undefined) {\n continue;\n }\n\n const encoded = encode(key, value, options);\n\n // Skip empty strings (e.g., from nullFormat: \"hidden\")\n if (encoded) {\n parts.push(encoded);\n }\n }\n\n return parts.join(\"&\");\n};\n\n// =============================================================================\n// Omit\n// =============================================================================\n\n/**\n * Remove a list of parameters from a querystring.\n *\n * @example\n * ```typescript\n * omit(\"page=1&sort=name&limit=10\", [\"sort\", \"limit\"]);\n * // => { querystring: \"page=1\", removedParams: { sort: \"name\", limit: \"10\" } }\n * ```\n */\nexport const omit = (\n path: string,\n paramsToOmit: string[],\n opts?: Options,\n): OmitResponse => {\n const searchPart = getSearch(path);\n\n if (searchPart === \"\") {\n return { querystring: \"\", removedParams: {} };\n }\n\n // Fast path: no params to omit - keep entire querystring\n if (paramsToOmit.length === 0) {\n const hasPrefix = path.startsWith(\"?\");\n\n return {\n querystring: hasPrefix ? path : searchPart,\n removedParams: {},\n };\n }\n\n const options = makeOptions(opts);\n const hasPrefix = path.startsWith(\"?\");\n const omitSet = new Set(paramsToOmit);\n const kept: string[] = [];\n const removed: string[] = [];\n\n forEachParam(searchPart, (chunk) => {\n const eqPos = chunk.indexOf(\"=\");\n const rawName = eqPos === -1 ? chunk : chunk.slice(0, eqPos);\n const { name } = extractParamName(rawName);\n\n if (omitSet.has(name)) {\n removed.push(chunk);\n } else {\n kept.push(chunk);\n }\n });\n\n const querystring = kept.join(\"&\");\n\n return {\n querystring: hasPrefix && querystring ? `?${querystring}` : querystring,\n removedParams: parse(removed.join(\"&\"), options),\n };\n};\n\n// =============================================================================\n// Keep\n// =============================================================================\n\n/**\n * Keep only specified parameters from a querystring.\n *\n * @example\n * ```typescript\n * keep(\"page=1&sort=name&limit=10\", [\"page\"]);\n * // => { querystring: \"page=1\", keptParams: { page: \"1\" } }\n * ```\n */\nexport const keep = (\n path: string,\n paramsToKeep: string[],\n opts?: Options,\n): KeepResponse => {\n const searchPart = getSearch(path);\n\n if (searchPart === \"\") {\n return { keptParams: {}, querystring: \"\" };\n }\n\n // Fast path: no params to keep\n if (paramsToKeep.length === 0) {\n return { keptParams: {}, querystring: \"\" };\n }\n\n const options = makeOptions(opts);\n const keepSet = new Set(paramsToKeep);\n const kept: string[] = [];\n\n forEachParam(searchPart, (chunk) => {\n const eqPos = chunk.indexOf(\"=\");\n const rawName = eqPos === -1 ? chunk : chunk.slice(0, eqPos);\n const { name } = extractParamName(rawName);\n\n if (keepSet.has(name)) {\n kept.push(chunk);\n }\n });\n\n const querystring = kept.join(\"&\");\n\n return { keptParams: parse(querystring, options), querystring };\n};\n","// packages/route-tree/src/createMatcher.ts\n\n/**\n * Matcher Factory.\n *\n * Creates a pre-configured path matcher with search-params DI baked in.\n * This is the public API for creating matchers — SegmentMatcher class\n * and search-params functions are internal implementation details.\n *\n * @module route-tree/createMatcher\n */\n\nimport { SegmentMatcher } from \"path-matcher\";\nimport { parse, build } from \"search-params\";\n\n// =============================================================================\n// Public Types (route-tree's own — no path-matcher or search-params types leak)\n// =============================================================================\n\n/**\n * Query string formatting options.\n *\n * Controls how arrays, booleans, and nulls are serialized in query strings.\n */\nexport interface QueryParamsConfig {\n readonly arrayFormat?: \"none\" | \"brackets\" | \"index\" | \"comma\";\n readonly booleanFormat?: \"none\" | \"string\" | \"empty-true\";\n readonly nullFormat?: \"default\" | \"hidden\";\n}\n\n/**\n * Options for creating a path matcher.\n */\nexport interface CreateMatcherOptions {\n readonly caseSensitive?: boolean;\n readonly strictTrailingSlash?: boolean;\n readonly strictQueryParams?: boolean;\n readonly urlParamsEncoding?: \"default\" | \"uri\" | \"uriComponent\" | \"none\";\n readonly queryParams?: QueryParamsConfig;\n}\n\n/**\n * Path matcher instance type.\n *\n * Opaque type — consumers use methods (match, buildPath, hasRoute, etc.)\n * without knowing the underlying SegmentMatcher implementation.\n */\nexport type Matcher = SegmentMatcher;\n\n// =============================================================================\n// Factory\n// =============================================================================\n\n/**\n * Creates a path matcher with search-params DI baked in.\n *\n * @param options - Matcher configuration\n * @returns Configured matcher instance\n *\n * @example\n * ```typescript\n * const matcher = createMatcher({\n * strictTrailingSlash: true,\n * queryParams: { booleanFormat: \"string\" },\n * });\n * matcher.registerTree(tree);\n * const result = matcher.match(\"/users/123\");\n * ```\n */\nexport function createMatcher(options?: CreateMatcherOptions): Matcher {\n const qp = options?.queryParams;\n\n // Conditional spread: exactOptionalPropertyTypes forbids setting optional\n // properties to undefined — only include properties that are defined.\n return new SegmentMatcher({\n ...(options?.caseSensitive === undefined\n ? undefined\n : { caseSensitive: options.caseSensitive }),\n ...(options?.strictTrailingSlash === undefined\n ? undefined\n : { strictTrailingSlash: options.strictTrailingSlash }),\n ...(options?.strictQueryParams === undefined\n ? undefined\n : { strictQueryParams: options.strictQueryParams }),\n ...(options?.urlParamsEncoding === undefined\n ? undefined\n : { urlParamsEncoding: options.urlParamsEncoding }),\n parseQueryString: (qs: string) => parse(qs, qp),\n buildQueryString: (params: Record<string, unknown>) => build(params, qp),\n });\n}\n","// packages/route-node/modules/validation/routes.ts\n\nimport type { RouteTree } from \"../types\";\n\n/**\n * Creates a TypeError with consistent router error message format.\n *\n * @param methodName - Name of the method that triggered the error\n * @param message - Error message\n * @returns TypeError with formatted message\n * @internal\n */\nfunction createRouterError(methodName: string, message: string): TypeError {\n return new TypeError(`[router.${methodName}] ${message}`);\n}\n\n/**\n * Validates route path format.\n * Throws a descriptive error if validation fails.\n *\n * Allows:\n * - Empty string (for grouping/root routes)\n * - Absolute paths: /path, ~path\n * - Query strings: ?query\n * - Relative segments: segment\n *\n * Prevents:\n * - Non-string values\n * - Double slashes (//)\n * - Absolute paths (~) under parameterized parent nodes\n *\n * @param path - Route path to validate\n * @param routeName - Name of route (for error messages)\n * @param methodName - Name of calling method for error messages\n * @param parentNode - Optional parent node for context validation\n * @throws {TypeError} If path is invalid\n *\n * @example\n * // Valid paths\n * validateRoutePath(\"\", \"home\", \"add\"); // ok (empty for grouping)\n * validateRoutePath(\"/users\", \"users\", \"add\"); // ok (absolute)\n * validateRoutePath(\"~dashboard\", \"dash\", \"add\"); // ok (absolute, if no parameterized parent)\n * validateRoutePath(\"?tab=1\", \"home\", \"add\"); // ok (query)\n * validateRoutePath(\"profile\", \"users.profile\", \"add\"); // ok (relative)\n *\n * @example\n * // Invalid paths (throws)\n * validateRoutePath(\"/users//list\", \"users.list\", \"add\"); // throws (double slash)\n * validateRoutePath(\"~dash\", \"dash\", \"add\", paramParent); // throws (~ under parameterized parent)\n */\nexport function validateRoutePath(\n path: unknown,\n routeName: string,\n methodName: string,\n parentNode?: RouteTree,\n): asserts path is string {\n // Type check\n if (typeof path !== \"string\") {\n // Get type description for error message\n let typeDesc: string;\n\n if (path === null) {\n typeDesc = \"null\";\n } else if (Array.isArray(path)) {\n typeDesc = \"array\";\n } else {\n typeDesc = typeof path;\n }\n\n throw createRouterError(\n methodName,\n `Route path must be a string, got ${typeDesc}`,\n );\n }\n\n // Empty path is valid (for grouping/root)\n if (path === \"\") {\n return;\n }\n\n // No whitespace characters (spaces, tabs, newlines)\n if (/\\s/.test(path)) {\n throw createRouterError(\n methodName,\n `Invalid path for route \"${routeName}\": whitespace not allowed in \"${path}\"`,\n );\n }\n\n // Valid path pattern\n if (!/^([/?~]|[^/]+$)/.test(path)) {\n throw createRouterError(\n methodName,\n `Route \"${routeName}\" has invalid path format: \"${path}\". Path should start with '/', '~', '?' or be a relative segment.`,\n );\n }\n\n // No double slashes\n if (path.includes(\"//\")) {\n throw createRouterError(\n methodName,\n `Invalid path for route \"${routeName}\": double slashes not allowed in \"${path}\"`,\n );\n }\n\n // Absolute paths under parameterized parents\n // Check if parent has URL parameters via paramTypeMap\n const hasUrlParams =\n parentNode && Object.values(parentNode.paramTypeMap).includes(\"url\");\n\n if (path.startsWith(\"~\") && hasUrlParams) {\n throw createRouterError(\n methodName,\n `Absolute path \"${path}\" cannot be used under parent route with URL parameters`,\n );\n }\n}\n","// packages/route-node/modules/validation/route-batch.ts\n\n/**\n * Batch route validation utilities.\n *\n * Provides validation for adding routes with cross-batch duplicate detection.\n * Used by router.addRoute() to ensure atomicity - all routes validated before any modification.\n */\n\nimport { validateRoutePath } from \"./routes\";\n\nimport type { RouteDefinition, RouteTree } from \"../types\";\n\n/**\n * Pattern for route name validation.\n * Each route name must start with letter/underscore, followed by alphanumeric/hyphen/underscore.\n * Dots are NOT allowed - use children array or { parent } option in addRoute() instead.\n * Rejects: names starting with numbers/hyphens, names containing dots.\n */\nconst ROUTE_NAME_PATTERN = /^[A-Z_a-z][\\w-]*$/;\n\n/**\n * Checks if string contains at least one non-whitespace character.\n */\nconst HAS_NON_WHITESPACE = /\\S/;\n\n/**\n * Maximum route name length to prevent DoS and performance issues.\n */\nconst MAX_ROUTE_NAME_LENGTH = 10_000;\n\n/**\n * Gets a human-readable description of a value's type.\n * Used for error messages to provide helpful debugging information.\n */\nfunction getTypeDescription(value: unknown): string {\n // Handle null explicitly (typeof null === \"object\")\n if (value === null) {\n return \"null\";\n }\n\n if (typeof value === \"object\") {\n // Return constructor name for class instances\n if (\"constructor\" in value && value.constructor.name !== \"Object\") {\n return value.constructor.name;\n }\n\n // Plain object\n return \"object\";\n }\n\n // Primitive types (string, number, boolean, undefined, etc.)\n return typeof value;\n}\n\n/**\n * Checks if an object has getters or setters.\n * Used to detect potentially malicious route objects that could mutate during processing.\n *\n * @param obj - Object to check\n * @returns true if object has getters or setters\n */\nfunction hasGettersOrSetters(obj: Record<string, unknown>): boolean {\n for (const key of Object.keys(obj)) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n\n if (descriptor && (descriptor.get || descriptor.set)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Validates that route is a plain object without getters/setters.\n * Prevents malicious objects that could mutate during processing.\n *\n * @param route - Route to validate\n * @param methodName - Calling method for error context\n * @throws {TypeError} If route is not a plain object\n */\nfunction validateRouteType(\n route: unknown,\n methodName: string,\n): asserts route is Record<string, unknown> {\n if (!route || typeof route !== \"object\") {\n throw new TypeError(\n `[router.${methodName}] Route must be an object, got ${getTypeDescription(route)}`,\n );\n }\n\n // Check for plain object (prototype must be Object.prototype or null)\n const proto: object | null = Object.getPrototypeOf(route) as object | null;\n\n if (proto !== Object.prototype && proto !== null) {\n throw new TypeError(\n `[router.${methodName}] Route must be a plain object, got ${getTypeDescription(route)}`,\n );\n }\n\n // Check for getters/setters (could cause mutations during processing)\n if (hasGettersOrSetters(route as Record<string, unknown>)) {\n throw new TypeError(\n `[router.${methodName}] Route must not have getters or setters`,\n );\n }\n}\n\n/**\n * Validates that encodeParams is a function if provided.\n *\n * @param route - Route configuration\n * @param methodName - Calling method for error context\n * @throws {TypeError} If encodeParams is not a function\n */\nfunction validateEncodeParams(\n route: Record<string, unknown>,\n methodName: string,\n): void {\n if (\n route.encodeParams !== undefined &&\n typeof route.encodeParams !== \"function\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Route \"${String(route.name)}\" encodeParams must be a function`,\n );\n }\n}\n\n/**\n * Validates that decodeParams is a function if provided.\n *\n * @param route - Route configuration\n * @param methodName - Calling method for error context\n * @throws {TypeError} If decodeParams is not a function\n */\nfunction validateDecodeParams(\n route: Record<string, unknown>,\n methodName: string,\n): void {\n if (\n route.decodeParams !== undefined &&\n typeof route.decodeParams !== \"function\"\n ) {\n throw new TypeError(\n `[router.${methodName}] Route \"${String(route.name)}\" decodeParams must be a function`,\n );\n }\n}\n\n/**\n * Validates that route name is a valid string matching the expected format.\n *\n * Route name rules:\n * - Must be a string\n * - Cannot be empty or whitespace-only\n * - Cannot contain dots (use children array or { parent } option instead)\n * - Must match [a-zA-Z_][a-zA-Z0-9_-]*\n *\n * @param route - Route configuration\n * @param methodName - Calling method for error context\n * @throws {TypeError} If name is missing, not a string, or invalid format\n */\nfunction validateRouteName(\n route: Record<string, unknown>,\n methodName: string,\n): asserts route is Record<string, unknown> & { name: string } {\n if (typeof route.name !== \"string\") {\n throw new TypeError(\n `[router.${methodName}] Route name must be a string, got ${getTypeDescription(route.name)}`,\n );\n }\n\n const name = route.name;\n\n // Empty string is not allowed for addRoute (unlike root node in type-guards)\n if (name === \"\") {\n throw new TypeError(`[router.${methodName}] Route name cannot be empty`);\n }\n\n // Whitespace-only strings are invalid\n if (!HAS_NON_WHITESPACE.test(name)) {\n throw new TypeError(\n `[router.${methodName}] Route name cannot contain only whitespace`,\n );\n }\n\n // Length check for technical safety\n if (name.length > MAX_ROUTE_NAME_LENGTH) {\n throw new TypeError(\n `[router.${methodName}] Route name exceeds maximum length of ${MAX_ROUTE_NAME_LENGTH} characters`,\n );\n }\n\n // System routes bypass pattern validation (e.g., @@router/UNKNOWN_ROUTE)\n if (name.startsWith(\"@@\")) {\n return;\n }\n\n // Dots are not allowed in route names\n if (name.includes(\".\")) {\n throw new TypeError(\n `[router.${methodName}] Route name \"${name}\" cannot contain dots. ` +\n `Use children array or { parent } option in addRoute() instead.`,\n );\n }\n\n // Validate route pattern (ASCII only: letters, numbers, underscores, hyphens)\n if (!ROUTE_NAME_PATTERN.test(name)) {\n throw new TypeError(\n `[router.${methodName}] Invalid route name \"${name}\". ` +\n `Name must start with a letter or underscore, ` +\n `followed by letters, numbers, underscores, or hyphens.`,\n );\n }\n}\n\n/**\n * Finds a node by its fullName in the tree.\n * Even though user-provided route names cannot contain dots,\n * fullName is computed during validation (e.g., \"parent.child\").\n *\n * @param rootNode - Root node to start from\n * @param fullName - Full route name (e.g., \"users.profile\")\n * @returns The resolved node, or undefined if not found\n */\nfunction findNodeByFullName(\n rootNode: RouteTree,\n fullName: string,\n): RouteTree | undefined {\n // Fast path: single-segment names don't need splitting\n if (!fullName.includes(\".\")) {\n return rootNode.children.get(fullName);\n }\n\n let current: RouteTree | undefined = rootNode;\n\n for (const segment of fullName.split(\".\")) {\n current = current.children.get(segment);\n\n if (!current) {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Checks for duplicate route name in existing tree.\n *\n * @param rootNode - Root node to search in\n * @param fullName - Full route name (dot-notation)\n * @param methodName - Calling method for error context\n * @throws {Error} If route name already exists\n */\nfunction checkTreeNameDuplicate(\n rootNode: RouteTree,\n fullName: string,\n methodName: string,\n): void {\n if (findNodeByFullName(rootNode, fullName)) {\n throw new Error(\n `[router.${methodName}] Route \"${fullName}\" already exists`,\n );\n }\n}\n\n/**\n * Checks for duplicate route name in current batch.\n *\n * @param seenNames - Set of names already seen in batch\n * @param fullName - Full route name to check\n * @param methodName - Calling method for error context\n * @throws {Error} If duplicate name in batch\n */\nfunction checkBatchNameDuplicate(\n seenNames: Set<string>,\n fullName: string,\n methodName: string,\n): void {\n if (seenNames.has(fullName)) {\n throw new Error(\n `[router.${methodName}] Duplicate route \"${fullName}\" in batch`,\n );\n }\n\n seenNames.add(fullName);\n}\n\n/**\n * Checks for duplicate path in existing tree at same parent level.\n *\n * @param rootNode - Root node to search in\n * @param parentName - Parent route name (empty string for root level)\n * @param routePath - Path to check for duplicates\n * @throws {Error} If path already exists at this level\n */\nfunction checkTreePathDuplicate(\n rootNode: RouteTree,\n parentName: string,\n routePath: string,\n methodName: string,\n): void {\n const parentNode =\n parentName === \"\" ? rootNode : findNodeByFullName(rootNode, parentName);\n\n if (!parentNode) {\n return; // Parent doesn't exist, so no duplicate\n }\n\n for (const child of parentNode.children.values()) {\n if (child.path === routePath) {\n throw new Error(\n `[router.${methodName}] Path \"${routePath}\" is already defined`,\n );\n }\n }\n}\n\n/**\n * Checks for duplicate path in current batch at same parent level.\n *\n * @param seenPathsByParent - Map of paths by parent name\n * @param parentName - Parent route name (empty string for root level)\n * @param routePath - Path to check for duplicates\n * @throws {Error} If path already exists at this level in batch\n */\nfunction checkBatchPathDuplicate(\n seenPathsByParent: Map<string, Set<string>>,\n parentName: string,\n routePath: string,\n methodName: string,\n): void {\n const pathsAtLevel = seenPathsByParent.get(parentName);\n\n if (pathsAtLevel?.has(routePath)) {\n throw new Error(\n `[router.${methodName}] Path \"${routePath}\" is already defined`,\n );\n }\n\n if (pathsAtLevel) {\n pathsAtLevel.add(routePath);\n } else {\n seenPathsByParent.set(parentName, new Set([routePath]));\n }\n}\n\n/**\n * Validates route structure for add operations.\n *\n * Performs comprehensive validation including:\n * - Type check (must be object)\n * - Name validation\n * - Path validation\n * - Duplicate name detection (in tree and batch)\n * - Duplicate path detection (in tree and batch)\n * - Recursive children validation\n *\n * @param route - Route to validate\n * @param methodName - Calling method for error context\n * @param rootNode - Optional root node for duplicate checking\n * @param parentName - Parent route name for building full path (used in recursion)\n * @param seenNames - Set of names already seen in this batch\n * @param seenPathsByParent - Map of paths by parent for path duplicate detection\n * @throws {TypeError} If route structure is invalid\n * @throws {Error} If route already exists (duplicate)\n * @throws {Error} If path already defined (duplicate)\n *\n * @example\n * ```typescript\n * const seenNames = new Set<string>();\n * const seenPaths = new Map<string, Set<string>>();\n *\n * // Validate routes before adding\n * for (const route of routes) {\n * validateRoute(route, \"add\", rootNode, \"\", seenNames, seenPaths);\n * }\n * ```\n */\nexport function validateRoute(\n route: unknown,\n methodName: string,\n rootNode?: RouteTree,\n parentName = \"\",\n seenNames?: Set<string>,\n seenPathsByParent?: Map<string, Set<string>>,\n): asserts route is RouteDefinition {\n validateRouteType(route, methodName);\n\n const r = route;\n\n // Validate that name is a non-empty string\n validateRouteName(r, methodName);\n\n // Validate path structure\n validateRoutePath(r.path, r.name, methodName, rootNode);\n\n // Validate optional function properties\n validateEncodeParams(r, methodName);\n validateDecodeParams(r, methodName);\n\n const routeName = r.name;\n const fullName = parentName ? `${parentName}.${routeName}` : routeName;\n\n // Check for duplicate name in existing tree\n if (rootNode && fullName) {\n checkTreeNameDuplicate(rootNode, fullName, methodName);\n }\n\n // Check for duplicate name in current batch\n if (seenNames) {\n checkBatchNameDuplicate(seenNames, fullName, methodName);\n }\n\n const routePath = r.path;\n const pathCheckParent = parentName;\n\n // Check for duplicate path in existing tree\n if (rootNode) {\n checkTreePathDuplicate(rootNode, pathCheckParent, routePath, methodName);\n }\n\n // Check for duplicate path in current batch\n if (seenPathsByParent) {\n checkBatchPathDuplicate(\n seenPathsByParent,\n pathCheckParent,\n routePath,\n methodName,\n );\n }\n\n // Validate children recursively\n if (r.children !== undefined) {\n if (!Array.isArray(r.children)) {\n throw new TypeError(\n `[router.${methodName}] Route \"${routeName}\" children must be an array, got ${getTypeDescription(r.children)}`,\n );\n }\n\n for (const child of r.children) {\n validateRoute(\n child,\n methodName,\n rootNode,\n fullName,\n seenNames,\n seenPathsByParent,\n );\n }\n }\n}\n","// packages/core/src/namespaces/RoutesNamespace/constants.ts\n\n/**\n * Default route name for the root node.\n */\nexport const DEFAULT_ROUTE_NAME = \"\";\n\n/**\n * Cache for validated route names to skip regex validation on repeated calls.\n * Key insight: validateRouteName() regex takes ~40ns, but cache lookup is ~1ns.\n * This cache is module-level (shared across all router instances) since route name\n * validity is independent of router instance.\n */\nexport const validatedRouteNames = new Set<string>();\n","// packages/core/src/namespaces/RoutesNamespace/helpers.ts\n\nimport { getSegmentsByName } from \"route-tree\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport type { RouteConfig } from \"./types\";\nimport type { Route } from \"../../types\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Params,\n} from \"@real-router/types\";\nimport type { RouteDefinition, RouteTree } from \"route-tree\";\n\n/**\n * Creates an empty RouteConfig.\n */\nexport function createEmptyConfig(): RouteConfig {\n return {\n decoders: Object.create(null) as Record<string, (params: Params) => Params>,\n encoders: Object.create(null) as Record<string, (params: Params) => Params>,\n defaultParams: Object.create(null) as Record<string, Params>,\n forwardMap: Object.create(null) as Record<string, string>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n forwardFnMap: Object.create(null) as Record<string, ForwardToCallback<any>>,\n };\n}\n\n// ============================================================================\n// Route Tree Helpers\n// ============================================================================\n\n/**\n * Checks if all params from source exist with same values in target.\n * Small function body allows V8 inlining.\n */\nexport function paramsMatch(source: Params, target: Params): boolean {\n for (const key in source) {\n if (source[key] !== target[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks params match, skipping keys present in skipKeys.\n */\nexport function paramsMatchExcluding(\n source: Params,\n target: Params,\n skipKeys: Params,\n): boolean {\n for (const key in source) {\n if (key in skipKeys) {\n continue;\n }\n if (source[key] !== target[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Sanitizes a route by keeping only essential properties.\n */\nexport function sanitizeRoute<Dependencies extends DefaultDependencies>(\n route: Route<Dependencies>,\n): RouteDefinition {\n const sanitized: RouteDefinition = {\n name: route.name,\n path: route.path,\n };\n\n if (route.children) {\n sanitized.children = route.children.map((child) => sanitizeRoute(child));\n }\n\n return sanitized;\n}\n\n/**\n * Recursively removes a route from definitions array.\n */\nexport function removeFromDefinitions(\n definitions: RouteDefinition[],\n routeName: string,\n parentPrefix = \"\",\n): boolean {\n for (let i = 0; i < definitions.length; i++) {\n const route = definitions[i];\n const fullName = parentPrefix\n ? `${parentPrefix}.${route.name}`\n : route.name;\n\n if (fullName === routeName) {\n definitions.splice(i, 1);\n\n return true;\n }\n\n if (\n route.children &&\n routeName.startsWith(`${fullName}.`) &&\n removeFromDefinitions(route.children, routeName, fullName)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Clears configuration entries that match the predicate.\n */\nexport function clearConfigEntries<T>(\n config: Record<string, T>,\n matcher: (key: string) => boolean,\n): void {\n for (const key of Object.keys(config)) {\n if (matcher(key)) {\n delete config[key];\n }\n }\n}\n\n// ============================================================================\n// Route Property Validation\n// ============================================================================\n\n/**\n * Validates forwardTo property type and async status.\n */\nfunction validateForwardToProperty(forwardTo: unknown, fullName: string): void {\n if (forwardTo === undefined) {\n return;\n }\n\n if (typeof forwardTo === \"function\") {\n const isNativeAsync =\n (forwardTo as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\";\n const isTranspiledAsync = forwardTo.toString().includes(\"__awaiter\");\n\n if (isNativeAsync || isTranspiledAsync) {\n throw new TypeError(\n `[router.addRoute] forwardTo callback cannot be async for route \"${fullName}\". ` +\n `Async functions break matchPath/buildPath.`,\n );\n }\n }\n}\n\n/**\n * Validates route properties for addRoute.\n * Throws TypeError if any property is invalid.\n *\n * @param route - Route to validate\n * @param fullName - Full route name (with parent prefix)\n * @throws {TypeError} If canActivate/canDeactivate is not a function\n * @throws {TypeError} If defaultParams is not a plain object\n * @throws {TypeError} If decodeParams/encodeParams is async\n */\nexport function validateRouteProperties<\n Dependencies extends DefaultDependencies,\n>(route: Route<Dependencies>, fullName: string): void {\n // Validate canActivate is a function\n if (\n route.canActivate !== undefined &&\n typeof route.canActivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canActivate must be a function for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.canActivate)}`,\n );\n }\n\n // Validate canDeactivate is a function\n if (\n route.canDeactivate !== undefined &&\n typeof route.canDeactivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canDeactivate must be a function for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.canDeactivate)}`,\n );\n }\n\n // Validate defaultParams is a plain object\n // Runtime check for invalid types passed via `as any`\n if (route.defaultParams !== undefined) {\n const params: unknown = route.defaultParams;\n\n if (\n params === null ||\n typeof params !== \"object\" ||\n Array.isArray(params)\n ) {\n throw new TypeError(\n `[router.addRoute] defaultParams must be an object for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.defaultParams)}`,\n );\n }\n }\n\n // Validate decodeParams is not async (sync required for matchPath/buildPath)\n if (route.decodeParams?.constructor.name === \"AsyncFunction\") {\n throw new TypeError(\n `[router.addRoute] decodeParams cannot be async for route \"${fullName}\". Async functions break matchPath/buildPath.`,\n );\n }\n\n // Validate encodeParams is not async (sync required for matchPath/buildPath)\n if (route.encodeParams?.constructor.name === \"AsyncFunction\") {\n throw new TypeError(\n `[router.addRoute] encodeParams cannot be async for route \"${fullName}\". Async functions break matchPath/buildPath.`,\n );\n }\n\n // Validate forwardTo type and async\n validateForwardToProperty(route.forwardTo, fullName);\n\n // Recursively validate children\n if (route.children) {\n for (const child of route.children) {\n const childFullName = `${fullName}.${child.name}`;\n\n validateRouteProperties(child, childFullName);\n }\n }\n}\n\n// ============================================================================\n// ForwardTo Validation\n// ============================================================================\n\n/**\n * Extracts parameter names from a path string.\n * Matches :param and *splat patterns.\n */\nfunction extractParamsFromPath(path: string): Set<string> {\n const params = new Set<string>();\n const paramRegex = /[*:]([A-Z_a-z]\\w*)/g;\n let match;\n\n while ((match = paramRegex.exec(path)) !== null) {\n params.add(match[1]);\n }\n\n return params;\n}\n\n/**\n * Extracts all parameters from multiple path segments.\n */\nfunction extractParamsFromPaths(paths: readonly string[]): Set<string> {\n const params = new Set<string>();\n\n for (const path of paths) {\n for (const param of extractParamsFromPath(path)) {\n params.add(param);\n }\n }\n\n return params;\n}\n\n/**\n * Collects all path segments for a route from batch definitions.\n * Traverses parent routes to include inherited path segments.\n */\nfunction collectPathsToRoute<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n routeName: string,\n parentName = \"\",\n paths: string[] = [],\n): string[] {\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n const currentPaths = [...paths, route.path];\n\n if (fullName === routeName) {\n return currentPaths;\n }\n\n if (route.children && routeName.startsWith(`${fullName}.`)) {\n return collectPathsToRoute(\n route.children,\n routeName,\n fullName,\n currentPaths,\n );\n }\n }\n\n /* v8 ignore next -- @preserve unreachable: callers validate existence */\n throw new Error(\n `[internal] collectPathsToRoute: route \"${routeName}\" not found`,\n );\n}\n\n/**\n * Collects all route names from a batch of routes (including children).\n */\nfunction collectRouteNames<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n): Set<string> {\n const names = new Set<string>();\n\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n names.add(fullName);\n\n if (route.children) {\n for (const childName of collectRouteNames(route.children, fullName)) {\n names.add(childName);\n }\n }\n }\n\n return names;\n}\n\n/**\n * Collects all forwardTo mappings from a batch of routes (including children).\n * Only collects string forwardTo values; callbacks are handled separately.\n */\nfunction collectForwardMappings<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n): Map<string, string> {\n const mappings = new Map<string, string>();\n\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n if (route.forwardTo && typeof route.forwardTo === \"string\") {\n mappings.set(fullName, route.forwardTo);\n }\n\n if (route.children) {\n for (const [key, value] of collectForwardMappings(\n route.children,\n fullName,\n )) {\n mappings.set(key, value);\n }\n }\n }\n\n return mappings;\n}\n\n/**\n * Extracts required path parameters from route segments.\n */\nfunction getRequiredParams(segments: readonly RouteTree[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n // Named routes always have parsers (null only for root without path)\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n\n for (const param of segment.paramMeta.spatParams) {\n params.add(param);\n }\n }\n\n return params;\n}\n\n/**\n * Checks if a route exists in the tree by navigating through children Map.\n */\nfunction routeExistsInTree(tree: RouteTree, routeName: string): boolean {\n const segments = routeName.split(\".\");\n let current: RouteTree | undefined = tree;\n\n for (const segment of segments) {\n current = current.children.get(segment);\n\n if (!current) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Gets the target route parameters for validation.\n */\nfunction getTargetParams<Dependencies extends DefaultDependencies>(\n targetRoute: string,\n existsInTree: boolean,\n tree: RouteTree,\n routes: readonly Route<Dependencies>[],\n): Set<string> {\n if (existsInTree) {\n const toSegments = getSegmentsByName(tree, targetRoute);\n\n // toSegments won't be null since we checked existsInTree\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return getRequiredParams(toSegments!);\n }\n\n // Target is in batch\n return extractParamsFromPaths(collectPathsToRoute(routes, targetRoute));\n}\n\n/**\n * Validates a single forward mapping for target existence and param compatibility.\n */\nfunction validateSingleForward<Dependencies extends DefaultDependencies>(\n fromRoute: string,\n targetRoute: string,\n routes: readonly Route<Dependencies>[],\n batchNames: Set<string>,\n tree: RouteTree,\n): void {\n const existsInTree = routeExistsInTree(tree, targetRoute);\n const existsInBatch = batchNames.has(targetRoute);\n\n if (!existsInTree && !existsInBatch) {\n throw new Error(\n `[router.addRoute] forwardTo target \"${targetRoute}\" does not exist ` +\n `for route \"${fromRoute}\"`,\n );\n }\n\n // Get source params\n const fromParams = extractParamsFromPaths(\n collectPathsToRoute(routes, fromRoute),\n );\n\n // Get target params\n const toParams = getTargetParams(targetRoute, existsInTree, tree, routes);\n\n // Check for missing params\n const missingParams = [...toParams].filter((p) => !fromParams.has(p));\n\n if (missingParams.length > 0) {\n throw new Error(\n `[router.addRoute] forwardTo target \"${targetRoute}\" requires params ` +\n `[${missingParams.join(\", \")}] that are not available in source route \"${fromRoute}\"`,\n );\n }\n}\n\n/**\n * Resolves a forwardTo chain to its final destination.\n * Detects cycles and enforces max depth.\n */\nexport function resolveForwardChain(\n startRoute: string,\n forwardMap: Record<string, string>,\n maxDepth = 100,\n): string {\n const visited = new Set<string>();\n const chain: string[] = [startRoute];\n let current = startRoute;\n\n while (forwardMap[current]) {\n const next = forwardMap[current];\n\n if (visited.has(next)) {\n const cycleStart = chain.indexOf(next);\n const cycle = [...chain.slice(cycleStart), next];\n\n throw new Error(`Circular forwardTo: ${cycle.join(\" → \")}`);\n }\n\n visited.add(current);\n chain.push(next);\n current = next;\n\n if (chain.length > maxDepth) {\n throw new Error(\n `forwardTo chain exceeds maximum depth (${maxDepth}): ${chain.join(\" → \")}`,\n );\n }\n }\n\n return current;\n}\n\n/**\n * Validates forwardTo targets and cycles BEFORE any modifications.\n * This ensures atomicity - if validation fails, no routes are added.\n *\n * @param routes - Routes to validate\n * @param existingForwardMap - Current forwardMap from router.config\n * @param tree - Current route tree\n *\n * @throws {Error} If forwardTo target doesn't exist\n * @throws {Error} If circular forwardTo is detected\n */\nexport function validateForwardToTargets<\n Dependencies extends DefaultDependencies,\n>(\n routes: readonly Route<Dependencies>[],\n existingForwardMap: Record<string, string>,\n tree: RouteTree,\n): void {\n const batchNames = collectRouteNames(routes);\n const batchForwards = collectForwardMappings(routes);\n\n // Merge with existing forwardMap for cycle detection\n const combinedForwardMap: Record<string, string> = { ...existingForwardMap };\n\n for (const [from, to] of batchForwards) {\n combinedForwardMap[from] = to;\n }\n\n // Validate each forwardTo target exists and params are compatible\n for (const [fromRoute, targetRoute] of batchForwards) {\n validateSingleForward(fromRoute, targetRoute, routes, batchNames, tree);\n }\n\n // Check for cycles in the combined forwardMap\n for (const fromRoute of Object.keys(combinedForwardMap)) {\n resolveForwardChain(fromRoute, combinedForwardMap);\n }\n}\n","// packages/real-router/modules/core/stateBuilder.ts\n\n/**\n * State Builder Utilities.\n *\n * Functions for building RouteTreeState from raw route segments.\n * This module handles the conversion from low-level route-node data\n * to the higher-level state representation used by real-router.\n *\n * @module core/stateBuilder\n */\n\nimport type { RouteParams, RouteTreeState } from \"route-tree\";\n\n/**\n * Builds a dot-separated route name from segments.\n *\n * @param segments - Array of route segments with names\n * @returns Dot-separated route name (e.g., \"users.profile\")\n *\n * @example\n * ```typescript\n * const segments = [{ name: \"users\" }, { name: \"profile\" }];\n * buildNameFromSegments(segments); // \"users.profile\"\n * ```\n */\nexport function buildNameFromSegments(\n segments: readonly { fullName: string }[],\n): string {\n return segments.at(-1)?.fullName ?? \"\";\n}\n\n/**\n * Creates a RouteTreeState from a match result.\n *\n * This function is the primary way to build a RouteTreeState when\n * you have a result from matcher.match().\n *\n * @param matchResult - Result from matcher.match() containing segments and params\n * @param matchResult.segments - Matched route segments\n * @param matchResult.params - Matched route params\n * @param matchResult.meta - Matched route meta\n * @param name - Optional explicit name (if not provided, built from segments)\n * @returns RouteTreeState with name, params, and meta\n *\n * @example\n * ```typescript\n * const matchResult = matcher.match(\"/users/123\");\n * if (matchResult) {\n * const state = createRouteState(matchResult);\n * // { name: \"users.profile\", params: { id: \"123\" }, meta: {...} }\n * }\n * ```\n */\nexport function createRouteState<P extends RouteParams = RouteParams>(\n matchResult: {\n readonly segments: readonly { fullName: string }[];\n readonly params: Readonly<Record<string, unknown>>;\n readonly meta: Readonly<Record<string, Record<string, \"url\" | \"query\">>>;\n },\n name?: string,\n): RouteTreeState<P> {\n const resolvedName = name ?? buildNameFromSegments(matchResult.segments);\n\n return {\n name: resolvedName,\n params: matchResult.params as P,\n meta: matchResult.meta as Record<string, Record<string, \"url\" | \"query\">>,\n };\n}\n","// packages/core/src/namespaces/RoutesNamespace/validators.ts\n\n/**\n * Static validation functions for RoutesNamespace.\n * Called by Router facade before instance methods.\n *\n * Extracted from RoutesNamespace class for better separation of concerns.\n */\n\nimport { validateRoute } from \"route-tree\";\nimport {\n isString,\n validateRouteName,\n isParams,\n getTypeDescription,\n} from \"type-guards\";\n\nimport { validateRouteProperties, validateForwardToTargets } from \"./helpers\";\n\nimport type { Route, RouteConfigUpdate } from \"../../types\";\nimport type { DefaultDependencies } from \"@real-router/types\";\nimport type { RouteTree } from \"route-tree\";\n\n/**\n * Validates removeRoute arguments.\n */\nexport function validateRemoveRouteArgs(name: unknown): asserts name is string {\n validateRouteName(name, \"removeRoute\");\n}\n\n/**\n * Validates setRootPath arguments.\n */\nexport function validateSetRootPathArgs(\n rootPath: unknown,\n): asserts rootPath is string {\n if (typeof rootPath !== \"string\") {\n throw new TypeError(\n `[router.setRootPath] rootPath must be a string, got ${getTypeDescription(rootPath)}`,\n );\n }\n}\n\n/**\n * Validates addRoute arguments (route structure and properties).\n * State-dependent validation (duplicates, tree) happens in instance method.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Route type\nexport function validateAddRouteArgs(routes: readonly Route<any>[]): void {\n for (const route of routes) {\n // First check if route is an object (before accessing route.name)\n // Runtime check for invalid types passed via `as any`\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime check\n if (route === null || typeof route !== \"object\" || Array.isArray(route)) {\n throw new TypeError(\n `[router.addRoute] Route must be an object, got ${getTypeDescription(route)}`,\n );\n }\n\n // Validate route properties (canActivate, canDeactivate, defaultParams, async checks)\n // Note: validateRouteProperties handles children recursively\n validateRouteProperties(route, route.name);\n }\n}\n\n/**\n * Validates parent option for addRoute.\n */\nexport function validateParentOption(\n parent: unknown,\n): asserts parent is string {\n if (typeof parent !== \"string\" || parent === \"\") {\n throw new TypeError(\n `[router.addRoute] parent option must be a non-empty string, got ${getTypeDescription(parent)}`,\n );\n }\n\n // Validate parent is a valid route name format (can contain dots — it's a fullName reference)\n validateRouteName(parent, \"addRoute\");\n}\n\n/**\n * Validates isActiveRoute arguments.\n */\nexport function validateIsActiveRouteArgs(\n name: unknown,\n params: unknown,\n strictEquality: unknown,\n ignoreQueryParams: unknown,\n): void {\n // Validate name - non-string throws\n if (!isString(name)) {\n throw new TypeError(`Route name must be a string`);\n }\n\n // Validate params if provided\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(`[router.isActiveRoute] Invalid params structure`);\n }\n\n // Validate strictEquality if provided\n if (strictEquality !== undefined && typeof strictEquality !== \"boolean\") {\n throw new TypeError(\n `[router.isActiveRoute] strictEquality must be a boolean, got ${typeof strictEquality}`,\n );\n }\n\n // Validate ignoreQueryParams if provided\n if (\n ignoreQueryParams !== undefined &&\n typeof ignoreQueryParams !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.isActiveRoute] ignoreQueryParams must be a boolean, got ${typeof ignoreQueryParams}`,\n );\n }\n}\n\n/**\n * Validates forwardState/buildState arguments.\n */\nexport function validateStateBuilderArgs(\n routeName: unknown,\n routeParams: unknown,\n methodName: string,\n): void {\n if (!isString(routeName)) {\n throw new TypeError(\n `[router.${methodName}] Invalid routeName: ${getTypeDescription(routeName)}. Expected string.`,\n );\n }\n\n if (!isParams(routeParams)) {\n throw new TypeError(\n `[router.${methodName}] Invalid routeParams: ${getTypeDescription(routeParams)}. Expected plain object.`,\n );\n }\n}\n\n/**\n * Validates updateRoute basic arguments (name and updates object structure).\n * Does NOT read property values to allow caller to cache them first.\n */\nexport function validateUpdateRouteBasicArgs<\n Dependencies extends DefaultDependencies,\n>(\n name: unknown,\n updates: unknown,\n): asserts updates is RouteConfigUpdate<Dependencies> {\n // Validate name\n validateRouteName(name, \"updateRoute\");\n\n if (name === \"\") {\n throw new ReferenceError(\n `[router.updateRoute] Invalid name: empty string. Cannot update root node.`,\n );\n }\n\n // Validate updates is not null\n\n if (updates === null) {\n throw new TypeError(\n `[real-router] updateRoute: updates must be an object, got null`,\n );\n }\n\n // Validate updates is an object (not array)\n if (typeof updates !== \"object\" || Array.isArray(updates)) {\n throw new TypeError(\n `[real-router] updateRoute: updates must be an object, got ${getTypeDescription(updates)}`,\n );\n }\n}\n\n/**\n * Asserts that a function is not async (native or transpiled).\n * Checks both constructor name and toString() for __awaiter pattern.\n */\n/* v8 ignore next 12 -- @preserve: transpiled async (__awaiter) branch tested in addRoute */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type -- needs constructor.name access\nfunction assertNotAsync(value: Function, paramName: string): void {\n if (\n (value as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\" ||\n (value as { toString: () => string }).toString().includes(\"__awaiter\")\n ) {\n throw new TypeError(\n `[real-router] updateRoute: ${paramName} cannot be an async function`,\n );\n }\n}\n\n/**\n * Validates that a value is a non-async function, if provided.\n */\nfunction validateFunctionParam(value: unknown, paramName: string): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (typeof value !== \"function\") {\n throw new TypeError(\n `[real-router] updateRoute: ${paramName} must be a function or null, got ${typeof value}`,\n );\n }\n\n assertNotAsync(value, paramName);\n}\n\n/**\n * Validates updateRoute property types using pre-cached values.\n * Called AFTER properties are cached to ensure getters are called only once.\n */\nexport function validateUpdateRoutePropertyTypes(\n forwardTo: unknown,\n defaultParams: unknown,\n decodeParams: unknown,\n encodeParams: unknown,\n): void {\n // Validate forwardTo type (existence check is done by instance method)\n if (forwardTo !== undefined && forwardTo !== null) {\n if (typeof forwardTo !== \"string\" && typeof forwardTo !== \"function\") {\n throw new TypeError(\n `[real-router] updateRoute: forwardTo must be a string, function, or null, got ${getTypeDescription(forwardTo)}`,\n );\n }\n\n if (typeof forwardTo === \"function\") {\n assertNotAsync(forwardTo, \"forwardTo callback\");\n }\n }\n\n // Validate defaultParams\n if (\n defaultParams !== undefined &&\n defaultParams !== null &&\n (typeof defaultParams !== \"object\" || Array.isArray(defaultParams))\n ) {\n throw new TypeError(\n `[real-router] updateRoute: defaultParams must be an object or null, got ${getTypeDescription(defaultParams)}`,\n );\n }\n\n validateFunctionParam(decodeParams, \"decodeParams\");\n validateFunctionParam(encodeParams, \"encodeParams\");\n}\n\n/**\n * Validates buildPath arguments.\n */\nexport function validateBuildPathArgs(route: unknown): asserts route is string {\n if (!isString(route) || route === \"\") {\n throw new TypeError(\n `[real-router] buildPath: route must be a non-empty string, got ${typeof route === \"string\" ? '\"\"' : typeof route}`,\n );\n }\n}\n\n/**\n * Validates matchPath arguments.\n */\nexport function validateMatchPathArgs(path: unknown): asserts path is string {\n if (!isString(path)) {\n throw new TypeError(\n `[real-router] matchPath: path must be a string, got ${typeof path}`,\n );\n }\n}\n\n/**\n * Validates shouldUpdateNode arguments.\n */\nexport function validateShouldUpdateNodeArgs(\n nodeName: unknown,\n): asserts nodeName is string {\n if (!isString(nodeName)) {\n throw new TypeError(\n `[router.shouldUpdateNode] nodeName must be a string, got ${typeof nodeName}`,\n );\n }\n}\n\n/**\n * Validates routes for addition to the router.\n * Checks parent existence, duplicates, and forwardTo targets/cycles.\n *\n * @param routes - Routes to validate\n * @param tree - Current route tree (optional for initial validation)\n * @param forwardMap - Current forward map for cycle detection\n * @param parentName - Optional parent route fullName for nesting via addRoute({ parent })\n */\nexport function validateRoutes<Dependencies extends DefaultDependencies>(\n routes: Route<Dependencies>[],\n tree?: RouteTree,\n forwardMap?: Record<string, string>,\n parentName?: string,\n): void {\n // Validate parent route exists in tree\n if (parentName && tree) {\n let node: RouteTree | undefined = tree;\n\n for (const segment of parentName.split(\".\")) {\n node = node.children.get(segment);\n\n if (!node) {\n throw new Error(\n `[router.addRoute] Parent route \"${parentName}\" does not exist`,\n );\n }\n }\n }\n\n // Tracking sets for duplicate detection\n const seenNames = new Set<string>();\n const seenPathsByParent = new Map<string, Set<string>>();\n\n for (const route of routes) {\n validateRoute(\n route,\n \"addRoute\",\n tree,\n parentName ?? \"\",\n seenNames,\n seenPathsByParent,\n );\n }\n\n if (tree && forwardMap) {\n validateForwardToTargets(routes, forwardMap, tree);\n }\n}\n","// packages/real-router/modules/transitionPath.ts\n\nimport type { Params, State } from \"@real-router/types\";\n\n/**\n * Parameters extracted from a route segment.\n * Maps parameter names to their string values.\n */\ntype SegmentParams = Record<string, string>;\n\n/**\n * Represents a transition path between two router states.\n * Contains information about which route segments need to be activated/deactivated.\n */\ninterface TransitionPath {\n /** The common ancestor route segment where paths diverge */\n intersection: string;\n /** Route segments that need to be deactivated (in reverse order) */\n toDeactivate: string[];\n /** Route segments that need to be activated (in order) */\n toActivate: string[];\n}\n\n// Constants for better maintainability\nconst ROUTE_SEGMENT_SEPARATOR = \".\";\nconst EMPTY_INTERSECTION = \"\";\nconst DEFAULT_ROUTE_NAME = \"\";\n\n/**\n * Builds a reversed copy of a string array.\n * Optimization: single pass instead of creating intermediate array with .toReversed().\n *\n * @param arr - Source array\n * @returns New array with elements in reverse order\n * @internal\n */\nfunction reverseArray(arr: string[]): string[] {\n const len = arr.length;\n const result: string[] = [];\n\n for (let i = len - 1; i >= 0; i--) {\n result.push(arr[i]);\n }\n\n return result;\n}\n\n/**\n * Handles conversion of route names with many segments (5+).\n * Internal helper for nameToIDs function.\n *\n * Uses optimized hybrid approach: split to get segments, then slice original\n * string to build cumulative paths. This approach is 65-81% faster than\n * string concatenation for typical cases (5-10 segments).\n *\n * @param name - Route name with 5 or more segments\n * @returns Array of cumulative segment IDs\n * @throws {Error} If route depth exceeds maximum allowed\n * @internal\n */\nfunction nameToIDsGeneral(name: string): string[] {\n // We know there are at least 5 segments at this point (after fast paths)\n const segments = name.split(ROUTE_SEGMENT_SEPARATOR);\n const segmentCount = segments.length;\n\n // First segment is always just itself\n const ids: string[] = [segments[0]];\n\n // Calculate cumulative lengths and slice from original string\n // This avoids repeated string concatenation (O(k²) → O(k))\n let cumulativeLen = segments[0].length;\n\n for (let i = 1; i < segmentCount - 1; i++) {\n cumulativeLen += 1 + segments[i].length; // +1 for dot separator\n ids.push(name.slice(0, cumulativeLen));\n }\n\n // Last segment is always the full route name\n ids.push(name);\n\n return ids;\n}\n\n/**\n * Extracts segment-specific parameters from a state object.\n * Only includes parameters that are valid for serialization (primitives).\n *\n * @param name - Segment name to extract parameters for\n * @param state - State containing the parameters\n * @returns Object with extracted segment parameters\n */\nfunction extractSegmentParams(name: string, state: State): SegmentParams {\n const keys = state.meta?.params[name];\n\n // No parameters defined for this segment\n if (!keys || typeof keys !== \"object\") {\n return {};\n }\n\n const result: SegmentParams = {};\n\n for (const key in keys as Params) {\n // Skip inherited properties\n if (!Object.hasOwn(keys, key)) {\n continue;\n }\n\n // Skip undefined values for consistent behavior (treat { key: undefined } same as missing key)\n // Edge case: can appear from manual State creation or object merging\n // @ts-expect-error Params type doesn't allow undefined, but it can appear at runtime\n if (keys[key] === undefined) {\n continue;\n }\n\n const value = state.params[key];\n\n // Skip null/undefined values\n if (value == null) {\n continue;\n }\n\n // Only include primitives in segment params comparison.\n // Complex types (arrays, nested objects) are handled by query param serialization.\n // Note: symbol/function/bigint are rejected by isParams validation before reaching this code.\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n result[key] = String(value);\n }\n // Complex types silently skipped - they're serialized as query params elsewhere\n }\n\n return result;\n}\n\n/**\n * Finds the point where two state paths diverge based on segments and parameters.\n * Compares both segment names and their parameters to find the first difference.\n *\n * @param toState - Target state\n * @param fromState - Source state\n * @param toStateIds - Segment IDs for target state\n * @param fromStateIds - Segment IDs for source state\n * @param maxI - Maximum index to check (minimum of both arrays)\n * @returns Index of first difference, or maxI if all checked segments match\n */\nfunction pointOfDifference(\n toState: State,\n fromState: State,\n toStateIds: string[],\n fromStateIds: string[],\n maxI: number,\n): number {\n for (let i = 0; i < maxI; i++) {\n const toSegment = toStateIds[i];\n const fromSegment = fromStateIds[i];\n\n // Different segment names - immediate difference\n if (toSegment !== fromSegment) {\n return i;\n }\n\n // Same segment name - check parameters\n const toParams = extractSegmentParams(toSegment, toState);\n const fromParams = extractSegmentParams(fromSegment, fromState);\n\n // Fast check: different number of parameters\n const toKeys = Object.keys(toParams);\n const fromKeys = Object.keys(fromParams);\n\n if (toKeys.length !== fromKeys.length) {\n return i;\n }\n\n // Detailed check: compare parameter values\n for (const key of toKeys) {\n if (toParams[key] !== fromParams[key]) {\n return i;\n }\n }\n }\n\n return maxI;\n}\n\n/**\n * Converts a route name to an array of hierarchical segment identifiers.\n * Each segment ID includes all parent segments in the path.\n *\n * @param name - Route name in dot notation (e.g., 'users.profile.edit')\n * @returns Array of cumulative segment IDs\n * @throws {Error} If route depth exceeds maximum allowed depth\n *\n * @example\n * // Simple route\n * nameToIDs('users');\n * // Returns: ['users']\n *\n * @example\n * // Nested route\n * nameToIDs('users.profile.edit');\n * // Returns: ['users', 'users.profile', 'users.profile.edit']\n *\n * @example\n * // Empty string (root route)\n * nameToIDs('');\n * // Returns: ['']\n *\n * @remarks\n * Input parameter is NOT validated in this function for performance reasons.\n * Validation significantly slows down nameToIDs execution.\n * The input should be validated by the function/method that calls nameToIDs.\n */\nexport function nameToIDs(name: string): string[] {\n // ===== FAST PATH 1: Empty string (root route) =====\n // Most common in initial navigation\n if (!name) {\n return [DEFAULT_ROUTE_NAME];\n }\n\n // ===== FAST PATH 2: Single segment (no dots) =====\n // Very common: 'home', 'users', 'settings', etc.\n const firstDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR);\n\n if (firstDot === -1) {\n return [name];\n }\n\n // ===== FAST PATH 3: Two segments =====\n // Common: 'users.list', 'admin.dashboard', etc.\n const secondDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR, firstDot + 1);\n\n if (secondDot === -1) {\n return [\n name.slice(0, firstDot), // 'users'\n name, // 'users.list'\n ];\n }\n\n // ===== FAST PATH 4: Three segments =====\n // Common: 'users.profile.edit', 'app.settings.general', etc.\n const thirdDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR, secondDot + 1);\n\n if (thirdDot === -1) {\n return [\n name.slice(0, firstDot), // 'users'\n name.slice(0, secondDot), // 'users.profile'\n name, // 'users.profile.edit'\n ];\n }\n\n // ===== FAST PATH 5: Four segments =====\n const fourthDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR, thirdDot + 1);\n\n if (fourthDot === -1) {\n return [\n name.slice(0, firstDot),\n name.slice(0, secondDot),\n name.slice(0, thirdDot),\n name,\n ];\n }\n\n // ===== STANDARD PATH: 5+ segments =====\n // Less common, use general algorithm with optimizations\n return nameToIDsGeneral(name);\n}\n\n/**\n * Calculates the transition path between two router states.\n * Determines which route segments need to be deactivated and activated\n * to transition from one state to another.\n *\n * @param toState - Target state to transition to\n * @param fromState - Current state to transition from (optional)\n * @returns Transition path with intersection and segments to activate/deactivate\n *\n * @throws {TypeError} When toState is null or undefined\n * @throws {TypeError} When toState is not an object\n * @throws {TypeError} When toState.name is missing or not a string\n * @throws {TypeError} When toState.params is missing or not an object\n * @throws {TypeError} When toState.path is missing or not a string\n * @throws {TypeError} When toState.name contains invalid route format:\n * - Contains only whitespace (e.g., \" \")\n * - Has consecutive dots (e.g., \"users..profile\")\n * - Has leading/trailing dots (e.g., \".users\" or \"users.\")\n * - Segments don't match pattern [a-zA-Z_][a-zA-Z0-9_-]* (e.g., \"users.123\")\n * - Contains spaces or special characters (e.g., \"users profile\")\n * - Exceeds maximum length (8192 characters)\n * @throws {TypeError} When fromState is provided and has any of the validation errors listed above for toState\n *\n * @example\n * // ✅ Valid calls\n * getTransitionPath({ name: 'users.profile', params: {}, path: '/users/profile' });\n * getTransitionPath(toState, fromState);\n * getTransitionPath({ name: '', params: {}, path: '/' }); // root route\n *\n * @example\n * // ❌ Invalid calls that throw TypeError\n * getTransitionPath(null); // toState is null\n * getTransitionPath(undefined); // toState is undefined\n * getTransitionPath({}); // missing required fields\n * getTransitionPath({ name: 123, params: {}, path: '/' }); // name not a string\n * getTransitionPath({ name: 'home', path: '/' }); // missing params\n * getTransitionPath({ name: 'users..profile', params: {}, path: '/' }); // consecutive dots\n * getTransitionPath({ name: '.users', params: {}, path: '/' }); // leading dot\n * getTransitionPath({ name: 'users.', params: {}, path: '/' }); // trailing dot\n * getTransitionPath({ name: 'users profile', params: {}, path: '/' }); // contains space\n * getTransitionPath({ name: 'users.123', params: {}, path: '/' }); // segment starts with number\n * getTransitionPath(validToState, { name: 'invalid..route', params: {}, path: '/' }); // fromState invalid\n *\n * @example\n * // Full activation (no fromState)\n * getTransitionPath(makeState('users.profile'));\n * // Returns: {\n * // intersection: '',\n * // toActivate: ['users', 'users.profile'],\n * // toDeactivate: []\n * // }\n *\n * @example\n * // Partial transition with common ancestor\n * getTransitionPath(\n * makeState('users.profile'),\n * makeState('users.list')\n * );\n * // Returns: {\n * // intersection: 'users',\n * // toActivate: ['users.profile'],\n * // toDeactivate: ['users.list']\n * // }\n *\n * @example\n * // Complete route change\n * getTransitionPath(\n * makeState('admin.dashboard'),\n * makeState('users.profile')\n * );\n * // Returns: {\n * // intersection: '',\n * // toActivate: ['admin', 'admin.dashboard'],\n * // toDeactivate: ['users.profile', 'users']\n * // }\n */\nexport function getTransitionPath(\n toState: State,\n fromState?: State,\n): TransitionPath {\n // ===== FAST PATH 1: Initial navigation (no fromState) =====\n // This is the best performing case in benchmarks (5M ops/sec)\n if (!fromState) {\n return {\n intersection: EMPTY_INTERSECTION,\n toActivate: nameToIDs(toState.name),\n toDeactivate: [],\n };\n }\n\n const toStateOptions = toState.meta?.options ?? {};\n\n // ===== FAST PATH 2: Force reload =====\n // Skip all optimization when reload is requested\n if (toStateOptions.reload) {\n return {\n intersection: EMPTY_INTERSECTION,\n toActivate: nameToIDs(toState.name),\n toDeactivate: reverseArray(nameToIDs(fromState.name)),\n };\n }\n\n // ===== FAST PATH 3: Missing meta or meta.params requires full reload =====\n // Check if meta or meta.params is actually missing (not just empty)\n const toHasMeta = toState.meta?.params !== undefined;\n const fromHasMeta = fromState.meta?.params !== undefined;\n\n if (!toHasMeta && !fromHasMeta) {\n // Both states missing meta.params - require full reload\n return {\n intersection: EMPTY_INTERSECTION,\n toActivate: nameToIDs(toState.name),\n toDeactivate: reverseArray(nameToIDs(fromState.name)),\n };\n }\n\n // ===== FAST PATH 4: Same routes with empty meta.params =====\n // If both have empty meta.params {}, no parameter checking needed\n if (toState.name === fromState.name && toHasMeta && fromHasMeta) {\n const toParamsEmpty =\n toState.meta && Object.keys(toState.meta.params).length === 0;\n const fromParamsEmpty =\n fromState.meta && Object.keys(fromState.meta.params).length === 0;\n\n if (toParamsEmpty && fromParamsEmpty) {\n // Both have empty params - no transition needed\n return {\n intersection: toState.name,\n toActivate: [],\n toDeactivate: [],\n };\n }\n }\n\n // ===== STANDARD PATH: Routes with parameters =====\n // Use original algorithm for complex cases with parameters\n const toStateIds = nameToIDs(toState.name);\n const fromStateIds = nameToIDs(fromState.name);\n const maxI = Math.min(fromStateIds.length, toStateIds.length);\n\n // Find where paths diverge based on segments and parameters\n // not obvious validate toState and fromState\n const i = pointOfDifference(\n toState,\n fromState,\n toStateIds,\n fromStateIds,\n maxI,\n );\n\n // Optimization: Build deactivation list in reverse order directly\n // instead of slice(i).toReversed() which creates 2 arrays\n const toDeactivate: string[] = [];\n\n for (let j = fromStateIds.length - 1; j >= i; j--) {\n toDeactivate.push(fromStateIds[j]);\n }\n\n // Build activation list (forward order for proper initialization)\n const toActivate = toStateIds.slice(i);\n\n // Determine intersection point (common ancestor)\n // Note: fromState is guaranteed to be defined here (early return on line 366)\n const intersection = i > 0 ? fromStateIds[i - 1] : EMPTY_INTERSECTION;\n\n return {\n intersection,\n toDeactivate,\n toActivate,\n };\n}\n","// packages/core/src/namespaces/RoutesNamespace/RoutesNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\nimport {\n createMatcher,\n createRouteTree,\n nodeToDefinition,\n routeTreeToDefinitions,\n} from \"route-tree\";\nimport { isString, validateRouteName } from \"type-guards\";\n\nimport { DEFAULT_ROUTE_NAME, validatedRouteNames } from \"./constants\";\nimport {\n clearConfigEntries,\n createEmptyConfig,\n paramsMatch,\n paramsMatchExcluding,\n removeFromDefinitions,\n resolveForwardChain,\n sanitizeRoute,\n} from \"./helpers\";\nimport { createRouteState } from \"./stateBuilder\";\nimport {\n validateRemoveRouteArgs,\n validateSetRootPathArgs,\n validateAddRouteArgs,\n validateParentOption,\n validateIsActiveRouteArgs,\n validateStateBuilderArgs,\n validateUpdateRouteBasicArgs,\n validateUpdateRoutePropertyTypes,\n validateBuildPathArgs,\n validateMatchPathArgs,\n validateShouldUpdateNodeArgs,\n validateRoutes,\n} from \"./validators\";\nimport { constants } from \"../../constants\";\nimport { getTransitionPath } from \"../../transitionPath\";\n\nimport type { RouteConfig, RoutesDependencies } from \"./types\";\nimport type {\n ActivationFnFactory,\n BuildStateResultWithSegments,\n Route,\n RouteConfigUpdate,\n} from \"../../types\";\nimport type { RouteLifecycleNamespace } from \"../RouteLifecycleNamespace\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Options,\n Params,\n State,\n} from \"@real-router/types\";\nimport type {\n CreateMatcherOptions,\n Matcher,\n RouteDefinition,\n RouteTree,\n RouteTreeState,\n} from \"route-tree\";\n\nconst EMPTY_OPTIONS = Object.freeze({});\n\n/**\n * Independent namespace for managing routes.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic.\n */\nexport class RoutesNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n // =========================================================================\n // Private instance fields\n // =========================================================================\n\n readonly #definitions: RouteDefinition[] = [];\n readonly #config: RouteConfig = createEmptyConfig();\n readonly #resolvedForwardMap: Record<string, string> = Object.create(\n null,\n ) as Record<string, string>;\n\n // Pending canActivate handlers that need to be registered after router is set\n // Key: route name, Value: canActivate factory\n readonly #pendingCanActivate = new Map<\n string,\n ActivationFnFactory<Dependencies>\n >();\n\n // Pending canDeactivate handlers that need to be registered after router is set\n // Key: route name, Value: canDeactivate factory\n readonly #pendingCanDeactivate = new Map<\n string,\n ActivationFnFactory<Dependencies>\n >();\n\n #rootPath = \"\";\n #tree: RouteTree;\n #matcher: Matcher;\n readonly #matcherOptions: CreateMatcherOptions | undefined;\n\n // Dependencies injected via setDependencies (for facade method calls)\n #depsStore: RoutesDependencies<Dependencies> | undefined;\n\n // Lifecycle handlers reference (set after construction)\n #lifecycleNamespace!: RouteLifecycleNamespace<Dependencies>;\n\n // When true, skips validation for production performance\n readonly #noValidate: boolean;\n\n /**\n * Gets dependencies or throws if not initialized.\n */\n get #deps(): RoutesDependencies<Dependencies> {\n /* v8 ignore next 3 -- @preserve: defensive guard, unreachable via public API (RouterWiringBuilder always calls setDependencies) */\n if (!this.#depsStore) {\n throw new Error(\n \"[real-router] RoutesNamespace: dependencies not initialized\",\n );\n }\n\n return this.#depsStore;\n }\n\n // =========================================================================\n // Constructor\n // =========================================================================\n\n constructor(\n routes: Route<Dependencies>[] = [],\n noValidate = false,\n matcherOptions?: CreateMatcherOptions,\n ) {\n this.#noValidate = noValidate;\n this.#matcherOptions = matcherOptions;\n\n // Sanitize routes to store only essential properties\n for (const route of routes) {\n this.#definitions.push(sanitizeRoute(route));\n }\n\n // Create initial tree\n this.#tree = createRouteTree(\n DEFAULT_ROUTE_NAME,\n this.#rootPath,\n this.#definitions,\n );\n\n // Initialize matcher with options and register tree\n this.#matcher = createMatcher(matcherOptions);\n this.#matcher.registerTree(this.#tree);\n\n // Register handlers for all routes (defaultParams, encoders, decoders, forwardTo)\n // Note: canActivate handlers are registered later when #lifecycleNamespace is set\n this.#registerAllRouteHandlers(routes);\n\n // Validate and cache forwardTo chains (detect cycles)\n // Skip validation in noValidate mode for production performance\n if (noValidate) {\n // Still need to cache resolved forwards, just skip validation\n this.#cacheForwardMap();\n } else {\n this.#validateAndCacheForwardMap();\n }\n }\n\n // =========================================================================\n // Static validation methods (delegated to validators.ts)\n // TypeScript requires explicit method declarations for assertion functions\n // =========================================================================\n\n static validateRemoveRouteArgs(name: unknown): asserts name is string {\n validateRemoveRouteArgs(name);\n }\n\n static validateSetRootPathArgs(\n rootPath: unknown,\n ): asserts rootPath is string {\n validateSetRootPathArgs(rootPath);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Route type\n static validateAddRouteArgs(routes: readonly Route<any>[]): void {\n validateAddRouteArgs(routes);\n }\n\n static validateParentOption(parent: unknown): asserts parent is string {\n validateParentOption(parent);\n }\n\n static validateIsActiveRouteArgs(\n name: unknown,\n params: unknown,\n strictEquality: unknown,\n ignoreQueryParams: unknown,\n ): void {\n validateIsActiveRouteArgs(name, params, strictEquality, ignoreQueryParams);\n }\n\n static validateStateBuilderArgs(\n routeName: unknown,\n routeParams: unknown,\n methodName: string,\n ): void {\n validateStateBuilderArgs(routeName, routeParams, methodName);\n }\n\n static validateUpdateRouteBasicArgs<Deps extends DefaultDependencies>(\n name: unknown,\n updates: unknown,\n ): asserts updates is RouteConfigUpdate<Deps> {\n validateUpdateRouteBasicArgs<Deps>(name, updates);\n }\n\n static validateUpdateRoutePropertyTypes(\n forwardTo: unknown,\n defaultParams: unknown,\n decodeParams: unknown,\n encodeParams: unknown,\n ): void {\n validateUpdateRoutePropertyTypes(\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n );\n }\n\n static validateBuildPathArgs(route: unknown): asserts route is string {\n validateBuildPathArgs(route);\n }\n\n static validateMatchPathArgs(path: unknown): asserts path is string {\n validateMatchPathArgs(path);\n }\n\n static validateShouldUpdateNodeArgs(\n nodeName: unknown,\n ): asserts nodeName is string {\n validateShouldUpdateNodeArgs(nodeName);\n }\n\n static validateRoutes<Deps extends DefaultDependencies>(\n routes: Route<Deps>[],\n tree?: RouteTree,\n forwardMap?: Record<string, string>,\n parentName?: string,\n ): void {\n validateRoutes(routes, tree, forwardMap, parentName);\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n /**\n * Sets dependencies and registers pending canActivate handlers.\n * canActivate handlers from initial routes are deferred until deps are set.\n */\n setDependencies(deps: RoutesDependencies<Dependencies>): void {\n this.#depsStore = deps;\n\n // Register pending canActivate handlers that were deferred during construction\n for (const [routeName, handler] of this.#pendingCanActivate) {\n deps.addActivateGuard(routeName, handler);\n }\n\n // Clear pending handlers after registration\n this.#pendingCanActivate.clear();\n\n // Register pending canDeactivate handlers that were deferred during construction\n for (const [routeName, handler] of this.#pendingCanDeactivate) {\n deps.addDeactivateGuard(routeName, handler);\n }\n\n // Clear pending handlers after registration\n this.#pendingCanDeactivate.clear();\n }\n\n /**\n * Sets the lifecycle namespace reference.\n */\n setLifecycleNamespace(\n namespace: RouteLifecycleNamespace<Dependencies> | undefined,\n ): void {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#lifecycleNamespace = namespace!;\n }\n\n // =========================================================================\n // Route tree operations\n // =========================================================================\n\n /**\n * Returns the root path.\n */\n getRootPath(): string {\n return this.#rootPath;\n }\n\n /**\n * Returns the route tree.\n * Used by facade for state-dependent validation.\n */\n getTree(): RouteTree {\n return this.#tree;\n }\n\n /**\n * Returns the forward record (route name -> forward target).\n * Used by facade for state-dependent validation.\n */\n getForwardRecord(): Record<string, string> {\n return this.#config.forwardMap;\n }\n\n /**\n * Sets the root path and rebuilds the tree.\n */\n setRootPath(newRootPath: string): void {\n this.#rootPath = newRootPath;\n this.#rebuildTree();\n }\n\n /**\n * Checks if a route exists.\n */\n hasRoute(name: string): boolean {\n return this.#matcher.hasRoute(name);\n }\n\n /**\n * Gets a route by name with all its configuration.\n */\n getRoute(name: string): Route<Dependencies> | undefined {\n const segments = this.#matcher.getSegmentsByName(name);\n\n if (!segments) {\n return undefined;\n }\n\n const targetNode = this.#getLastSegment(segments as readonly RouteTree[]);\n const definition = nodeToDefinition(targetNode);\n\n return this.#enrichRoute(definition, name);\n }\n\n /**\n * Adds one or more routes to the router.\n * Input already validated by facade (properties and state-dependent checks).\n *\n * @param routes - Routes to add\n * @param parentName - Optional parent route fullName for nesting\n */\n addRoutes(routes: Route<Dependencies>[], parentName?: string): void {\n // Add to definitions\n if (parentName) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const parentDef = this.#findDefinition(this.#definitions, parentName)!;\n\n parentDef.children ??= [];\n for (const route of routes) {\n parentDef.children.push(sanitizeRoute(route));\n }\n } else {\n for (const route of routes) {\n this.#definitions.push(sanitizeRoute(route));\n }\n }\n\n // Register handlers\n this.#registerAllRouteHandlers(routes, parentName ?? \"\");\n\n // Rebuild tree\n this.#rebuildTree();\n\n // Validate and cache forwardTo chains\n this.#refreshForwardMap();\n }\n\n /**\n * Removes a route and all its children.\n *\n * @param name - Route name (already validated)\n * @returns true if removed, false if not found\n */\n removeRoute(name: string): boolean {\n const wasRemoved = removeFromDefinitions(this.#definitions, name);\n\n if (!wasRemoved) {\n return false;\n }\n\n // Clear configurations for removed route\n this.#clearRouteConfigurations(name);\n\n // Rebuild tree\n this.#rebuildTree();\n\n // Revalidate forward chains\n this.#refreshForwardMap();\n\n return true;\n }\n\n /**\n * Updates a route's configuration in place without rebuilding the tree.\n * This is used by Router.updateRoute to directly modify config entries\n * without destroying other routes' forwardMap references.\n *\n * @param name - Route name\n * @param updates - Config updates to apply\n * @param updates.forwardTo - Forward target route name (null to clear)\n * @param updates.defaultParams - Default parameters (null to clear)\n * @param updates.decodeParams - Params decoder function (null to clear)\n * @param updates.encodeParams - Params encoder function (null to clear)\n */\n\n updateRouteConfig(\n name: string,\n updates: {\n forwardTo?: string | ForwardToCallback<Dependencies> | null | undefined;\n defaultParams?: Params | null | undefined;\n decodeParams?: ((params: Params) => Params) | null | undefined;\n encodeParams?: ((params: Params) => Params) | null | undefined;\n },\n ): void {\n // Update forwardTo\n if (updates.forwardTo !== undefined) {\n this.#updateForwardTo(name, updates.forwardTo);\n }\n\n // Update defaultParams\n if (updates.defaultParams !== undefined) {\n if (updates.defaultParams === null) {\n delete this.#config.defaultParams[name];\n } else {\n this.#config.defaultParams[name] = updates.defaultParams;\n }\n }\n\n // Update decoders with fallback wrapper\n // Runtime guard: fallback to params if decoder returns undefined (bad user code)\n if (updates.decodeParams !== undefined) {\n if (updates.decodeParams === null) {\n delete this.#config.decoders[name];\n } else {\n const decoder = updates.decodeParams;\n\n this.#config.decoders[name] = (params: Params): Params =>\n (decoder(params) as Params | undefined) ?? params;\n }\n }\n\n // Update encoders with fallback wrapper\n // Runtime guard: fallback to params if encoder returns undefined (bad user code)\n if (updates.encodeParams !== undefined) {\n if (updates.encodeParams === null) {\n delete this.#config.encoders[name];\n } else {\n const encoder = updates.encodeParams;\n\n this.#config.encoders[name] = (params: Params): Params =>\n (encoder(params) as Params | undefined) ?? params;\n }\n }\n }\n\n /**\n * Clears all routes from the router.\n */\n clearRoutes(): void {\n this.#definitions.length = 0;\n\n // Clear all config entries\n for (const key in this.#config.decoders) {\n delete this.#config.decoders[key];\n }\n\n for (const key in this.#config.encoders) {\n delete this.#config.encoders[key];\n }\n\n for (const key in this.#config.defaultParams) {\n delete this.#config.defaultParams[key];\n }\n\n for (const key in this.#config.forwardMap) {\n delete this.#config.forwardMap[key];\n }\n\n for (const key in this.#config.forwardFnMap) {\n delete this.#config.forwardFnMap[key];\n }\n\n // Clear forward cache\n for (const key in this.#resolvedForwardMap) {\n delete this.#resolvedForwardMap[key];\n }\n\n // Rebuild empty tree\n this.#rebuildTree();\n }\n\n // =========================================================================\n // Path operations\n // =========================================================================\n\n /**\n * Builds a URL path for a route.\n * Note: Argument validation is done by facade (Router.ts) via validateBuildPathArgs.\n *\n * @param route - Route name\n * @param params - Route parameters\n * @param options - Router options\n */\n buildPath(route: string, params?: Params, options?: Options): string {\n if (route === constants.UNKNOWN_ROUTE) {\n return isString(params?.path) ? params.path : \"\";\n }\n\n // R2 optimization: avoid spread when no defaultParams\n const paramsWithDefault = Object.hasOwn(this.#config.defaultParams, route)\n ? { ...this.#config.defaultParams[route], ...params }\n : (params ?? {});\n\n // Apply custom encoder if defined\n const encodedParams =\n typeof this.#config.encoders[route] === \"function\"\n ? this.#config.encoders[route]({ ...paramsWithDefault })\n : paramsWithDefault;\n\n // Map core trailingSlash to matcher: \"preserve\"/\"strict\" → default (no change)\n const ts = options?.trailingSlash;\n const trailingSlash = ts === \"never\" || ts === \"always\" ? ts : undefined;\n\n return this.#matcher.buildPath(route, encodedParams, {\n trailingSlash,\n queryParamsMode: options?.queryParamsMode,\n });\n }\n\n /**\n * Matches a URL path to a route in the tree.\n * Note: Argument validation is done by facade (Router.ts) via validateMatchPathArgs.\n */\n matchPath<P extends Params = Params, MP extends Params = Params>(\n path: string,\n source?: string,\n options?: Options,\n ): State<P, MP> | undefined {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Router.ts always passes options\n const opts = options!;\n\n const matchResult = this.#matcher.match(path);\n\n if (!matchResult) {\n return undefined;\n }\n\n const routeState = createRouteState(matchResult);\n const { name, params, meta } = routeState;\n\n const decodedParams =\n typeof this.#config.decoders[name] === \"function\"\n ? this.#config.decoders[name](params as Params)\n : params;\n\n const { name: routeName, params: routeParams } = this.#deps.forwardState<P>(\n name,\n decodedParams as P,\n );\n\n let builtPath = path;\n\n if (opts.rewritePathOnMatch) {\n const buildParams =\n typeof this.#config.encoders[routeName] === \"function\"\n ? this.#config.encoders[routeName]({\n ...(routeParams as Params),\n })\n : (routeParams as Record<string, unknown>);\n\n const ts = opts.trailingSlash;\n\n builtPath = this.#matcher.buildPath(routeName, buildParams, {\n trailingSlash: ts === \"never\" || ts === \"always\" ? ts : undefined,\n queryParamsMode: opts.queryParamsMode,\n });\n }\n\n return this.#deps.makeState<P, MP>(routeName, routeParams, builtPath, {\n params: meta as MP,\n options: EMPTY_OPTIONS,\n source,\n redirected: false,\n });\n }\n\n /**\n * Applies forwardTo and returns resolved state with merged defaultParams.\n *\n * Merges params in order:\n * 1. Source route defaultParams\n * 2. Provided params\n * 3. Target route defaultParams (after resolving forwardTo)\n */\n forwardState<P extends Params = Params>(\n name: string,\n params: P,\n ): { name: string; params: P } {\n // Path 1: Dynamic forward\n if (Object.hasOwn(this.#config.forwardFnMap, name)) {\n const paramsWithSourceDefaults = this.#mergeDefaultParams(name, params);\n const dynamicForward = this.#config.forwardFnMap[name];\n const resolved = this.#resolveDynamicForward(\n name,\n dynamicForward,\n params,\n );\n\n return {\n name: resolved,\n params: this.#mergeDefaultParams(resolved, paramsWithSourceDefaults),\n };\n }\n\n // Path 2: Static forward (O(1) cached)\n const staticForward = this.#resolvedForwardMap[name] ?? name;\n\n // Path 3: Mixed chain (static target has dynamic forward)\n if (\n staticForward !== name &&\n Object.hasOwn(this.#config.forwardFnMap, staticForward)\n ) {\n const paramsWithSourceDefaults = this.#mergeDefaultParams(name, params);\n const targetDynamicForward = this.#config.forwardFnMap[staticForward];\n const resolved = this.#resolveDynamicForward(\n staticForward,\n targetDynamicForward,\n params,\n );\n\n return {\n name: resolved,\n params: this.#mergeDefaultParams(resolved, paramsWithSourceDefaults),\n };\n }\n\n // Path 4: Static forward only\n if (staticForward !== name) {\n const paramsWithSourceDefaults = this.#mergeDefaultParams(name, params);\n\n return {\n name: staticForward,\n params: this.#mergeDefaultParams(\n staticForward,\n paramsWithSourceDefaults,\n ),\n };\n }\n\n // No forward - merge own defaults\n return { name, params: this.#mergeDefaultParams(name, params) };\n }\n\n /**\n * Builds a RouteTreeState from already-resolved route name and params.\n * Called by Router.buildState after forwardState is applied at facade level.\n * This allows plugins to intercept forwardState.\n */\n buildStateResolved(\n resolvedName: string,\n resolvedParams: Params,\n ): RouteTreeState | undefined {\n const segments = this.#matcher.getSegmentsByName(resolvedName);\n\n if (!segments) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const meta = this.#matcher.getMetaByName(resolvedName)!;\n\n return createRouteState(\n { segments, params: resolvedParams, meta },\n resolvedName,\n );\n }\n\n /**\n * Builds a RouteTreeState with segments from already-resolved route name and params.\n * Called by Router.buildStateWithSegments after forwardState is applied at facade level.\n * This allows plugins to intercept forwardState.\n */\n buildStateWithSegmentsResolved<P extends Params = Params>(\n resolvedName: string,\n resolvedParams: P,\n ): BuildStateResultWithSegments<P> | undefined {\n const segments = this.#matcher.getSegmentsByName(resolvedName);\n\n if (!segments) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const meta = this.#matcher.getMetaByName(resolvedName)!;\n const state = createRouteState<P>(\n {\n segments: segments as readonly RouteTree[],\n params: resolvedParams,\n meta,\n },\n resolvedName,\n );\n\n return { state, segments: segments as readonly RouteTree[] };\n }\n\n // =========================================================================\n // Query operations\n // =========================================================================\n\n /**\n * Checks if a route is currently active.\n */\n isActiveRoute(\n name: string,\n params: Params = {},\n strictEquality = false,\n ignoreQueryParams = true,\n ): boolean {\n // Fast path: skip regex validation for already-validated route names\n if (!validatedRouteNames.has(name)) {\n validateRouteName(name, \"isActiveRoute\");\n validatedRouteNames.add(name);\n }\n\n // Note: empty string check is handled by Router.ts facade\n const activeState = this.#deps.getState();\n\n if (!activeState) {\n return false;\n }\n\n const activeName = activeState.name;\n\n // Fast path: check if routes are related before expensive operations\n if (\n activeName !== name &&\n !activeName.startsWith(`${name}.`) &&\n !name.startsWith(`${activeName}.`)\n ) {\n return false;\n }\n\n const defaultParams = this.#config.defaultParams[name] as\n | Params\n | undefined;\n\n // Exact match case\n if (strictEquality || activeName === name) {\n const effectiveParams = defaultParams\n ? { ...defaultParams, ...params }\n : params;\n\n const targetState: State = {\n name,\n params: effectiveParams,\n path: \"\",\n };\n\n return this.#deps.areStatesEqual(\n targetState,\n activeState,\n ignoreQueryParams,\n );\n }\n\n // Hierarchical check: activeState is a descendant of target (name)\n const activeParams = activeState.params;\n\n if (!paramsMatch(params, activeParams)) {\n return false;\n }\n\n // Check defaultParams (skip keys already in params)\n return (\n !defaultParams ||\n paramsMatchExcluding(defaultParams, activeParams, params)\n );\n }\n\n /**\n * Creates a predicate function to check if a route node should be updated.\n * Note: Argument validation is done by facade (Router.ts) via validateShouldUpdateNodeArgs.\n */\n shouldUpdateNode(\n nodeName: string,\n ): (toState: State, fromState?: State) => boolean {\n return (toState: State, fromState?: State): boolean => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!(toState && typeof toState === \"object\" && \"name\" in toState)) {\n throw new TypeError(\n \"[router.shouldUpdateNode] toState must be valid State object\",\n );\n }\n\n if (toState.meta?.options.reload) {\n return true;\n }\n\n if (nodeName === DEFAULT_ROUTE_NAME && !fromState) {\n return true;\n }\n\n const { intersection, toActivate, toDeactivate } = getTransitionPath(\n toState,\n fromState,\n );\n\n if (nodeName === intersection) {\n return true;\n }\n\n if (toActivate.includes(nodeName)) {\n return true;\n }\n\n return toDeactivate.includes(nodeName);\n };\n }\n\n /**\n * Returns the config object.\n */\n getConfig(): RouteConfig {\n return this.#config;\n }\n\n /**\n * Returns URL params for a route.\n * Used by StateNamespace.\n */\n getUrlParams(name: string): string[] {\n const segments = this.#matcher.getSegmentsByName(name);\n\n if (!segments) {\n return [];\n }\n\n return this.#collectUrlParamsArray(segments as readonly RouteTree[]);\n }\n\n /**\n * Returns the resolved forward map.\n */\n getResolvedForwardMap(): Record<string, string> {\n return this.#resolvedForwardMap;\n }\n\n /**\n * Sets resolved forward map (used by clone).\n */\n setResolvedForwardMap(map: Record<string, string>): void {\n Object.assign(this.#resolvedForwardMap, map);\n }\n\n /**\n * Applies cloned route config from source router.\n * Used by clone to copy decoders, encoders, defaultParams, forwardMap,\n * forwardFnMap and resolvedForwardMap into this namespace's config.\n */\n applyClonedConfig(\n config: RouteConfig,\n resolvedForwardMap: Record<string, string>,\n ): void {\n Object.assign(this.#config.decoders, config.decoders);\n Object.assign(this.#config.encoders, config.encoders);\n Object.assign(this.#config.defaultParams, config.defaultParams);\n Object.assign(this.#config.forwardMap, config.forwardMap);\n Object.assign(this.#config.forwardFnMap, config.forwardFnMap);\n this.setResolvedForwardMap({ ...resolvedForwardMap });\n }\n\n /**\n * Creates a clone of the routes for a new router (from tree).\n */\n cloneRoutes(): Route<Dependencies>[] {\n return routeTreeToDefinitions(this.#tree) as Route<Dependencies>[];\n }\n\n // =========================================================================\n // Public validation methods (used by Router facade)\n // =========================================================================\n\n /**\n * Validates that forwardTo target doesn't require params that source doesn't have.\n * Used by updateRoute for forwardTo validation.\n */\n validateForwardToParamCompatibility(\n sourceName: string,\n targetName: string,\n ): void {\n const sourceSegments = this.#getSegmentsOrThrow(sourceName);\n const targetSegments = this.#getSegmentsOrThrow(targetName);\n\n // Get source and target URL params using helper\n const sourceParams = this.#collectUrlParams(sourceSegments);\n const targetParams = this.#collectUrlParamsArray(targetSegments);\n\n // Check if target requires params that source doesn't have\n const missingParams = targetParams.filter(\n (param) => !sourceParams.has(param),\n );\n\n if (missingParams.length > 0) {\n throw new Error(\n `[real-router] forwardTo target \"${targetName}\" requires params ` +\n `[${missingParams.join(\", \")}] that are not available in source route \"${sourceName}\"`,\n );\n }\n }\n\n /**\n * Validates that adding forwardTo doesn't create a cycle.\n * Creates a test map with the new entry and uses resolveForwardChain\n * to detect cycles before any mutation happens.\n * Used by updateRoute for forwardTo validation.\n */\n validateForwardToCycle(sourceName: string, targetName: string): void {\n // Create a test map with the new entry to validate BEFORE mutation\n const testMap = {\n ...this.#config.forwardMap,\n [sourceName]: targetName,\n };\n\n // resolveForwardChain will throw if cycle is detected or max depth exceeded\n resolveForwardChain(sourceName, testMap);\n }\n\n /**\n * Validates removeRoute constraints.\n * Returns false if removal should be blocked (route is active).\n * Logs warnings for edge cases.\n *\n * @param name - Route name to remove\n * @param currentStateName - Current active route name (or undefined)\n * @param isNavigating - Whether navigation is in progress\n * @returns true if removal can proceed, false if blocked\n */\n validateRemoveRoute(\n name: string,\n currentStateName: string | undefined,\n isNavigating: boolean,\n ): boolean {\n // Check if trying to remove currently active route (or its parent)\n if (currentStateName) {\n const isExactMatch = currentStateName === name;\n const isParentOfCurrent = currentStateName.startsWith(`${name}.`);\n\n if (isExactMatch || isParentOfCurrent) {\n const suffix = isExactMatch ? \"\" : ` (current: \"${currentStateName}\")`;\n\n logger.warn(\n \"router.removeRoute\",\n `Cannot remove route \"${name}\" — it is currently active${suffix}. Navigate away first.`,\n );\n\n return false;\n }\n }\n\n // Warn if navigation is in progress (but allow removal)\n if (isNavigating) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" removed while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n return true;\n }\n\n /**\n * Validates clearRoutes operation.\n * Returns false if operation should be blocked (navigation in progress).\n *\n * @param isNavigating - Whether navigation is in progress\n * @returns true if clearRoutes can proceed, false if blocked\n */\n validateClearRoutes(isNavigating: boolean): boolean {\n if (isNavigating) {\n logger.error(\n \"router.clearRoutes\",\n \"Cannot clear routes while navigation is in progress. Wait for navigation to complete.\",\n );\n\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates updateRoute instance-level constraints (route existence, forwardTo).\n * Called after static validation passes.\n *\n * @param name - Route name (already validated by static method)\n * @param forwardTo - Cached forwardTo value (to avoid calling getter twice)\n */\n validateUpdateRoute(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null | undefined,\n ): void {\n // Validate route exists\n if (!this.hasRoute(name)) {\n throw new ReferenceError(\n `[real-router] updateRoute: route \"${name}\" does not exist`,\n );\n }\n\n // Validate forwardTo target exists and is valid (only for string forwardTo)\n if (\n forwardTo !== undefined &&\n forwardTo !== null &&\n typeof forwardTo === \"string\"\n ) {\n if (!this.hasRoute(forwardTo)) {\n throw new Error(\n `[real-router] updateRoute: forwardTo target \"${forwardTo}\" does not exist`,\n );\n }\n\n // Check forwardTo param compatibility\n this.validateForwardToParamCompatibility(name, forwardTo);\n\n // Check for cycle detection\n this.validateForwardToCycle(name, forwardTo);\n }\n }\n\n // =========================================================================\n // Private methods\n // =========================================================================\n\n #updateForwardTo(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null,\n ): void {\n if (forwardTo === null) {\n delete this.#config.forwardMap[name];\n delete this.#config.forwardFnMap[name];\n } else if (typeof forwardTo === \"string\") {\n delete this.#config.forwardFnMap[name];\n this.#config.forwardMap[name] = forwardTo;\n } else {\n delete this.#config.forwardMap[name];\n this.#config.forwardFnMap[name] = forwardTo;\n }\n\n this.#refreshForwardMap();\n }\n\n /**\n * Merges route's defaultParams with provided params.\n */\n #mergeDefaultParams<P extends Params = Params>(\n routeName: string,\n params: P,\n ): P {\n if (Object.hasOwn(this.#config.defaultParams, routeName)) {\n return { ...this.#config.defaultParams[routeName], ...params } as P;\n }\n\n return params;\n }\n\n /**\n * Resolves dynamic forwardTo chain with cycle detection and max depth.\n * Throws if cycle detected, max depth exceeded, or invalid return type.\n */\n #resolveDynamicForward(\n startName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n startFn: ForwardToCallback<any>,\n params: Params,\n ): string {\n const visited = new Set<string>([startName]);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n let current = startFn(this.#deps.getDependency as any, params);\n let depth = 0;\n const MAX_DEPTH = 100;\n\n // Validate initial return type\n if (typeof current !== \"string\") {\n throw new TypeError(\n `forwardTo callback must return a string, got ${typeof current}`,\n );\n }\n\n while (depth < MAX_DEPTH) {\n // Check if target route exists\n\n if (this.#matcher.getSegmentsByName(current) === undefined) {\n throw new Error(`Route \"${current}\" does not exist`);\n }\n\n // Check for cycle\n if (visited.has(current)) {\n const chain = [...visited, current].join(\" → \");\n\n throw new Error(`Circular forwardTo detected: ${chain}`);\n }\n\n visited.add(current);\n\n // Check if current has dynamic forward\n if (Object.hasOwn(this.#config.forwardFnMap, current)) {\n const fn = this.#config.forwardFnMap[current];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n current = fn(this.#deps.getDependency as any, params);\n\n depth++;\n continue;\n }\n\n // Check if current has static forward\n const staticForward = this.#config.forwardMap[current];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (staticForward !== undefined) {\n current = staticForward;\n depth++;\n continue;\n }\n\n // No more forwards - return current\n return current;\n }\n\n throw new Error(`forwardTo exceeds maximum depth of ${MAX_DEPTH}`);\n }\n\n #rebuildTree(): void {\n this.#tree = createRouteTree(\n DEFAULT_ROUTE_NAME,\n this.#rootPath,\n this.#definitions,\n );\n\n // Re-register tree in matcher (creates new instance, preserving options if set)\n this.#matcher = createMatcher(this.#matcherOptions);\n this.#matcher.registerTree(this.#tree);\n }\n\n /**\n * Gets segments by name or throws if not found.\n * Use when route existence has been validated by hasRoute() beforehand.\n */\n #getSegmentsOrThrow(name: string): readonly RouteTree[] {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.#matcher.getSegmentsByName(name)! as readonly RouteTree[];\n }\n\n /**\n * Gets last segment from segments array.\n * Use when segments array is guaranteed to be non-empty.\n */\n #getLastSegment(segments: readonly RouteTree[]): RouteTree {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return segments.at(-1)!;\n }\n\n /**\n * Collects URL params from segments into a Set.\n */\n #collectUrlParams(segments: readonly RouteTree[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n // Named routes always have parsers (null only for root without path)\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n }\n\n return params;\n }\n\n /**\n * Collects URL params from segments into an array.\n *\n * @param segments - Non-null segments (caller must validate existence first)\n */\n #collectUrlParamsArray(segments: readonly RouteTree[]): string[] {\n const params: string[] = [];\n\n for (const segment of segments) {\n // Named routes always have parsers (null only for root without path)\n for (const param of segment.paramMeta.urlParams) {\n params.push(param);\n }\n }\n\n return params;\n }\n\n /**\n * Refreshes forward map cache, conditionally validating based on noValidate flag.\n */\n #refreshForwardMap(): void {\n if (this.#noValidate) {\n this.#cacheForwardMap();\n } else {\n this.#validateAndCacheForwardMap();\n }\n }\n\n #validateAndCacheForwardMap(): void {\n // Clear existing cache\n for (const key in this.#resolvedForwardMap) {\n delete this.#resolvedForwardMap[key];\n }\n\n // Resolve all chains\n for (const fromRoute of Object.keys(this.#config.forwardMap)) {\n this.#resolvedForwardMap[fromRoute] = resolveForwardChain(\n fromRoute,\n this.#config.forwardMap,\n );\n }\n }\n\n /**\n * Caches forward chains without validation (noValidate mode).\n * Simply resolves chains without cycle detection or max depth checks.\n */\n #cacheForwardMap(): void {\n // Clear existing cache\n for (const key in this.#resolvedForwardMap) {\n delete this.#resolvedForwardMap[key];\n }\n\n // Resolve chains without validation\n for (const fromRoute of Object.keys(this.#config.forwardMap)) {\n let current = fromRoute;\n\n while (this.#config.forwardMap[current]) {\n current = this.#config.forwardMap[current];\n }\n\n this.#resolvedForwardMap[fromRoute] = current;\n }\n }\n\n #clearRouteConfigurations(routeName: string): void {\n const shouldClear = (n: string): boolean =>\n n === routeName || n.startsWith(`${routeName}.`);\n\n clearConfigEntries(this.#config.decoders, shouldClear);\n clearConfigEntries(this.#config.encoders, shouldClear);\n clearConfigEntries(this.#config.defaultParams, shouldClear);\n clearConfigEntries(this.#config.forwardMap, shouldClear);\n clearConfigEntries(this.#config.forwardFnMap, shouldClear);\n\n // Clear forwardMap entries pointing TO deleted route\n clearConfigEntries(this.#config.forwardMap, (key) =>\n shouldClear(this.#config.forwardMap[key]),\n );\n\n // Clear lifecycle handlers\n const [canDeactivateFactories, canActivateFactories] =\n this.#lifecycleNamespace.getFactories();\n\n for (const n of Object.keys(canActivateFactories)) {\n if (shouldClear(n)) {\n this.#lifecycleNamespace.clearCanActivate(n);\n }\n }\n\n for (const n of Object.keys(canDeactivateFactories)) {\n if (shouldClear(n)) {\n this.#lifecycleNamespace.clearCanDeactivate(n);\n }\n }\n }\n\n #registerAllRouteHandlers(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n ): void {\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n this.#registerSingleRouteHandlers(route, fullName);\n\n if (route.children) {\n this.#registerAllRouteHandlers(route.children, fullName);\n }\n }\n }\n\n #registerSingleRouteHandlers(\n route: Route<Dependencies>,\n fullName: string,\n ): void {\n // Register canActivate via deps.canActivate (allows tests to spy on router.canActivate)\n if (route.canActivate) {\n // Note: Uses #depsStore directly because this method is called from constructor\n // before setDependencies(). The getter #deps would throw if deps not set.\n if (this.#depsStore) {\n // Deps available, register immediately\n this.#depsStore.addActivateGuard(fullName, route.canActivate);\n } else {\n // Deps not set yet, store for later registration\n this.#pendingCanActivate.set(fullName, route.canActivate);\n }\n }\n\n // Register canDeactivate via deps.canDeactivate (allows tests to spy on router.canDeactivate)\n if (route.canDeactivate) {\n // Note: Uses #depsStore directly because this method is called from constructor\n // before setDependencies(). The getter #deps would throw if deps not set.\n if (this.#depsStore) {\n // Deps available, register immediately\n this.#depsStore.addDeactivateGuard(fullName, route.canDeactivate);\n } else {\n // Deps not set yet, store for later registration\n this.#pendingCanDeactivate.set(fullName, route.canDeactivate);\n }\n }\n\n // Register forwardTo\n if (route.forwardTo) {\n this.#registerForwardTo(route, fullName);\n }\n\n // Register transformers with fallback wrapper\n if (route.decodeParams) {\n this.#config.decoders[fullName] = (params: Params): Params =>\n route.decodeParams?.(params) ?? params;\n }\n\n if (route.encodeParams) {\n this.#config.encoders[fullName] = (params: Params): Params =>\n route.encodeParams?.(params) ?? params;\n }\n\n // Register defaults\n if (route.defaultParams) {\n this.#config.defaultParams[fullName] = route.defaultParams;\n }\n }\n\n #findDefinition(\n definitions: RouteDefinition[],\n fullName: string,\n parentPrefix = \"\",\n ): RouteDefinition | undefined {\n for (const def of definitions) {\n const currentFullName = parentPrefix\n ? `${parentPrefix}.${def.name}`\n : def.name;\n\n if (currentFullName === fullName) {\n return def;\n }\n if (def.children && fullName.startsWith(`${currentFullName}.`)) {\n return this.#findDefinition(def.children, fullName, currentFullName);\n }\n }\n\n /* v8 ignore next -- @preserve: defensive return, callers validate route exists before calling */\n return undefined;\n }\n\n #registerForwardTo(route: Route<Dependencies>, fullName: string): void {\n if (route.canActivate) {\n /* v8 ignore next -- @preserve: edge case, both string and function tested separately */\n const forwardTarget =\n typeof route.forwardTo === \"string\" ? route.forwardTo : \"[dynamic]\";\n\n logger.warn(\n \"real-router\",\n `Route \"${fullName}\" has both forwardTo and canActivate. ` +\n `canActivate will be ignored because forwardTo creates a redirect (industry standard). ` +\n `Move canActivate to the target route \"${forwardTarget}\".`,\n );\n }\n\n if (route.canDeactivate) {\n /* v8 ignore next -- @preserve: edge case, both string and function tested separately */\n const forwardTarget =\n typeof route.forwardTo === \"string\" ? route.forwardTo : \"[dynamic]\";\n\n logger.warn(\n \"real-router\",\n `Route \"${fullName}\" has both forwardTo and canDeactivate. ` +\n `canDeactivate will be ignored because forwardTo creates a redirect (industry standard). ` +\n `Move canDeactivate to the target route \"${forwardTarget}\".`,\n );\n }\n\n // Async validation ALWAYS runs (even with noValidate=true)\n if (typeof route.forwardTo === \"function\") {\n const isNativeAsync =\n (route.forwardTo as { constructor: { name: string } }).constructor\n .name === \"AsyncFunction\";\n const isTranspiledAsync = route.forwardTo\n .toString()\n .includes(\"__awaiter\");\n\n if (isNativeAsync || isTranspiledAsync) {\n throw new TypeError(\n `forwardTo callback cannot be async for route \"${fullName}\". ` +\n `Async functions break matchPath/buildPath.`,\n );\n }\n }\n\n // forwardTo is guaranteed to exist at this point\n if (typeof route.forwardTo === \"string\") {\n this.#config.forwardMap[fullName] = route.forwardTo;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#config.forwardFnMap[fullName] = route.forwardTo!;\n }\n }\n\n #enrichRoute(\n routeDef: RouteDefinition,\n routeName: string,\n ): Route<Dependencies> {\n const route: Route<Dependencies> = {\n name: routeDef.name,\n path: routeDef.path,\n };\n\n const forwardToFn = this.#config.forwardFnMap[routeName];\n const forwardToStr = this.#config.forwardMap[routeName];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (forwardToFn !== undefined) {\n route.forwardTo = forwardToFn;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if (forwardToStr !== undefined) {\n route.forwardTo = forwardToStr;\n }\n\n if (routeName in this.#config.defaultParams) {\n route.defaultParams = this.#config.defaultParams[routeName];\n }\n\n if (routeName in this.#config.decoders) {\n route.decodeParams = this.#config.decoders[routeName];\n }\n\n if (routeName in this.#config.encoders) {\n route.encodeParams = this.#config.encoders[routeName];\n }\n\n const [canDeactivateFactories, canActivateFactories] =\n this.#lifecycleNamespace.getFactories();\n\n if (routeName in canActivateFactories) {\n route.canActivate = canActivateFactories[routeName];\n }\n\n if (routeName in canDeactivateFactories) {\n route.canDeactivate = canDeactivateFactories[routeName];\n }\n\n if (routeDef.children) {\n route.children = routeDef.children.map((child) =>\n this.#enrichRoute(child, `${routeName}.${child.name}`),\n );\n }\n\n return route;\n }\n}\n","// packages/real-router/modules/transition/wrapSyncError.ts\n\n/**\n * Error metadata structure for transition errors.\n * Contains information extracted from caught exceptions.\n */\nexport interface SyncErrorMetadata {\n [key: string]: unknown;\n message?: string;\n stack?: string | undefined;\n cause?: unknown;\n segment?: string;\n}\n\n// Reserved properties that conflict with RouterError constructor\n// Issue #39: Filter these when wrapping sync errors to avoid TypeError\nconst reservedRouterErrorProps = new Set([\n \"code\",\n \"segment\",\n \"path\",\n \"redirect\",\n]);\n\n/**\n * Wraps a synchronously thrown value into structured error metadata.\n *\n * This helper extracts useful debugging information from various thrown values:\n * - Error instances: extracts message, stack, and cause (ES2022+)\n * - Plain objects: spreads properties into metadata\n * - Primitives (string, number, etc.): returns minimal metadata\n *\n * @param thrown - The value caught in a try-catch block\n * @param segment - Optional route segment name (for lifecycle hooks)\n * @returns Structured error metadata for RouterError\n *\n * @example\n * ```typescript\n * try {\n * hookFn();\n * } catch (error) {\n * const metadata = wrapSyncError(error, \"users.profile\");\n * throw new RouterError(errorCodes.TRANSITION_ERR, metadata);\n * }\n * ```\n */\nexport function wrapSyncError(\n thrown: unknown,\n segment?: string,\n): SyncErrorMetadata {\n // Base metadata - always include segment if provided\n const base: SyncErrorMetadata = segment ? { segment } : {};\n\n // Handle Error instances - extract all useful properties\n if (thrown instanceof Error) {\n return {\n ...base,\n message: thrown.message,\n stack: thrown.stack,\n // Error.cause requires ES2022+ - safely access if present\n ...(\"cause\" in thrown &&\n thrown.cause !== undefined && { cause: thrown.cause }),\n };\n }\n\n // Handle plain objects - spread properties into metadata, filtering reserved props\n if (thrown && typeof thrown === \"object\") {\n const filtered: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(thrown)) {\n // Issue #39: Skip reserved properties to avoid RouterError constructor TypeError\n if (!reservedRouterErrorProps.has(key)) {\n filtered[key] = value;\n }\n }\n\n return { ...base, ...filtered };\n }\n\n // Primitives (string, number, boolean, null, undefined, symbol, bigint)\n // Return base metadata only - the primitive value isn't useful as metadata\n return base;\n}\n","// packages/real-router/modules/RouterError.ts\n\nimport { errorCodes } from \"./constants\";\nimport { deepFreezeState } from \"./helpers\";\n\nimport type { State } from \"@real-router/types\";\n\n// Pre-compute Set of error code values for O(1) lookup in setCode()\n// This avoids creating array and doing linear search on every setCode() call\nconst errorCodeValues = new Set(Object.values(errorCodes));\n\n// Reserved built-in properties - throw error if user tries to set these\nconst reservedProperties = new Set([\"code\", \"segment\", \"path\", \"redirect\"]);\n\n// Reserved method names - silently ignore attempts to overwrite these\nconst reservedMethods = new Set([\n \"setCode\",\n \"setErrorInstance\",\n \"setAdditionalFields\",\n \"hasField\",\n \"getField\",\n \"toJSON\",\n]);\n\nexport class RouterError extends Error {\n [key: string]: unknown;\n\n // Using public properties to ensure structural compatibility\n // with RouterError interface in core-types\n readonly segment: string | undefined;\n readonly path: string | undefined;\n readonly redirect: State | undefined;\n\n // Note: code appears to be writable but setCode() should be used\n // to properly update both code and message together\n code: string;\n\n /**\n * Creates a new RouterError instance.\n *\n * The options object accepts built-in fields (message, segment, path, redirect)\n * and any additional custom fields, which will all be attached to the error instance.\n *\n * @param code - The error code (e.g., \"ROUTE_NOT_FOUND\", \"CANNOT_ACTIVATE\")\n * @param options - Optional configuration object\n * @param options.message - Custom error message (defaults to code if not provided)\n * @param options.segment - The route segment where the error occurred\n * @param options.path - The full path where the error occurred\n * @param options.redirect - Optional redirect state for navigation errors\n *\n * @example\n * ```typescript\n * // Basic error\n * const err1 = new RouterError(\"ROUTE_NOT_FOUND\");\n *\n * // Error with custom message\n * const err2 = new RouterError(\"ERR\", { message: \"Something went wrong\" });\n *\n * // Error with context and custom fields\n * const err3 = new RouterError(\"CANNOT_ACTIVATE\", {\n * message: \"Insufficient permissions\",\n * segment: \"admin\",\n * path: \"/admin/users\",\n * userId: \"123\" // custom field\n * });\n *\n * // Error with redirect\n * const err4 = new RouterError(\"TRANSITION_ERR\", {\n * redirect: { name: \"home\", path: \"/\", params: {} }\n * });\n * ```\n */\n constructor(\n code: string,\n {\n message,\n segment,\n path,\n redirect,\n ...rest\n }: {\n [key: string]: unknown;\n message?: string | undefined;\n segment?: string | undefined;\n path?: string | undefined;\n redirect?: State | undefined;\n } = {},\n ) {\n super(message ?? code);\n\n this.code = code;\n this.segment = segment;\n this.path = path;\n // Deep freeze redirect to prevent mutations (creates a frozen clone)\n this.redirect = redirect ? deepFreezeState(redirect) : undefined;\n\n // Assign custom fields, checking reserved properties and filtering out reserved method names\n // Issue #39: Throw for reserved properties to match setAdditionalFields behavior\n for (const [key, value] of Object.entries(rest)) {\n if (reservedProperties.has(key)) {\n throw new TypeError(\n `[RouterError] Cannot set reserved property \"${key}\"`,\n );\n }\n\n if (!reservedMethods.has(key)) {\n this[key] = value;\n }\n }\n }\n\n /**\n * Updates the error code and conditionally updates the message.\n *\n * If the current message is one of the standard error code values\n * (e.g., \"ROUTE_NOT_FOUND\", \"SAME_STATES\"), it will be replaced with the new code.\n * This allows keeping error messages in sync with codes when using standard error codes.\n *\n * If the message is custom (not a standard error code), it will be preserved.\n *\n * @param newCode - The new error code to set\n *\n * @example\n * // Message follows code (standard error code as message)\n * const err = new RouterError(\"ROUTE_NOT_FOUND\", { message: \"ROUTE_NOT_FOUND\" });\n * err.setCode(\"CUSTOM_ERROR\"); // message becomes \"CUSTOM_ERROR\"\n *\n * @example\n * // Custom message is preserved\n * const err = new RouterError(\"ERR\", { message: \"Custom error message\" });\n * err.setCode(\"NEW_CODE\"); // message stays \"Custom error message\"\n */\n setCode(newCode: string): void {\n this.code = newCode;\n\n // Only update message if it's a standard error code value (not a custom message)\n if (errorCodeValues.has(this.message)) {\n this.message = newCode;\n }\n }\n\n /**\n * Copies properties from another Error instance to this RouterError.\n *\n * This method updates the message, cause, and stack trace from the provided error.\n * Useful for wrapping native errors while preserving error context.\n *\n * @param err - The Error instance to copy properties from\n * @throws {TypeError} If err is null or undefined\n *\n * @example\n * ```typescript\n * const routerErr = new RouterError(\"TRANSITION_ERR\");\n * try {\n * // some operation that might fail\n * } catch (nativeErr) {\n * routerErr.setErrorInstance(nativeErr);\n * throw routerErr;\n * }\n * ```\n */\n setErrorInstance(err: Error): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!err) {\n throw new TypeError(\n \"[RouterError.setErrorInstance] err parameter is required and must be an Error instance\",\n );\n }\n\n this.message = err.message;\n this.cause = err.cause;\n this.stack = err.stack ?? \"\";\n }\n\n /**\n * Adds custom fields to the error object.\n *\n * This method allows attaching arbitrary data to the error for debugging or logging purposes.\n * All fields become accessible as properties on the error instance and are included in JSON serialization.\n *\n * Reserved method names (setCode, setErrorInstance, setAdditionalFields, hasField, getField, toJSON)\n * are automatically filtered out to prevent accidental overwriting of class methods.\n *\n * @param fields - Object containing custom fields to add to the error\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"CANNOT_ACTIVATE\");\n * err.setAdditionalFields({\n * userId: \"123\",\n * attemptedRoute: \"/admin\",\n * reason: \"insufficient permissions\"\n * });\n *\n * console.log(err.userId); // \"123\"\n * console.log(JSON.stringify(err)); // includes all custom fields\n * ```\n */\n setAdditionalFields(fields: Record<string, unknown>): void {\n // Assign fields, throwing for reserved properties, silently ignoring methods\n for (const [key, value] of Object.entries(fields)) {\n if (reservedProperties.has(key)) {\n throw new TypeError(\n `[RouterError.setAdditionalFields] Cannot set reserved property \"${key}\"`,\n );\n }\n\n if (!reservedMethods.has(key)) {\n this[key] = value;\n }\n }\n }\n\n /**\n * Checks if a custom field exists on the error object.\n *\n * This method checks for both custom fields added via setAdditionalFields()\n * and built-in fields (code, message, segment, etc.).\n *\n * @param key - The field name to check\n * @returns `true` if the field exists, `false` otherwise\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ERR\", { segment: \"users\" });\n * err.setAdditionalFields({ userId: \"123\" });\n *\n * err.hasField(\"userId\"); // true\n * err.hasField(\"segment\"); // true\n * err.hasField(\"unknown\"); // false\n * ```\n */\n hasField(key: string): boolean {\n return key in this;\n }\n\n /**\n * Retrieves a custom field value from the error object.\n *\n * This method can access both custom fields and built-in fields.\n * Returns `undefined` if the field doesn't exist.\n *\n * @param key - The field name to retrieve\n * @returns The field value, or `undefined` if it doesn't exist\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ERR\");\n * err.setAdditionalFields({ userId: \"123\", role: \"admin\" });\n *\n * err.getField(\"userId\"); // \"123\"\n * err.getField(\"role\"); // \"admin\"\n * err.getField(\"code\"); // \"ERR\" (built-in field)\n * err.getField(\"unknown\"); // undefined\n * ```\n */\n getField(key: string): unknown {\n return this[key];\n }\n\n /**\n * Serializes the error to a JSON-compatible object.\n *\n * This method is automatically called by JSON.stringify() and includes:\n * - Built-in fields: code, message, segment (if set), path (if set), redirect (if set)\n * - All custom fields added via setAdditionalFields() or constructor\n * - Excludes: stack trace (for security/cleanliness)\n *\n * @returns A plain object representation of the error, suitable for JSON serialization\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ROUTE_NOT_FOUND\", {\n * message: \"Route not found\",\n * path: \"/admin/users/123\"\n * });\n * err.setAdditionalFields({ userId: \"123\" });\n *\n * JSON.stringify(err);\n * // {\n * // \"code\": \"ROUTE_NOT_FOUND\",\n * // \"message\": \"Route not found\",\n * // \"path\": \"/admin/users/123\",\n * // \"userId\": \"123\"\n * // }\n * ```\n */\n toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {\n code: this.code,\n message: this.message,\n };\n\n if (this.segment !== undefined) {\n result.segment = this.segment;\n }\n if (this.path !== undefined) {\n result.path = this.path;\n }\n if (this.redirect !== undefined) {\n result.redirect = this.redirect;\n }\n\n // add all public fields\n // Using Set.has() for O(1) lookup instead of Array.includes() O(n)\n // Overall complexity: O(n) instead of O(n*m)\n const excludeKeys = new Set([\n \"code\",\n \"message\",\n \"segment\",\n \"path\",\n \"redirect\",\n \"stack\",\n ]);\n\n for (const key in this) {\n if (Object.hasOwn(this, key) && !excludeKeys.has(key)) {\n result[key] = this[key];\n }\n }\n\n return result;\n }\n}\n","// packages/real-router/modules/transition/makeError.ts\n\nimport { wrapSyncError } from \"./wrapSyncError\";\nimport { RouterError } from \"../../../RouterError\";\n\n// Helper: Creating an error with code\nexport const makeError = (\n code: string,\n err?: RouterError,\n): RouterError | undefined => {\n if (!err) {\n return undefined;\n }\n\n err.setCode(code);\n\n return err;\n};\n\n/**\n * Re-throws a caught error as a RouterError with the given error code.\n * If the error is already a RouterError, sets the code directly.\n * Otherwise wraps it with wrapSyncError metadata.\n */\nexport function rethrowAsRouterError(\n error: unknown,\n errorCode: string,\n segment?: string,\n): never {\n if (error instanceof RouterError) {\n error.setCode(errorCode);\n\n throw error;\n }\n\n throw new RouterError(errorCode, wrapSyncError(error, segment));\n}\n","// packages/real-router/modules/transition/mergeStates.ts\n\nimport type { Params, State, StateMeta } from \"@real-router/types\";\n\n/**\n * Merges two states with toState taking priority over fromState.\n *\n * Priority order for state fields: toState > fromState\n * Priority order for meta fields: toState.meta > fromState.meta > defaults\n *\n * Special case: meta.params are merged (not replaced):\n * { ...toState.meta.params, ...fromState.meta.params }\n *\n * @param toState - Target state (higher priority)\n * @param fromState - Source state (lower priority)\n * @returns New merged state object\n */\nexport const mergeStates = (toState: State, fromState: State): State => {\n const toMeta = toState.meta;\n const fromMeta = fromState.meta;\n\n // Optimization #1: Conditional merge for params\n // Use spread only when both are defined\n const toParams = toMeta?.params;\n const fromParams = fromMeta?.params;\n\n // Both have params - need to merge; otherwise use whichever is defined\n const metaParams: Params =\n toParams && fromParams\n ? { ...toParams, ...fromParams }\n : (toParams ?? fromParams ?? {});\n\n // Optimization #2: Build meta with defaults, then apply fromMeta, then toMeta\n // Note: StateMeta can have custom fields added by guards/middleware, so we preserve them\n const resultMeta: StateMeta = {\n // Defaults first\n id: 1,\n options: {},\n redirected: false,\n // fromMeta fields (lower priority, may include custom fields)\n ...fromMeta,\n // toMeta fields (higher priority, may include custom fields)\n ...toMeta,\n // Explicitly set params to our merged version (override spread)\n params: metaParams,\n };\n\n // Optimization #4: Copy all toState fields (including custom ones)\n // then explicitly set meta to our merged version\n // Note: State can have custom fields added by middleware, so we must preserve them\n return {\n ...toState,\n meta: resultMeta,\n };\n};\n","// packages/real-router/modules/transition/processLifecycleResult.ts\n\nimport { isPromise, isState } from \"type-guards\";\n\nimport { errorCodes } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\n\nimport type { SyncErrorMetadata } from \"./wrapSyncError\";\nimport type { State, ActivationFn } from \"@real-router/types\";\n\n/**\n * Builds error metadata from a caught promise rejection.\n * Extracts message, stack, and cause from Error instances.\n */\nfunction buildErrorMetadata(\n error_: unknown,\n errorData: SyncErrorMetadata,\n): SyncErrorMetadata {\n if (error_ instanceof Error) {\n return {\n ...errorData,\n message: error_.message,\n stack: error_.stack,\n // Error.cause requires ES2022+ - safely access it if present\n ...(\"cause\" in error_ &&\n error_.cause !== undefined && { cause: error_.cause }),\n };\n }\n\n if (error_ && typeof error_ === \"object\") {\n return { ...errorData, ...error_ };\n }\n\n return errorData;\n}\n\n// Helper: Lifecycle results Processing Function\nexport const processLifecycleResult = async (\n result: ReturnType<ActivationFn>,\n currentState: State,\n segment?: string,\n): Promise<State> => {\n const errorData = segment ? { segment } : {};\n\n if (result === undefined) {\n return currentState;\n }\n\n if (typeof result === \"boolean\") {\n if (result) {\n return currentState;\n } else {\n throw new RouterError(errorCodes.TRANSITION_ERR, errorData);\n }\n }\n\n if (isState(result)) {\n return result;\n }\n\n if (isPromise<State | boolean | undefined>(result)) {\n // Optimization: single try/catch instead of .then(onFulfill, onReject)\n try {\n const resVal = await result;\n\n return await processLifecycleResult(resVal, currentState, segment);\n } catch (error_: unknown) {\n throw new RouterError(\n errorCodes.TRANSITION_ERR,\n buildErrorMetadata(error_, errorData),\n );\n }\n }\n\n // This should never be reached - all valid ActivationFn return types are handled above\n // If we get here, it means the activation function returned an unexpected type\n throw new RouterError(errorCodes.TRANSITION_ERR, {\n ...errorData,\n message: `Invalid lifecycle result type: ${typeof result}`,\n });\n};\n","// packages/real-router/modules/transition/executeLifecycleHooks.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { isState } from \"type-guards\";\n\nimport { RouterError, errorCodes } from \"@real-router/core\";\n\nimport { rethrowAsRouterError } from \"./makeError\";\nimport { mergeStates } from \"./mergeStates\";\nimport { processLifecycleResult } from \"./processLifecycleResult\";\n\nimport type { State, ActivationFn } from \"@real-router/types\";\n\n// Helper: execution of the Lifecycle Hooks group\nexport const executeLifecycleHooks = async (\n hooks: Map<string, ActivationFn>,\n toState: State,\n fromState: State | undefined,\n segments: string[],\n errorCode: string,\n isCancelled: () => boolean,\n): Promise<State> => {\n let currentState = toState;\n const segmentsToProcess = segments.filter((name) => hooks.has(name));\n\n if (segmentsToProcess.length === 0) {\n return currentState;\n }\n\n for (const segment of segmentsToProcess) {\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n // Safe cast: segmentsToProcess only contains names that exist in hooks (filtered above)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed by filter\n const hookFn = hooks.get(segment)!;\n\n try {\n const result = hookFn(currentState, fromState);\n const newState = await processLifecycleResult(\n result,\n currentState,\n segment,\n );\n\n // Optimization: Early return for undefined newState (most common case ~90%+)\n // This avoids isState() call and subsequent checks\n if (newState !== currentState && isState(newState)) {\n // Guards cannot redirect to a different route\n if (newState.name !== currentState.name) {\n throw new RouterError(errorCode, {\n message:\n \"Guards cannot redirect to different route. Use middleware.\",\n attemptedRedirect: {\n name: newState.name,\n params: newState.params,\n path: newState.path,\n },\n });\n }\n\n // Same route - safe to merge (param modifications, meta changes)\n const hasChanged =\n newState.params !== currentState.params ||\n newState.path !== currentState.path;\n\n if (hasChanged) {\n logger.error(\n \"core:transition\",\n \"Warning: State mutated during transition\",\n { from: currentState, to: newState },\n );\n }\n\n currentState = mergeStates(newState, currentState);\n }\n } catch (error: unknown) {\n rethrowAsRouterError(error, errorCode, segment);\n }\n }\n\n return currentState;\n};\n","// packages/real-router/modules/transition/executeMiddleware.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { isState } from \"type-guards\";\n\nimport { rethrowAsRouterError } from \"./makeError\";\nimport { mergeStates } from \"./mergeStates\";\nimport { processLifecycleResult } from \"./processLifecycleResult\";\nimport { errorCodes } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\n\nimport type { State, ActivationFn } from \"@real-router/types\";\n\n// Helper: processing middleware\nexport const executeMiddleware = async (\n middlewareFunctions: ActivationFn[],\n toState: State,\n fromState: State | undefined,\n isCancelled: () => boolean,\n): Promise<State> => {\n let currentState = toState;\n\n for (const middlewareFn of middlewareFunctions) {\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n try {\n const result = middlewareFn(currentState, fromState);\n const newState = await processLifecycleResult(result, currentState);\n\n // Optimization: Early return for undefined newState (most common case ~90%+)\n // This avoids isState() call and subsequent checks\n if (newState !== currentState && isState(newState)) {\n const hasChanged =\n newState.name !== currentState.name ||\n newState.params !== currentState.params ||\n newState.path !== currentState.path;\n\n if (hasChanged) {\n logger.error(\n \"core:middleware\",\n \"Warning: State mutated during middleware execution\",\n { from: currentState, to: newState },\n );\n }\n\n currentState = mergeStates(newState, currentState);\n }\n } catch (error: unknown) {\n rethrowAsRouterError(error, errorCodes.TRANSITION_ERR);\n }\n }\n\n return currentState;\n};\n","// packages/real-router/modules/transition/index.ts\n\nimport { executeLifecycleHooks } from \"./executeLifecycleHooks\";\nimport { executeMiddleware } from \"./executeMiddleware\";\nimport { constants, errorCodes } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\nimport { getTransitionPath, nameToIDs } from \"../../../transitionPath\";\n\nimport type { TransitionDependencies, TransitionOutput } from \"../types\";\nimport type { NavigationOptions, State } from \"@real-router/types\";\n\nexport async function transition(\n deps: TransitionDependencies,\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n): Promise<TransitionOutput> {\n // We're caching the necessary data\n const [canDeactivateFunctions, canActivateFunctions] =\n deps.getLifecycleFunctions();\n const middlewareFunctions = deps.getMiddlewareFunctions();\n const isUnknownRoute = toState.name === constants.UNKNOWN_ROUTE;\n\n // State management functions\n // Issue #36: Check both explicit cancellation AND router shutdown\n const isCancelled = () => !deps.isActive();\n\n const { toDeactivate, toActivate, intersection } = getTransitionPath(\n toState,\n fromState,\n );\n\n // determine the necessary steps\n const shouldDeactivate =\n fromState && !opts.forceDeactivate && toDeactivate.length > 0;\n const shouldActivate = !isUnknownRoute && toActivate.length > 0;\n const shouldRunMiddleware = middlewareFunctions.length > 0;\n\n let currentState = toState;\n\n if (shouldDeactivate) {\n currentState = await executeLifecycleHooks(\n canDeactivateFunctions,\n toState,\n fromState,\n toDeactivate,\n errorCodes.CANNOT_DEACTIVATE,\n isCancelled,\n );\n }\n\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n if (shouldActivate) {\n currentState = await executeLifecycleHooks(\n canActivateFunctions,\n currentState,\n fromState,\n toActivate,\n errorCodes.CANNOT_ACTIVATE,\n isCancelled,\n );\n }\n\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n if (shouldRunMiddleware) {\n currentState = await executeMiddleware(\n middlewareFunctions,\n currentState,\n fromState,\n isCancelled,\n );\n }\n\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n // Automatic cleaning of inactive segments\n if (fromState) {\n const activeSegments = nameToIDs(toState.name);\n const previousActiveSegments = nameToIDs(fromState.name);\n\n for (const name of previousActiveSegments) {\n if (!activeSegments.includes(name) && canDeactivateFunctions.has(name)) {\n deps.clearCanDeactivate(name);\n }\n }\n }\n\n return {\n state: currentState,\n meta: {\n phase: \"middleware\",\n segments: {\n deactivated: toDeactivate,\n activated: toActivate,\n intersection,\n },\n },\n };\n}\n","// packages/core/src/namespaces/NavigationNamespace/validators.ts\n\n/**\n * Static validation functions for NavigationNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { getTypeDescription, isNavigationOptions } from \"type-guards\";\n\nimport type { NavigationOptions, State } from \"@real-router/types\";\n\n/**\n * Validates navigate route name argument.\n */\nexport function validateNavigateArgs(name: unknown): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.navigate] Invalid route name: expected string, got ${getTypeDescription(name)}`,\n );\n }\n}\n\n/**\n * Validates navigateToState arguments.\n */\nexport function validateNavigateToStateArgs(\n toState: unknown,\n fromState: unknown,\n opts: unknown,\n): void {\n // toState must be a valid state object\n if (\n !toState ||\n typeof toState !== \"object\" ||\n typeof (toState as State).name !== \"string\" ||\n typeof (toState as State).path !== \"string\"\n ) {\n throw new TypeError(\n `[router.navigateToState] Invalid toState: expected State object with name and path`,\n );\n }\n\n // fromState can be undefined or a valid state\n if (\n fromState !== undefined &&\n (!fromState ||\n typeof fromState !== \"object\" ||\n typeof (fromState as State).name !== \"string\")\n ) {\n throw new TypeError(\n `[router.navigateToState] Invalid fromState: expected State object or undefined`,\n );\n }\n\n // opts must be an object\n if (typeof opts !== \"object\" || opts === null) {\n throw new TypeError(\n `[router.navigateToState] Invalid opts: expected NavigationOptions object, got ${getTypeDescription(opts)}`,\n );\n }\n}\n\n/**\n * Validates navigateToDefault arguments.\n */\nexport function validateNavigateToDefaultArgs(opts: unknown): void {\n // If opts is provided, it must be an object (NavigationOptions)\n if (opts !== undefined && (typeof opts !== \"object\" || opts === null)) {\n throw new TypeError(\n `[router.navigateToDefault] Invalid options: ${getTypeDescription(opts)}. Expected NavigationOptions object.`,\n );\n }\n}\n\n/**\n * Validates that opts is a valid NavigationOptions object.\n */\nexport function validateNavigationOptions(\n opts: unknown,\n methodName: string,\n): asserts opts is NavigationOptions {\n if (!isNavigationOptions(opts)) {\n throw new TypeError(\n `[router.${methodName}] Invalid options: ${getTypeDescription(opts)}. Expected NavigationOptions object.`,\n );\n }\n}\n","// packages/core/src/namespaces/NavigationNamespace/NavigationNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\n\nimport { transition } from \"./transition\";\nimport {\n validateNavigateArgs,\n validateNavigateToDefaultArgs,\n validateNavigateToStateArgs,\n validateNavigationOptions,\n} from \"./validators\";\nimport { errorCodes, constants } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\nimport { resolveOption } from \"../OptionsNamespace\";\n\nimport type {\n NavigationDependencies,\n TransitionDependencies,\n TransitionOutput,\n} from \"./types\";\nimport type {\n NavigationOptions,\n Params,\n State,\n TransitionMeta,\n} from \"@real-router/types\";\n\n/**\n * Independent namespace for managing navigation.\n *\n * Handles navigate(), navigateToDefault(), navigateToState(), and transition state.\n */\nexport class NavigationNamespace {\n // ═══════════════════════════════════════════════════════════════════════════\n // Functional reference for cyclic dependency\n // ═══════════════════════════════════════════════════════════════════════════\n\n // Dependencies injected via setDependencies (replaces full router reference)\n #canNavigate!: () => boolean;\n #deps!: NavigationDependencies;\n #transitionDeps!: TransitionDependencies;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateNavigateArgs(name: unknown): asserts name is string {\n validateNavigateArgs(name);\n }\n\n static validateNavigateToStateArgs(\n toState: unknown,\n fromState: unknown,\n opts: unknown,\n ): void {\n validateNavigateToStateArgs(toState, fromState, opts);\n }\n\n static validateNavigateToDefaultArgs(opts: unknown): void {\n validateNavigateToDefaultArgs(opts);\n }\n\n static validateNavigationOptions(\n opts: unknown,\n methodName: string,\n ): asserts opts is NavigationOptions {\n validateNavigationOptions(opts, methodName);\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n /**\n * Sets the canNavigate check (cyclic dependency on EventBusNamespace).\n * Must be called before using navigate().\n */\n setCanNavigate(fn: () => boolean): void {\n this.#canNavigate = fn;\n }\n\n /**\n * Sets dependencies for navigation operations.\n * Must be called before using navigation methods.\n */\n setDependencies(deps: NavigationDependencies): void {\n this.#deps = deps;\n }\n\n /**\n * Sets dependencies for transition operations.\n * Must be called before using navigation methods.\n */\n setTransitionDependencies(deps: TransitionDependencies): void {\n this.#transitionDeps = deps;\n }\n\n // =========================================================================\n // Instance methods\n // =========================================================================\n\n /**\n * Navigates to a route by name.\n * Arguments should be pre-parsed and validated by facade.\n */\n async navigate(\n name: string,\n params: Params,\n opts: NavigationOptions,\n ): Promise<State> {\n if (!this.#canNavigate()) {\n throw new RouterError(errorCodes.ROUTER_NOT_STARTED);\n }\n\n const deps = this.#deps;\n\n const result = deps.buildStateWithSegments(name, params);\n\n if (!result) {\n const err = new RouterError(errorCodes.ROUTE_NOT_FOUND);\n\n deps.emitTransitionError(undefined, deps.getState(), err);\n\n throw err;\n }\n\n const { state: route } = result;\n\n const toState = deps.makeState(\n route.name,\n route.params,\n deps.buildPath(route.name, route.params),\n {\n params: route.meta,\n options: opts,\n redirected: opts.redirected ?? false,\n },\n );\n\n const fromState = deps.getState();\n\n if (\n !opts.reload &&\n !opts.force &&\n deps.areStatesEqual(fromState, toState, false)\n ) {\n const err = new RouterError(errorCodes.SAME_STATES);\n\n deps.emitTransitionError(toState, fromState, err);\n\n throw err;\n }\n\n return this.navigateToState(toState, fromState, opts);\n }\n\n /**\n * Internal navigation function that accepts pre-built state.\n * Used by RouterLifecycleNamespace for start() transitions.\n */\n async navigateToState(\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n ): Promise<State> {\n const deps = this.#deps;\n const transitionDeps = this.#transitionDeps;\n\n if (transitionDeps.isTransitioning()) {\n logger.warn(\n \"router.navigate\",\n \"Concurrent navigation detected on shared router instance. \" +\n \"For SSR, use router.clone() to create isolated instance per request.\",\n );\n deps.cancelNavigation();\n }\n\n deps.startTransition(toState, fromState);\n\n try {\n const { state: finalState, meta: transitionOutput } = await transition(\n transitionDeps,\n toState,\n fromState,\n opts,\n );\n\n if (\n finalState.name === constants.UNKNOWN_ROUTE ||\n deps.hasRoute(finalState.name)\n ) {\n const stateWithTransition = NavigationNamespace.#buildSuccessState(\n finalState,\n transitionOutput,\n fromState,\n );\n\n deps.setState(stateWithTransition);\n deps.sendTransitionDone(stateWithTransition, fromState, opts);\n\n return stateWithTransition;\n } else {\n const err = new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: finalState.name,\n });\n\n deps.sendTransitionError(finalState, fromState, err);\n\n throw err;\n }\n } catch (error) {\n this.#routeTransitionError(error, toState, fromState);\n\n throw error;\n }\n }\n\n /**\n * Navigates to the default route if configured.\n * Arguments should be pre-parsed and validated by facade.\n */\n async navigateToDefault(opts: NavigationOptions): Promise<State> {\n const deps = this.#deps;\n const options = deps.getOptions();\n\n if (!options.defaultRoute) {\n throw new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: \"defaultRoute not configured\",\n });\n }\n\n const resolvedRoute = resolveOption(\n options.defaultRoute,\n deps.getDependency,\n );\n\n if (!resolvedRoute) {\n throw new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: \"defaultRoute resolved to empty\",\n });\n }\n\n const resolvedParams = resolveOption(\n options.defaultParams,\n deps.getDependency,\n );\n\n return this.navigate(resolvedRoute, resolvedParams, opts);\n }\n\n // =========================================================================\n // Private methods\n // =========================================================================\n\n /**\n * Builds the final state with frozen TransitionMeta attached.\n */\n static #buildSuccessState(\n finalState: State,\n transitionOutput: TransitionOutput[\"meta\"],\n fromState: State | undefined,\n ): State {\n const transitionMeta: TransitionMeta = {\n phase: transitionOutput.phase,\n ...(fromState?.name !== undefined && { from: fromState.name }),\n reason: \"success\",\n segments: transitionOutput.segments,\n };\n\n Object.freeze(transitionMeta.segments.deactivated);\n Object.freeze(transitionMeta.segments.activated);\n Object.freeze(transitionMeta.segments);\n Object.freeze(transitionMeta);\n\n return {\n ...finalState,\n transition: transitionMeta,\n };\n }\n\n /**\n * Routes a caught transition error to the correct FSM event.\n */\n #routeTransitionError(\n error: unknown,\n toState: State,\n fromState: State | undefined,\n ): void {\n const routerError = error as RouterError;\n\n // Already routed: cancel/stop sent CANCEL, sendTransitionError called in try block\n if (\n routerError.code === errorCodes.TRANSITION_CANCELLED ||\n routerError.code === errorCodes.ROUTE_NOT_FOUND\n ) {\n return;\n }\n\n if (\n routerError.code === errorCodes.CANNOT_ACTIVATE ||\n routerError.code === errorCodes.CANNOT_DEACTIVATE\n ) {\n this.#deps.sendTransitionBlocked(toState, fromState, routerError);\n } else {\n this.#deps.sendTransitionError(toState, fromState, routerError);\n }\n }\n}\n","// packages/core/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts\n\nimport { errorCodes } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\n\nimport type { RouterLifecycleDependencies } from \"./types\";\nimport type { NavigationOptions, State } from \"@real-router/types\";\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// CYCLIC DEPENDENCIES\n// ═══════════════════════════════════════════════════════════════════════════════\n// RouterLifecycle → Navigation.navigateToState() (for start transitions)\n//\n// Solution: functional references configured in Router.#setupDependencies()\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Independent namespace for managing router lifecycle.\n *\n * Handles start() and stop(). Lifecycle state (isActive, isStarted) is managed\n * by RouterFSM in the facade (Router.ts).\n */\nexport class RouterLifecycleNamespace {\n // ═══════════════════════════════════════════════════════════════════════════\n // Functional references for cyclic dependencies\n // ═══════════════════════════════════════════════════════════════════════════\n\n // Dependencies injected via setDependencies (replaces full router reference)\n #navigateToState!: (\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n ) => Promise<State>;\n\n #deps!: RouterLifecycleDependencies;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // =========================================================================\n\n /**\n * Validates start() arguments.\n */\n static validateStartArgs(args: unknown[]): void {\n /* v8 ignore next 4 -- @preserve: facade enforces 1 arg via TypeScript signature */\n if (args.length !== 1 || typeof args[0] !== \"string\") {\n throw new Error(\n \"[router.start] Expected exactly 1 string argument (startPath).\",\n );\n }\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n /**\n * Sets the navigateToState reference (cyclic dependency on NavigationNamespace).\n * Must be called before using start().\n */\n setNavigateToState(\n fn: (\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n ) => Promise<State>,\n ): void {\n this.#navigateToState = fn;\n }\n\n /**\n * Sets dependencies for lifecycle operations.\n * Must be called before using lifecycle methods.\n */\n setDependencies(deps: RouterLifecycleDependencies): void {\n this.#deps = deps;\n }\n\n // =========================================================================\n // Instance methods\n // =========================================================================\n\n /**\n * Starts the router with the given path.\n *\n * Guards (concurrent start, already started) are handled by the facade via\n * RouterFSM state checks before this method is called.\n */\n async start(startPath: string): Promise<State> {\n const deps = this.#deps;\n const options = deps.getOptions();\n\n const startOptions: NavigationOptions = {\n replace: true,\n };\n\n const matchedState = deps.matchPath(startPath);\n\n if (!matchedState && !options.allowNotFound) {\n const err = new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n path: startPath,\n });\n\n deps.emitTransitionError(undefined, undefined, err);\n\n throw err;\n }\n\n deps.completeStart();\n\n let finalState: State;\n\n if (matchedState) {\n finalState = await this.#navigateToState(\n matchedState,\n undefined,\n startOptions,\n );\n } else {\n const notFoundState = deps.makeNotFoundState(startPath, startOptions);\n\n finalState = await this.#navigateToState(\n notFoundState,\n undefined,\n startOptions,\n );\n }\n\n return finalState;\n }\n\n /**\n * Stops the router and resets state.\n *\n * Called only for READY/TRANSITIONING states (facade handles STARTING/IDLE/DISPOSED).\n */\n stop(): void {\n this.#deps.setState();\n }\n}\n","// packages/core/src/namespaces/CloneNamespace/CloneNamespace.ts\n\nimport { getTypeDescription } from \"type-guards\";\n\nimport type { ApplyConfigFn, CloneData, RouterFactory } from \"./types\";\nimport type { Router } from \"../../Router\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\n/**\n * Independent namespace for router cloning operations.\n *\n * This namespace handles the logic of collecting data from a source router\n * and creating a configured clone. It requires a factory function to create\n * the new router instance.\n */\nexport class CloneNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n // =========================================================================\n // Instance fields\n // =========================================================================\n\n /**\n * Function to get cloning data from the source router.\n */\n #getCloneData!: () => CloneData<Dependencies>;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // =========================================================================\n\n /**\n * Validates clone arguments.\n * Dependencies can be undefined or a plain object without getters.\n */\n static validateCloneArgs(dependencies: unknown): void {\n // undefined is valid (no new dependencies)\n if (dependencies === undefined) {\n return;\n }\n\n // Must be a plain object\n if (\n !(\n dependencies &&\n typeof dependencies === \"object\" &&\n dependencies.constructor === Object\n )\n ) {\n throw new TypeError(\n `[router.clone] Invalid dependencies: expected plain object or undefined, received ${getTypeDescription(dependencies)}`,\n );\n }\n\n // Getters can throw, return different values, or have side effects\n for (const key in dependencies) {\n if (Object.getOwnPropertyDescriptor(dependencies, key)?.get) {\n throw new TypeError(\n `[router.clone] Getters not allowed in dependencies: \"${key}\"`,\n );\n }\n }\n }\n\n /**\n * Sets the function to collect clone data.\n */\n setGetCloneData(getCloneData: () => CloneData<Dependencies>): void {\n this.#getCloneData = getCloneData;\n }\n\n /**\n * Creates a clone of the router with optional new dependencies.\n *\n * @param dependencies - Optional new dependencies for the cloned router\n * @param factory - Factory function to create the new router instance\n * @param applyConfig - Function to apply route config to the new router\n */\n clone(\n dependencies: Dependencies | undefined,\n factory: RouterFactory<Dependencies>,\n applyConfig: ApplyConfigFn<Dependencies>,\n ): Router<Dependencies> {\n // Collect all data from source router\n const data = this.#getCloneData();\n\n // Merge dependencies\n const mergedDeps = {\n ...data.dependencies,\n ...dependencies,\n } as Dependencies;\n\n // Create new router instance\n const newRouter = factory(data.routes, data.options, mergedDeps);\n\n // Copy lifecycle factories\n for (const [name, handler] of Object.entries(data.canDeactivateFactories)) {\n newRouter.addDeactivateGuard(name, handler);\n }\n\n for (const [name, handler] of Object.entries(data.canActivateFactories)) {\n newRouter.addActivateGuard(name, handler);\n }\n\n // Copy middleware factories\n if (data.middlewareFactories.length > 0) {\n newRouter.useMiddleware(...data.middlewareFactories);\n }\n\n // Copy plugin factories\n if (data.pluginFactories.length > 0) {\n newRouter.usePlugin(...data.pluginFactories);\n }\n\n // Apply route config (decoders, encoders, defaultParams, forwardMap)\n applyConfig(newRouter, data.routeConfig, data.resolvedForwardMap);\n\n return newRouter;\n }\n}\n","// packages/core/src/namespaces/EventBusNamespace/EventBusNamespace.ts\n\nimport { events, validEventNames } from \"../../constants\";\nimport { routerEvents, routerStates } from \"../../fsm\";\n\nimport type { EventBusOptions } from \"./types\";\nimport type { RouterEvent, RouterPayloads, RouterState } from \"../../fsm\";\nimport type { RouterError } from \"../../RouterError\";\nimport type { EventMethodMap, RouterEventMap } from \"../../types\";\nimport type { FSM } from \"@real-router/fsm\";\nimport type {\n EventName,\n NavigationOptions,\n Plugin,\n State,\n SubscribeFn,\n Unsubscribe,\n} from \"@real-router/types\";\nimport type { EventEmitter } from \"event-emitter\";\n\nexport class EventBusNamespace {\n readonly #fsm: FSM<RouterState, RouterEvent, null, RouterPayloads>;\n readonly #emitter: EventEmitter<RouterEventMap>;\n\n #currentToState: State | undefined;\n\n constructor(options: EventBusOptions) {\n this.#fsm = options.routerFSM;\n this.#emitter = options.emitter;\n this.#currentToState = undefined;\n this.#setupFSMActions();\n }\n\n static validateEventName(eventName: unknown): void {\n if (!validEventNames.has(eventName as EventName)) {\n throw new Error(`Invalid event name: ${String(eventName)}`);\n }\n }\n\n static validateListenerArgs<E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ): void {\n EventBusNamespace.validateEventName(eventName);\n\n if (typeof cb !== \"function\") {\n throw new TypeError(\n `Expected callback to be a function for event ${eventName}`,\n );\n }\n }\n\n static validateSubscribeListener(listener: unknown): void {\n if (typeof listener !== \"function\") {\n throw new TypeError(\n \"[router.subscribe] Expected a function. \" +\n \"For Observable pattern use @real-router/rx package\",\n );\n }\n }\n\n emitRouterStart(): void {\n this.#emitter.emit(events.ROUTER_START);\n }\n\n emitRouterStop(): void {\n this.#emitter.emit(events.ROUTER_STOP);\n }\n\n emitTransitionStart(toState: State, fromState?: State): void {\n this.#emitter.emit(events.TRANSITION_START, toState, fromState);\n }\n\n emitTransitionSuccess(\n toState: State,\n fromState?: State,\n opts?: NavigationOptions,\n ): void {\n this.#emitter.emit(events.TRANSITION_SUCCESS, toState, fromState, opts);\n }\n\n emitTransitionError(\n toState?: State,\n fromState?: State,\n error?: RouterError,\n ): void {\n this.#emitter.emit(events.TRANSITION_ERROR, toState, fromState, error);\n }\n\n emitTransitionCancel(toState: State, fromState?: State): void {\n this.#emitter.emit(events.TRANSITION_CANCEL, toState, fromState);\n }\n\n sendStart(): void {\n this.#fsm.send(routerEvents.START);\n }\n\n sendStop(): void {\n this.#fsm.send(routerEvents.STOP);\n }\n\n sendDispose(): void {\n this.#fsm.send(routerEvents.DISPOSE);\n }\n\n completeStart(): void {\n this.#fsm.send(routerEvents.STARTED);\n }\n\n beginTransition(toState: State, fromState?: State): void {\n this.#currentToState = toState;\n this.#fsm.send(routerEvents.NAVIGATE, { toState, fromState });\n }\n\n completeTransition(\n state: State,\n fromState?: State,\n opts: NavigationOptions = {},\n ): void {\n this.#fsm.send(routerEvents.COMPLETE, {\n state,\n fromState,\n opts,\n });\n this.#currentToState = undefined;\n }\n\n failTransition(toState?: State, fromState?: State, error?: unknown): void {\n this.#fsm.send(routerEvents.FAIL, { toState, fromState, error });\n this.#currentToState = undefined;\n }\n\n cancelTransition(toState: State, fromState?: State): void {\n this.#fsm.send(routerEvents.CANCEL, { toState, fromState });\n this.#currentToState = undefined;\n }\n\n emitOrFailTransitionError(\n toState?: State,\n fromState?: State,\n error?: unknown,\n ): void {\n if (this.#fsm.getState() === routerStates.READY) {\n this.#fsm.send(routerEvents.FAIL, { toState, fromState, error });\n } else {\n // TRANSITIONING: concurrent navigation with invalid args.\n // Direct emit to avoid disturbing the ongoing transition.\n this.emitTransitionError(toState, fromState, error as RouterError);\n }\n }\n\n canBeginTransition(): boolean {\n return this.#fsm.canSend(routerEvents.NAVIGATE);\n }\n\n canStart(): boolean {\n return this.#fsm.canSend(routerEvents.START);\n }\n\n canCancel(): boolean {\n return this.#fsm.canSend(routerEvents.CANCEL);\n }\n\n isActive(): boolean {\n const s = this.#fsm.getState();\n\n return s !== routerStates.IDLE && s !== routerStates.DISPOSED;\n }\n\n isDisposed(): boolean {\n return this.#fsm.getState() === routerStates.DISPOSED;\n }\n\n isTransitioning(): boolean {\n return this.#fsm.getState() === routerStates.TRANSITIONING;\n }\n\n isReady(): boolean {\n return this.#fsm.getState() === routerStates.READY;\n }\n\n getCurrentToState(): State | undefined {\n return this.#currentToState;\n }\n\n addEventListener<E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ): Unsubscribe {\n return this.#emitter.on(\n eventName,\n cb as (...args: RouterEventMap[typeof eventName]) => void,\n );\n }\n\n subscribe(listener: SubscribeFn): Unsubscribe {\n return this.#emitter.on(\n events.TRANSITION_SUCCESS,\n (toState: State, fromState?: State) => {\n listener({ route: toState, previousRoute: fromState });\n },\n );\n }\n\n clearAll(): void {\n this.#emitter.clearAll();\n }\n\n setLimits(limits: {\n maxListeners: number;\n warnListeners: number;\n maxEventDepth: number;\n }): void {\n this.#emitter.setLimits(limits);\n }\n\n cancelTransitionIfRunning(fromState: State | undefined): void {\n if (!this.canCancel()) {\n return;\n }\n\n this.cancelTransition(this.#currentToState!, fromState); // eslint-disable-line @typescript-eslint/no-non-null-assertion -- guaranteed set before TRANSITIONING\n }\n\n #setupFSMActions(): void {\n const fsm = this.#fsm;\n\n fsm.on(routerStates.STARTING, routerEvents.STARTED, () => {\n this.emitRouterStart();\n });\n\n fsm.on(routerStates.READY, routerEvents.STOP, () => {\n this.emitRouterStop();\n });\n\n fsm.on(routerStates.READY, routerEvents.NAVIGATE, (params) => {\n this.emitTransitionStart(params.toState, params.fromState);\n });\n\n fsm.on(routerStates.TRANSITIONING, routerEvents.COMPLETE, (params) => {\n this.emitTransitionSuccess(params.state, params.fromState, params.opts);\n });\n\n fsm.on(routerStates.TRANSITIONING, routerEvents.CANCEL, (params) => {\n this.emitTransitionCancel(params.toState, params.fromState);\n });\n\n fsm.on(routerStates.STARTING, routerEvents.FAIL, (params) => {\n this.emitTransitionError(\n params.toState,\n params.fromState,\n params.error as RouterError | undefined,\n );\n });\n\n fsm.on(routerStates.READY, routerEvents.FAIL, (params) => {\n this.emitTransitionError(\n params.toState,\n params.fromState,\n params.error as RouterError | undefined,\n );\n });\n\n fsm.on(routerStates.TRANSITIONING, routerEvents.FAIL, (params) => {\n this.emitTransitionError(\n params.toState,\n params.fromState,\n params.error as RouterError | undefined,\n );\n });\n }\n}\n","// packages/core/src/namespaces/RouterLifecycleNamespace/constants.ts\n\nimport { errorCodes } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\n\n// =============================================================================\n// Cached Errors (Performance Optimization)\n// =============================================================================\n// Pre-create error instances to avoid object allocation on hot paths.\n// Error creation involves: new object, stack trace capture (~500ns-2μs).\n// Cached errors skip this overhead entirely.\n//\n// Trade-off: All error instances share the same stack trace (points here).\n// This is acceptable because:\n// 1. These errors indicate user misconfiguration, not internal bugs\n// 2. Error code and message are sufficient for debugging\n// 3. Performance gain (~80% for error paths) outweighs stack trace loss\n// =============================================================================\n\n/**\n * Cached error for start() called when router is already started/starting.\n */\nexport const CACHED_ALREADY_STARTED_ERROR = new RouterError(\n errorCodes.ROUTER_ALREADY_STARTED,\n);\n","// packages/real-router/modules/typeGuards.ts\n\n/**\n * Re-export common type guards from centralized type-guards package\n */\nimport type { LoggerConfig, LogLevelConfig } from \"@real-router/logger\";\n\nexport {\n isObjKey,\n isString,\n isState,\n isParams,\n isNavigationOptions,\n isPromise,\n isBoolean,\n validateRouteName,\n} from \"type-guards\";\n\n/**\n * RealRouter-specific type guards for logger configuration\n */\n\nconst VALID_LEVELS_SET = new Set<string>([\"all\", \"warn-error\", \"error-only\"]);\n\nfunction isValidLevel(value: unknown): value is LogLevelConfig {\n return typeof value === \"string\" && VALID_LEVELS_SET.has(value);\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `\"${value}\"`;\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(value);\n}\n\nexport function isLoggerConfig(config: unknown): config is LoggerConfig {\n if (typeof config !== \"object\" || config === null) {\n throw new TypeError(\"Logger config must be an object\");\n }\n\n const obj = config;\n\n // Check for unknown properties\n for (const key of Object.keys(obj)) {\n if (key !== \"level\" && key !== \"callback\") {\n throw new TypeError(`Unknown logger config property: \"${key}\"`);\n }\n }\n\n // Validate level if present\n if (\"level\" in obj && obj.level !== undefined && !isValidLevel(obj.level)) {\n throw new TypeError(\n `Invalid logger level: ${formatValue(obj.level)}. Expected: \"all\" | \"warn-error\" | \"error-only\"`,\n );\n }\n\n // Validate callback if present\n if (\n \"callback\" in obj &&\n obj.callback !== undefined &&\n typeof obj.callback !== \"function\"\n ) {\n throw new TypeError(\n `Logger callback must be a function, got ${typeof obj.callback}`,\n );\n }\n\n return true;\n}\n","// packages/core/src/wiring/RouterWiringBuilder.ts\n\nimport type { EventBusNamespace } from \"../namespaces\";\nimport type { WiringOptions } from \"./types\";\nimport type { MiddlewareDependencies } from \"../namespaces/MiddlewareNamespace\";\nimport type {\n NavigationDependencies,\n TransitionDependencies,\n} from \"../namespaces/NavigationNamespace\";\nimport type { PluginsDependencies } from \"../namespaces/PluginsNamespace\";\nimport type { RouteLifecycleDependencies } from \"../namespaces/RouteLifecycleNamespace\";\nimport type { RouterLifecycleDependencies } from \"../namespaces/RouterLifecycleNamespace\";\nimport type { RoutesDependencies } from \"../namespaces/RoutesNamespace\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\nexport class RouterWiringBuilder<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n private readonly router: WiringOptions<Dependencies>[\"router\"];\n private readonly options: WiringOptions<Dependencies>[\"options\"];\n private readonly limits: WiringOptions<Dependencies>[\"limits\"];\n private readonly dependencies: WiringOptions<Dependencies>[\"dependencies\"];\n private readonly state: WiringOptions<Dependencies>[\"state\"];\n private readonly routes: WiringOptions<Dependencies>[\"routes\"];\n private readonly routeLifecycle: WiringOptions<Dependencies>[\"routeLifecycle\"];\n private readonly middleware: WiringOptions<Dependencies>[\"middleware\"];\n private readonly plugins: WiringOptions<Dependencies>[\"plugins\"];\n private readonly navigation: WiringOptions<Dependencies>[\"navigation\"];\n private readonly lifecycle: WiringOptions<Dependencies>[\"lifecycle\"];\n private readonly clone: WiringOptions<Dependencies>[\"clone\"];\n private readonly eventBus: EventBusNamespace;\n\n constructor(wiringOptions: WiringOptions<Dependencies>) {\n this.router = wiringOptions.router;\n this.options = wiringOptions.options;\n this.limits = wiringOptions.limits;\n this.dependencies = wiringOptions.dependencies;\n this.state = wiringOptions.state;\n this.routes = wiringOptions.routes;\n this.routeLifecycle = wiringOptions.routeLifecycle;\n this.middleware = wiringOptions.middleware;\n this.plugins = wiringOptions.plugins;\n this.navigation = wiringOptions.navigation;\n this.lifecycle = wiringOptions.lifecycle;\n this.clone = wiringOptions.clone;\n this.eventBus = wiringOptions.eventBus;\n }\n\n wireLimits(): void {\n this.dependencies.setLimits(this.limits);\n this.plugins.setLimits(this.limits);\n this.middleware.setLimits(this.limits);\n this.eventBus.setLimits({\n maxListeners: this.limits.maxListeners,\n warnListeners: this.limits.warnListeners,\n maxEventDepth: this.limits.maxEventDepth,\n });\n this.routeLifecycle.setLimits(this.limits);\n }\n\n wireRouteLifecycleDeps(): void {\n this.routeLifecycle.setRouter(this.router);\n\n const routeLifecycleDeps: RouteLifecycleDependencies<Dependencies> = {\n getDependency: <K extends keyof Dependencies>(dependencyName: K) =>\n this.dependencies.get(dependencyName),\n };\n\n this.routeLifecycle.setDependencies(routeLifecycleDeps);\n }\n\n wireRoutesDeps(): void {\n const routesDeps: RoutesDependencies<Dependencies> = {\n addActivateGuard: (name, handler) => {\n this.router.addActivateGuard(name, handler);\n },\n addDeactivateGuard: (name, handler) => {\n this.router.addDeactivateGuard(name, handler);\n },\n makeState: (name, params, path, meta) =>\n this.state.makeState(name, params, path, meta),\n getState: () => this.state.get(),\n areStatesEqual: (state1, state2, ignoreQueryParams) =>\n this.state.areStatesEqual(state1, state2, ignoreQueryParams),\n getDependency: (name) => this.dependencies.get(name),\n forwardState: (name, params) => this.router.forwardState(name, params),\n };\n\n this.routes.setDependencies(routesDeps);\n this.routes.setLifecycleNamespace(this.routeLifecycle);\n }\n\n wireMiddlewareDeps(): void {\n this.middleware.setRouter(this.router);\n\n const middlewareDeps: MiddlewareDependencies<Dependencies> = {\n getDependency: <K extends keyof Dependencies>(dependencyName: K) =>\n this.dependencies.get(dependencyName),\n };\n\n this.middleware.setDependencies(middlewareDeps);\n }\n\n wirePluginsDeps(): void {\n this.plugins.setRouter(this.router);\n\n const pluginsDeps: PluginsDependencies<Dependencies> = {\n addEventListener: (eventName, cb) =>\n this.eventBus.addEventListener(eventName, cb),\n canNavigate: () => this.eventBus.canBeginTransition(),\n getDependency: <K extends keyof Dependencies>(dependencyName: K) =>\n this.dependencies.get(dependencyName),\n };\n\n this.plugins.setDependencies(pluginsDeps);\n }\n\n wireNavigationDeps(): void {\n const navigationDeps: NavigationDependencies = {\n getOptions: () => this.options.get(),\n hasRoute: (name) => this.routes.hasRoute(name),\n getState: () => this.state.get(),\n setState: (state) => {\n this.state.set(state);\n },\n buildStateWithSegments: (routeName, routeParams) => {\n const { name, params } = this.router.forwardState(\n routeName,\n routeParams,\n );\n\n return this.routes.buildStateWithSegmentsResolved(name, params);\n },\n makeState: (name, params, path, meta) =>\n this.state.makeState(name, params, path, meta),\n buildPath: (route, params) =>\n this.routes.buildPath(route, params, this.options.get()),\n areStatesEqual: (state1, state2, ignoreQueryParams) =>\n this.state.areStatesEqual(state1, state2, ignoreQueryParams),\n getDependency: (name: string) =>\n this.dependencies.get(name as keyof Dependencies),\n startTransition: (toState, fromState) => {\n this.eventBus.beginTransition(toState, fromState);\n },\n cancelNavigation: () => {\n this.eventBus.cancelTransition(\n this.eventBus.getCurrentToState()!, // eslint-disable-line @typescript-eslint/no-non-null-assertion -- guaranteed set before TRANSITIONING\n this.state.get(),\n );\n },\n sendTransitionDone: (state, fromState, opts) => {\n this.eventBus.completeTransition(state, fromState, opts);\n },\n sendTransitionBlocked: (toState, fromState, error) => {\n this.eventBus.failTransition(toState, fromState, error);\n },\n sendTransitionError: (toState, fromState, error) => {\n this.eventBus.failTransition(toState, fromState, error);\n },\n emitTransitionError: (toState, fromState, error) => {\n this.eventBus.emitOrFailTransitionError(toState, fromState, error);\n },\n };\n\n this.navigation.setDependencies(navigationDeps);\n\n const transitionDeps: TransitionDependencies = {\n getLifecycleFunctions: () => this.routeLifecycle.getFunctions(),\n getMiddlewareFunctions: () => this.middleware.getFunctions(),\n isActive: () => this.router.isActive(),\n isTransitioning: () => this.eventBus.isTransitioning(),\n clearCanDeactivate: (name) => {\n this.routeLifecycle.clearCanDeactivate(name);\n },\n };\n\n this.navigation.setTransitionDependencies(transitionDeps);\n }\n\n wireLifecycleDeps(): void {\n const lifecycleDeps: RouterLifecycleDependencies = {\n getOptions: () => this.options.get(),\n makeNotFoundState: (path, options) =>\n this.state.makeNotFoundState(path, options),\n setState: (state) => {\n this.state.set(state);\n },\n matchPath: (path, source?: string) =>\n this.routes.matchPath(path, source, this.options.get()),\n completeStart: () => {\n this.eventBus.completeStart();\n },\n emitTransitionError: (toState, fromState, error) => {\n this.eventBus.failTransition(toState, fromState, error);\n },\n };\n\n this.lifecycle.setDependencies(lifecycleDeps);\n }\n\n wireStateDeps(): void {\n this.state.setDependencies({\n getDefaultParams: () => this.routes.getConfig().defaultParams,\n buildPath: (name, params) =>\n this.routes.buildPath(name, params, this.options.get()),\n getUrlParams: (name) => this.routes.getUrlParams(name),\n });\n }\n\n wireCloneCallbacks(): void {\n this.clone.setGetCloneData(() => {\n const [canDeactivateFactories, canActivateFactories] =\n this.routeLifecycle.getFactories();\n\n return {\n routes: this.routes.cloneRoutes(),\n options: { ...this.options.get() },\n dependencies: this.dependencies.getAll(),\n canDeactivateFactories,\n canActivateFactories,\n middlewareFactories: this.middleware.getFactories(),\n pluginFactories: this.plugins.getAll(),\n routeConfig: this.routes.getConfig(),\n resolvedForwardMap: this.routes.getResolvedForwardMap(),\n };\n });\n }\n\n wireCyclicDeps(): void {\n this.navigation.setCanNavigate(() => this.eventBus.canBeginTransition());\n\n this.lifecycle.setNavigateToState((toState, fromState, opts) =>\n this.navigation.navigateToState(toState, fromState, opts),\n );\n }\n}\n","// packages/core/src/wiring/wireRouter.ts\n\nimport type { RouterWiringBuilder } from \"./RouterWiringBuilder\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\n/**\n * Director function — calls RouterWiringBuilder methods in the correct dependency order.\n *\n * ORDER MATTERS:\n * - `wireLimits()` first: all namespaces must have limits before any other setup\n * - `wireRouteLifecycleDeps()` BEFORE `wireRoutesDeps()`: RoutesNamespace.setDependencies()\n * registers pending canActivate handlers which require RouteLifecycleNamespace to be ready\n * - `wireCyclicDeps()` LAST: resolves circular references between NavigationNamespace and\n * RouterLifecycleNamespace (they depend on each other via direct property assignment)\n */\nexport function wireRouter<Dependencies extends DefaultDependencies>(\n builder: RouterWiringBuilder<Dependencies>,\n): void {\n builder.wireLimits();\n builder.wireRouteLifecycleDeps();\n builder.wireRoutesDeps();\n builder.wireMiddlewareDeps();\n builder.wirePluginsDeps();\n builder.wireNavigationDeps();\n builder.wireLifecycleDeps();\n builder.wireStateDeps();\n builder.wireCloneCallbacks();\n builder.wireCyclicDeps();\n}\n","// packages/core/src/Router.ts\n/* eslint-disable unicorn/prefer-event-target -- custom EventEmitter package, not Node.js EventEmitter */\n\n/**\n * Router class - facade with integrated namespaces.\n *\n * All functionality is now provided by namespace classes.\n */\n\nimport { logger } from \"@real-router/logger\";\nimport { EventEmitter } from \"event-emitter\";\nimport { validateRouteName } from \"type-guards\";\n\nimport { errorCodes } from \"./constants\";\nimport { createRouterFSM } from \"./fsm\";\nimport { createLimits } from \"./helpers\";\nimport {\n CloneNamespace,\n DependenciesNamespace,\n EventBusNamespace,\n MiddlewareNamespace,\n NavigationNamespace,\n OptionsNamespace,\n PluginsNamespace,\n RouteLifecycleNamespace,\n RouterLifecycleNamespace,\n RoutesNamespace,\n StateNamespace,\n} from \"./namespaces\";\nimport { CACHED_ALREADY_STARTED_ERROR } from \"./namespaces/RouterLifecycleNamespace/constants\";\nimport { RouterError } from \"./RouterError\";\nimport { getTransitionPath } from \"./transitionPath\";\nimport { isLoggerConfig } from \"./typeGuards\";\nimport { RouterWiringBuilder, wireRouter } from \"./wiring\";\n\nimport type {\n ActivationFnFactory,\n EventMethodMap,\n Limits,\n MiddlewareFactory,\n PluginFactory,\n Route,\n RouteConfigUpdate,\n RouterEventMap,\n} from \"./types\";\nimport type {\n DefaultDependencies,\n EventName,\n NavigationOptions,\n Options,\n Params,\n Plugin,\n RouteTreeState,\n SimpleState,\n State,\n StateMetaInput,\n SubscribeFn,\n Unsubscribe,\n} from \"@real-router/types\";\nimport type { CreateMatcherOptions } from \"route-tree\";\n\n/**\n * Router class with integrated namespace architecture.\n *\n * All functionality is provided by namespace classes:\n * - OptionsNamespace: getOptions (immutable)\n * - DependenciesNamespace: get/set/remove dependencies\n * - EventEmitter: event listeners, subscribe\n * - StateNamespace: state storage (getState, setState, getPreviousState)\n * - RoutesNamespace: route tree operations\n * - RouteLifecycleNamespace: canActivate/canDeactivate guards\n * - MiddlewareNamespace: middleware chain\n * - PluginsNamespace: plugin lifecycle\n * - NavigationNamespace: navigate, navigateToState\n * - RouterLifecycleNamespace: start, stop, isStarted\n *\n * @internal This class implementation is internal. Use createRouter() instead.\n */\nexport class Router<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n // Index signatures to satisfy interface\n [key: string]: unknown;\n\n // ============================================================================\n // Namespaces\n // ============================================================================\n\n readonly #options: OptionsNamespace;\n readonly #limits: Limits;\n readonly #dependencies: DependenciesNamespace<Dependencies>;\n readonly #state: StateNamespace;\n readonly #routes: RoutesNamespace<Dependencies>;\n readonly #routeLifecycle: RouteLifecycleNamespace<Dependencies>;\n readonly #middleware: MiddlewareNamespace<Dependencies>;\n readonly #plugins: PluginsNamespace<Dependencies>;\n readonly #navigation: NavigationNamespace;\n readonly #lifecycle: RouterLifecycleNamespace;\n readonly #clone: CloneNamespace<Dependencies>;\n\n readonly #eventBus: EventBusNamespace;\n\n /**\n * When true, skips argument validation in public methods for production performance.\n * Constructor options are always validated (needed to validate noValidate itself).\n */\n readonly #noValidate: boolean;\n\n // ============================================================================\n // Constructor\n // ============================================================================\n\n /**\n * @param routes - Route definitions\n * @param options - Router options\n * @param dependencies - DI dependencies\n */\n constructor(\n routes: Route<Dependencies>[] = [],\n options: Partial<Options> = {},\n dependencies: Dependencies = {} as Dependencies,\n ) {\n // Configure logger if provided\n if (options.logger && isLoggerConfig(options.logger)) {\n logger.configure(options.logger);\n delete options.logger;\n }\n\n // =========================================================================\n // Validate inputs before creating namespaces\n // =========================================================================\n\n // Always validate options (needed to validate noValidate itself)\n OptionsNamespace.validateOptions(options, \"constructor\");\n\n // Extract noValidate BEFORE creating namespaces\n const noValidate = options.noValidate ?? false;\n\n // Conditional validation for dependencies\n if (!noValidate) {\n DependenciesNamespace.validateDependenciesObject(\n dependencies,\n \"constructor\",\n );\n }\n\n // Conditional validation for initial routes - structure and batch duplicates\n // Validation happens BEFORE tree is built, so tree is not passed\n if (!noValidate && routes.length > 0) {\n RoutesNamespace.validateAddRouteArgs(routes);\n RoutesNamespace.validateRoutes(routes);\n }\n\n // =========================================================================\n // Create Namespaces\n // =========================================================================\n\n this.#options = new OptionsNamespace(options);\n this.#limits = createLimits(options.limits);\n this.#dependencies = new DependenciesNamespace<Dependencies>(dependencies);\n this.#state = new StateNamespace();\n this.#routes = new RoutesNamespace<Dependencies>(\n routes,\n noValidate,\n deriveMatcherOptions(this.#options.get()),\n );\n this.#routeLifecycle = new RouteLifecycleNamespace<Dependencies>();\n this.#middleware = new MiddlewareNamespace<Dependencies>();\n this.#plugins = new PluginsNamespace<Dependencies>();\n this.#navigation = new NavigationNamespace();\n this.#lifecycle = new RouterLifecycleNamespace();\n this.#clone = new CloneNamespace<Dependencies>();\n this.#noValidate = noValidate;\n\n // =========================================================================\n // Initialize EventBus\n // =========================================================================\n\n const routerFSM = createRouterFSM();\n const emitter = new EventEmitter<RouterEventMap>({\n onListenerError: (eventName, error) => {\n logger.error(\"Router\", `Error in listener for ${eventName}:`, error);\n },\n onListenerWarn: (eventName, count) => {\n logger.warn(\n \"router.addEventListener\",\n `Event \"${eventName}\" has ${count} listeners — possible memory leak`,\n );\n },\n });\n\n this.#eventBus = new EventBusNamespace({ routerFSM, emitter });\n\n // =========================================================================\n // Wire Dependencies\n // =========================================================================\n\n wireRouter(\n new RouterWiringBuilder<Dependencies>({\n router: this,\n options: this.#options,\n limits: this.#limits,\n dependencies: this.#dependencies,\n state: this.#state,\n routes: this.#routes,\n routeLifecycle: this.#routeLifecycle,\n middleware: this.#middleware,\n plugins: this.#plugins,\n navigation: this.#navigation,\n lifecycle: this.#lifecycle,\n clone: this.#clone,\n eventBus: this.#eventBus,\n }),\n );\n\n // =========================================================================\n // Bind Public Methods\n // =========================================================================\n // All public methods that access private fields must be bound to preserve\n // `this` context when methods are extracted as references.\n // See: https://github.com/nicolo-ribaudo/tc39-proposal-bind-operator\n // =========================================================================\n\n // Route Management\n this.addRoute = this.addRoute.bind(this);\n this.removeRoute = this.removeRoute.bind(this);\n this.clearRoutes = this.clearRoutes.bind(this);\n this.getRoute = this.getRoute.bind(this);\n this.hasRoute = this.hasRoute.bind(this);\n this.updateRoute = this.updateRoute.bind(this);\n\n // Path & State Building\n this.isActiveRoute = this.isActiveRoute.bind(this);\n this.buildPath = this.buildPath.bind(this);\n this.matchPath = this.matchPath.bind(this);\n this.setRootPath = this.setRootPath.bind(this);\n this.getRootPath = this.getRootPath.bind(this);\n\n // State Management\n this.makeState = this.makeState.bind(this);\n this.getState = this.getState.bind(this);\n this.getPreviousState = this.getPreviousState.bind(this);\n this.areStatesEqual = this.areStatesEqual.bind(this);\n this.forwardState = this.forwardState.bind(this);\n this.buildState = this.buildState.bind(this);\n this.buildNavigationState = this.buildNavigationState.bind(this);\n this.shouldUpdateNode = this.shouldUpdateNode.bind(this);\n\n // Options\n this.getOptions = this.getOptions.bind(this);\n\n // Router Lifecycle\n this.isActive = this.isActive.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.dispose = this.dispose.bind(this);\n\n // Route Lifecycle (Guards)\n this.addActivateGuard = this.addActivateGuard.bind(this);\n this.addDeactivateGuard = this.addDeactivateGuard.bind(this);\n this.removeActivateGuard = this.removeActivateGuard.bind(this);\n this.removeDeactivateGuard = this.removeDeactivateGuard.bind(this);\n this.canNavigateTo = this.canNavigateTo.bind(this);\n\n // Plugins\n this.usePlugin = this.usePlugin.bind(this);\n\n // Middleware\n this.useMiddleware = this.useMiddleware.bind(this);\n // Dependencies\n this.setDependency = this.setDependency.bind(this);\n this.setDependencies = this.setDependencies.bind(this);\n this.getDependency = this.getDependency.bind(this);\n this.getDependencies = this.getDependencies.bind(this);\n this.removeDependency = this.removeDependency.bind(this);\n this.hasDependency = this.hasDependency.bind(this);\n this.resetDependencies = this.resetDependencies.bind(this);\n\n // Events\n this.addEventListener = this.addEventListener.bind(this);\n\n // Navigation\n this.navigate = this.navigate.bind(this);\n this.navigateToDefault = this.navigateToDefault.bind(this);\n this.navigateToState = this.navigateToState.bind(this);\n\n // Subscription\n this.subscribe = this.subscribe.bind(this);\n\n // Cloning\n this.clone = this.clone.bind(this);\n }\n\n // ============================================================================\n // Route Management\n // ============================================================================\n\n addRoute(\n routes: Route<Dependencies>[] | Route<Dependencies>,\n options?: { parent?: string },\n ): this {\n const routeArray = Array.isArray(routes) ? routes : [routes];\n const parentName = options?.parent;\n\n if (!this.#noValidate) {\n // 1. Validate parent option format\n if (parentName !== undefined) {\n RoutesNamespace.validateParentOption(parentName);\n }\n\n // 2. Static validation (route structure and properties)\n RoutesNamespace.validateAddRouteArgs(routeArray);\n\n // 3. State-dependent validation (parent exists, duplicates, forwardTo)\n RoutesNamespace.validateRoutes(\n routeArray,\n this.#routes.getTree(),\n this.#routes.getForwardRecord(),\n parentName,\n );\n }\n\n // 4. Execute (add definitions, register handlers, rebuild tree)\n this.#routes.addRoutes(routeArray, parentName);\n\n return this;\n }\n\n removeRoute(name: string): this {\n // Static validation\n if (!this.#noValidate) {\n RoutesNamespace.validateRemoveRouteArgs(name);\n }\n\n // Instance validation (checks active route, navigation state)\n const canRemove = this.#routes.validateRemoveRoute(\n name,\n this.#state.get()?.name,\n this.#eventBus.isTransitioning(),\n );\n\n if (!canRemove) {\n return this;\n }\n\n // Perform removal\n const wasRemoved = this.#routes.removeRoute(name);\n\n if (!wasRemoved) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" not found. No changes made.`,\n );\n }\n\n return this;\n }\n\n clearRoutes(): this {\n const isNavigating = this.#eventBus.isTransitioning();\n\n // Validate operation can proceed\n const canClear = this.#routes.validateClearRoutes(isNavigating);\n\n if (!canClear) {\n return this;\n }\n\n // Clear routes config (definitions, decoders, encoders, defaultParams, forwardMap)\n this.#routes.clearRoutes();\n\n // Clear all lifecycle handlers\n this.#routeLifecycle.clearAll();\n\n // Clear router state since all routes are removed\n this.#state.set(undefined);\n\n return this;\n }\n\n getRoute(name: string): Route<Dependencies> | undefined {\n if (!this.#noValidate) {\n validateRouteName(name, \"getRoute\");\n }\n\n return this.#routes.getRoute(name);\n }\n\n hasRoute(name: string): boolean {\n if (!this.#noValidate) {\n validateRouteName(name, \"hasRoute\");\n }\n\n return this.#routes.hasRoute(name);\n }\n\n updateRoute(name: string, updates: RouteConfigUpdate<Dependencies>): this {\n // Validate name and updates object structure (basic checks only)\n if (!this.#noValidate) {\n RoutesNamespace.validateUpdateRouteBasicArgs(name, updates);\n }\n\n // Cache all property values upfront to protect against mutating getters.\n // This ensures consistent behavior regardless of getter side effects.\n // Must happen AFTER basic validation but BEFORE property type validation.\n const {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n canActivate,\n canDeactivate,\n } = updates;\n\n // Validate cached property values\n if (!this.#noValidate) {\n RoutesNamespace.validateUpdateRoutePropertyTypes(\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n );\n }\n\n // Warn if navigation is in progress\n if (this.#eventBus.isTransitioning()) {\n logger.error(\n \"router.updateRoute\",\n `Updating route \"${name}\" while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n // Instance validation (route existence, forwardTo checks) - use cached values\n if (!this.#noValidate) {\n this.#routes.validateUpdateRoute(name, forwardTo);\n }\n\n // Update route config\n this.#routes.updateRouteConfig(name, {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n });\n\n // Handle canActivate separately (uses RouteLifecycleNamespace)\n // Use facade method for proper validation\n if (canActivate !== undefined) {\n if (canActivate === null) {\n this.#routeLifecycle.clearCanActivate(name);\n } else {\n this.addActivateGuard(name, canActivate);\n }\n }\n\n // Handle canDeactivate separately (uses RouteLifecycleNamespace)\n // Use facade method for proper validation\n if (canDeactivate !== undefined) {\n if (canDeactivate === null) {\n this.#routeLifecycle.clearCanDeactivate(name);\n } else {\n this.addDeactivateGuard(name, canDeactivate);\n }\n }\n\n return this;\n }\n\n // ============================================================================\n // Path & State Building\n // ============================================================================\n\n isActiveRoute(\n name: string,\n params?: Params,\n strictEquality?: boolean,\n ignoreQueryParams?: boolean,\n ): boolean {\n if (!this.#noValidate) {\n RoutesNamespace.validateIsActiveRouteArgs(\n name,\n params,\n strictEquality,\n ignoreQueryParams,\n );\n }\n\n // Empty string is special case - warn and return false (root node is not a parent)\n if (name === \"\") {\n logger.warn(\n \"real-router\",\n 'isActiveRoute(\"\") called with empty string. Root node is not considered a parent of any route.',\n );\n\n return false;\n }\n\n return this.#routes.isActiveRoute(\n name,\n params,\n strictEquality,\n ignoreQueryParams,\n );\n }\n\n buildPath(route: string, params?: Params): string {\n if (!this.#noValidate) {\n RoutesNamespace.validateBuildPathArgs(route);\n }\n\n return this.#routes.buildPath(route, params, this.#options.get());\n }\n\n matchPath<P extends Params = Params, MP extends Params = Params>(\n path: string,\n source?: string,\n ): State<P, MP> | undefined {\n if (!this.#noValidate) {\n RoutesNamespace.validateMatchPathArgs(path);\n }\n\n return this.#routes.matchPath<P, MP>(path, source, this.#options.get());\n }\n\n setRootPath(rootPath: string): void {\n if (!this.#noValidate) {\n RoutesNamespace.validateSetRootPathArgs(rootPath);\n }\n\n this.#routes.setRootPath(rootPath);\n }\n\n getRootPath(): string {\n return this.#routes.getRootPath();\n }\n\n // ============================================================================\n // State Management (delegated to StateNamespace)\n // ============================================================================\n\n makeState<P extends Params = Params, MP extends Params = Params>(\n name: string,\n params?: P,\n path?: string,\n meta?: StateMetaInput<MP>,\n forceId?: number,\n ): State<P, MP> {\n if (!this.#noValidate) {\n StateNamespace.validateMakeStateArgs(name, params, path, forceId);\n }\n\n return this.#state.makeState<P, MP>(name, params, path, meta, forceId);\n }\n\n getState<P extends Params = Params, MP extends Params = Params>():\n | State<P, MP>\n | undefined {\n return this.#state.get<P, MP>();\n }\n\n getPreviousState(): State | undefined {\n return this.#state.getPrevious();\n }\n\n areStatesEqual(\n state1: State | undefined,\n state2: State | undefined,\n ignoreQueryParams = true,\n ): boolean {\n if (!this.#noValidate) {\n StateNamespace.validateAreStatesEqualArgs(\n state1,\n state2,\n ignoreQueryParams,\n );\n }\n\n return this.#state.areStatesEqual(state1, state2, ignoreQueryParams);\n }\n\n forwardState<P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ): SimpleState<P> {\n if (!this.#noValidate) {\n RoutesNamespace.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"forwardState\",\n );\n }\n\n return this.#routes.forwardState<P>(routeName, routeParams);\n }\n\n buildState(\n routeName: string,\n routeParams: Params,\n ): RouteTreeState | undefined {\n if (!this.#noValidate) {\n RoutesNamespace.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"buildState\",\n );\n }\n\n // Call forwardState at facade level to allow plugin interception\n const { name, params } = this.forwardState(routeName, routeParams);\n\n return this.#routes.buildStateResolved(name, params);\n }\n\n buildNavigationState(name: string, params: Params = {}): State | undefined {\n if (!this.#noValidate) {\n RoutesNamespace.validateStateBuilderArgs(\n name,\n params,\n \"buildNavigationState\",\n );\n }\n\n const routeInfo = this.buildState(name, params);\n\n if (!routeInfo) {\n return undefined;\n }\n\n return this.makeState(\n routeInfo.name,\n routeInfo.params,\n this.buildPath(routeInfo.name, routeInfo.params),\n {\n params: routeInfo.meta,\n options: {},\n redirected: false,\n },\n );\n }\n\n shouldUpdateNode(\n nodeName: string,\n ): (toState: State, fromState?: State) => boolean {\n if (!this.#noValidate) {\n RoutesNamespace.validateShouldUpdateNodeArgs(nodeName);\n }\n\n return this.#routes.shouldUpdateNode(nodeName);\n }\n\n // ============================================================================\n // Options (backed by OptionsNamespace)\n // ============================================================================\n\n getOptions(): Options {\n return this.#options.get();\n }\n\n // ============================================================================\n // Router Lifecycle\n // ============================================================================\n\n isActive(): boolean {\n return this.#eventBus.isActive();\n }\n\n async start(startPath: string): Promise<State> {\n // Static validation\n if (!this.#noValidate) {\n RouterLifecycleNamespace.validateStartArgs([startPath]);\n }\n\n if (!this.#eventBus.canStart()) {\n throw CACHED_ALREADY_STARTED_ERROR;\n }\n\n this.#eventBus.sendStart();\n\n try {\n return await this.#lifecycle.start(startPath);\n } catch (error) {\n if (this.#eventBus.isReady()) {\n this.#lifecycle.stop();\n this.#eventBus.sendStop();\n }\n\n throw error;\n }\n }\n\n stop(): this {\n this.#eventBus.cancelTransitionIfRunning(this.#state.get());\n\n if (!this.#eventBus.isReady() && !this.#eventBus.isTransitioning()) {\n return this;\n }\n\n this.#lifecycle.stop();\n this.#eventBus.sendStop();\n\n return this;\n }\n\n dispose(): void {\n if (this.#eventBus.isDisposed()) {\n return;\n }\n\n this.#eventBus.cancelTransitionIfRunning(this.#state.get());\n\n if (this.#eventBus.isReady() || this.#eventBus.isTransitioning()) {\n this.#lifecycle.stop();\n this.#eventBus.sendStop();\n }\n\n this.#eventBus.sendDispose();\n this.#eventBus.clearAll();\n\n this.#plugins.disposeAll();\n this.#middleware.clearAll();\n this.#routes.clearRoutes();\n this.#routeLifecycle.clearAll();\n this.#state.reset();\n this.#dependencies.reset();\n\n this.#markDisposed();\n }\n\n // ============================================================================\n // Route Lifecycle (Guards)\n // ============================================================================\n\n addDeactivateGuard(\n name: string,\n canDeactivateHandler: ActivationFnFactory<Dependencies> | boolean,\n ): this {\n if (!this.#noValidate) {\n validateRouteName(name, \"addDeactivateGuard\");\n RouteLifecycleNamespace.validateHandler(\n canDeactivateHandler,\n \"addDeactivateGuard\",\n );\n }\n\n this.#routeLifecycle.addCanDeactivate(\n name,\n canDeactivateHandler,\n this.#noValidate,\n );\n\n return this;\n }\n\n addActivateGuard(\n name: string,\n canActivateHandler: ActivationFnFactory<Dependencies> | boolean,\n ): this {\n if (!this.#noValidate) {\n validateRouteName(name, \"addActivateGuard\");\n RouteLifecycleNamespace.validateHandler(\n canActivateHandler,\n \"addActivateGuard\",\n );\n }\n\n this.#routeLifecycle.addCanActivate(\n name,\n canActivateHandler,\n this.#noValidate,\n );\n\n return this;\n }\n\n removeActivateGuard(name: string): void {\n if (!this.#noValidate) {\n validateRouteName(name, \"removeActivateGuard\");\n }\n\n this.#routeLifecycle.clearCanActivate(name);\n }\n\n removeDeactivateGuard(name: string): void {\n if (!this.#noValidate) {\n validateRouteName(name, \"removeDeactivateGuard\");\n }\n\n this.#routeLifecycle.clearCanDeactivate(name);\n }\n\n canNavigateTo(name: string, params?: Params): boolean {\n if (!this.#noValidate) {\n validateRouteName(name, \"canNavigateTo\");\n }\n\n if (!this.hasRoute(name)) {\n return false;\n }\n\n const { name: resolvedName, params: resolvedParams } = this.forwardState(\n name,\n params ?? {},\n );\n const toState = this.makeState(resolvedName, resolvedParams);\n const fromState = this.getState();\n\n const { toDeactivate, toActivate } = getTransitionPath(toState, fromState);\n\n for (const segment of toDeactivate) {\n if (\n !this.#routeLifecycle.checkDeactivateGuardSync(\n segment,\n toState,\n fromState,\n )\n ) {\n return false;\n }\n }\n\n for (const segment of toActivate) {\n if (\n !this.#routeLifecycle.checkActivateGuardSync(\n segment,\n toState,\n fromState,\n )\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n // ============================================================================\n // Plugins\n // ============================================================================\n\n usePlugin(...plugins: PluginFactory<Dependencies>[]): Unsubscribe {\n if (!this.#noValidate) {\n // 1. Validate input arguments\n PluginsNamespace.validateUsePluginArgs<Dependencies>(plugins);\n\n // 2. Validate limit\n PluginsNamespace.validatePluginLimit(\n this.#plugins.count(),\n plugins.length,\n this.#limits.maxPlugins,\n );\n\n // 3. Validate no duplicates with existing plugins\n PluginsNamespace.validateNoDuplicatePlugins(\n plugins,\n this.#plugins.has.bind(this.#plugins),\n );\n }\n\n // 4. Execute (warnings, deduplication, initialization, commit)\n return this.#plugins.use(...plugins);\n }\n\n // ============================================================================\n // Middleware\n // ============================================================================\n\n useMiddleware(\n ...middlewares: MiddlewareFactory<Dependencies>[]\n ): Unsubscribe {\n if (!this.#noValidate) {\n // 1. Validate input arguments\n MiddlewareNamespace.validateUseMiddlewareArgs<Dependencies>(middlewares);\n\n // 2. Validate no duplicates\n MiddlewareNamespace.validateNoDuplicates<Dependencies>(\n middlewares,\n this.#middleware.getFactories(),\n );\n\n // 3. Validate limit\n MiddlewareNamespace.validateMiddlewareLimit(\n this.#middleware.count(),\n middlewares.length,\n this.#limits.maxMiddleware,\n );\n }\n\n // 4. Initialize (without committing)\n const initialized = this.#middleware.initialize(...middlewares);\n\n // 5. Validate results\n if (!this.#noValidate) {\n for (const { middleware, factory } of initialized) {\n MiddlewareNamespace.validateMiddleware<Dependencies>(\n middleware,\n factory,\n );\n }\n }\n\n // 6. Commit\n return this.#middleware.commit(initialized);\n }\n\n // ============================================================================\n // Dependencies (backed by DependenciesNamespace)\n // ============================================================================\n\n setDependency<K extends keyof Dependencies & string>(\n dependencyName: K,\n dependency: Dependencies[K],\n ): this {\n if (!this.#noValidate) {\n DependenciesNamespace.validateSetDependencyArgs(dependencyName);\n }\n\n this.#dependencies.set(dependencyName, dependency);\n\n return this;\n }\n\n setDependencies(deps: Dependencies): this {\n if (!this.#noValidate) {\n DependenciesNamespace.validateDependenciesObject(deps, \"setDependencies\");\n DependenciesNamespace.validateDependencyLimit(\n this.#dependencies.count(),\n Object.keys(deps).length,\n \"setDependencies\",\n this.#limits.maxDependencies,\n );\n }\n\n this.#dependencies.setMultiple(deps);\n\n return this;\n }\n\n getDependency<K extends keyof Dependencies>(key: K): Dependencies[K] {\n if (!this.#noValidate) {\n DependenciesNamespace.validateName(key, \"getDependency\");\n }\n\n const value = this.#dependencies.get(key);\n\n if (!this.#noValidate) {\n DependenciesNamespace.validateDependencyExists(value, key as string);\n }\n\n return value;\n }\n\n getDependencies(): Partial<Dependencies> {\n return this.#dependencies.getAll();\n }\n\n removeDependency(dependencyName: keyof Dependencies): this {\n if (!this.#noValidate) {\n DependenciesNamespace.validateName(dependencyName, \"removeDependency\");\n }\n\n this.#dependencies.remove(dependencyName);\n\n return this;\n }\n\n hasDependency(dependencyName: keyof Dependencies): boolean {\n if (!this.#noValidate) {\n DependenciesNamespace.validateName(dependencyName, \"hasDependency\");\n }\n\n return this.#dependencies.has(dependencyName);\n }\n\n resetDependencies(): this {\n this.#dependencies.reset();\n\n return this;\n }\n\n // ============================================================================\n // Events (backed by EventEmitter)\n // ============================================================================\n\n addEventListener<E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ): Unsubscribe {\n if (!this.#noValidate) {\n EventBusNamespace.validateListenerArgs(eventName, cb);\n }\n\n return this.#eventBus.addEventListener(eventName, cb);\n }\n\n // ============================================================================\n // Subscription (backed by EventEmitter)\n // ============================================================================\n\n subscribe(listener: SubscribeFn): Unsubscribe {\n if (!this.#noValidate) {\n EventBusNamespace.validateSubscribeListener(listener);\n }\n\n return this.#eventBus.subscribe(listener);\n }\n\n // ============================================================================\n // Navigation\n // ============================================================================\n\n navigate(routeName: string): Promise<State>;\n navigate(routeName: string, routeParams: Params): Promise<State>;\n navigate(\n routeName: string,\n routeParams: Params,\n options: NavigationOptions,\n ): Promise<State>;\n navigate(\n routeName: string,\n routeParams?: Params,\n options?: NavigationOptions,\n ): Promise<State> {\n // 1. Validate route name\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigateArgs(routeName);\n }\n\n // 2. Validate parsed options\n const opts = options ?? {};\n\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigationOptions(opts, \"navigate\");\n }\n\n // 3. Execute navigation with parsed arguments\n const promiseState = this.#navigation.navigate(\n routeName,\n routeParams ?? {},\n opts,\n );\n\n Router.#suppressUnhandledRejection(promiseState);\n\n return promiseState;\n }\n\n navigateToDefault(): Promise<State>;\n navigateToDefault(options: NavigationOptions): Promise<State>;\n navigateToDefault(options?: NavigationOptions): Promise<State> {\n // 1. Validate arguments\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigateToDefaultArgs(options);\n }\n\n // 2. Validate parsed options\n const opts = options ?? {};\n\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigationOptions(opts, \"navigateToDefault\");\n }\n\n // 3. Execute navigation with parsed arguments\n const promiseState = this.#navigation.navigateToDefault(opts);\n\n Router.#suppressUnhandledRejection(promiseState);\n\n return promiseState;\n }\n\n navigateToState(\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n ): Promise<State> {\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigateToStateArgs(toState, fromState, opts);\n }\n\n return this.#navigation.navigateToState(toState, fromState, opts);\n }\n\n // ============================================================================\n // Cloning\n // ============================================================================\n\n clone(dependencies?: Dependencies): Router<Dependencies> {\n if (!this.#noValidate) {\n CloneNamespace.validateCloneArgs(dependencies);\n }\n\n return this.#clone.clone(\n dependencies,\n (routes, options, deps) =>\n new Router<Dependencies>(routes, options, deps),\n (newRouter, config, resolvedForwardMap) => {\n const typedRouter = newRouter as unknown as Router<Dependencies>;\n\n typedRouter.#routes.applyClonedConfig(config, resolvedForwardMap);\n },\n );\n }\n\n /**\n * Pre-allocated callback for #suppressUnhandledRejection.\n * Avoids creating a new closure on every navigate() call.\n */\n static readonly #onSuppressedError = (error: unknown): void => {\n if (\n error instanceof RouterError &&\n (error.code === errorCodes.SAME_STATES ||\n error.code === errorCodes.TRANSITION_CANCELLED ||\n error.code === errorCodes.ROUTER_NOT_STARTED ||\n error.code === errorCodes.ROUTE_NOT_FOUND)\n ) {\n return;\n }\n\n logger.error(\"router.navigate\", \"Unexpected navigation error\", error);\n };\n\n /**\n * Fire-and-forget safety: prevents unhandled rejection warnings\n * when navigate/navigateToDefault is called without await.\n * Expected errors are silently suppressed; unexpected ones are logged.\n */\n static #suppressUnhandledRejection(promise: Promise<State>): void {\n promise.catch(Router.#onSuppressedError);\n }\n\n #markDisposed(): void {\n this.navigate = throwDisposed as never;\n this.navigateToDefault = throwDisposed as never;\n this.navigateToState = throwDisposed as never;\n this.start = throwDisposed as never;\n this.stop = throwDisposed as never;\n this.addRoute = throwDisposed as never;\n this.removeRoute = throwDisposed as never;\n this.clearRoutes = throwDisposed as never;\n this.updateRoute = throwDisposed as never;\n this.addActivateGuard = throwDisposed as never;\n this.addDeactivateGuard = throwDisposed as never;\n this.removeActivateGuard = throwDisposed as never;\n this.removeDeactivateGuard = throwDisposed as never;\n this.usePlugin = throwDisposed as never;\n this.useMiddleware = throwDisposed as never;\n this.setDependency = throwDisposed as never;\n this.setDependencies = throwDisposed as never;\n this.removeDependency = throwDisposed as never;\n this.resetDependencies = throwDisposed as never;\n this.addEventListener = throwDisposed as never;\n this.subscribe = throwDisposed as never;\n this.setRootPath = throwDisposed as never;\n this.clone = throwDisposed as never;\n this.canNavigateTo = throwDisposed as never;\n }\n}\n\nfunction throwDisposed(): never {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n}\n\n/**\n * Derives CreateMatcherOptions from router Options.\n * Maps core option names to matcher option names.\n */\nfunction deriveMatcherOptions(\n options: Readonly<Options>,\n): CreateMatcherOptions {\n return {\n strictTrailingSlash: options.trailingSlash === \"strict\",\n strictQueryParams: options.queryParamsMode === \"strict\",\n urlParamsEncoding: options.urlParamsEncoding,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n queryParams: options.queryParams!,\n };\n}\n","// packages/core/src/createRouter.ts\n\nimport { Router } from \"./Router\";\n\nimport type { Route } from \"./types\";\nimport type { DefaultDependencies, Options } from \"@real-router/types\";\n\n/**\n * Creates a new router instance.\n *\n * @param routes - Array of route definitions\n * @param options - Router configuration options\n * @param dependencies - Dependencies to inject into the router\n * @returns A new Router instance\n *\n * @example\n * const router = createRouter([\n * { name: 'home', path: '/' },\n * { name: 'users', path: '/users' },\n * ]);\n *\n * router.start('/');\n */\nexport const createRouter = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routes: Route<Dependencies>[] = [],\n options: Partial<Options> = {},\n dependencies: Dependencies = {} as Dependencies,\n): Router<Dependencies> => {\n return new Router<Dependencies>(routes, options, dependencies);\n};\n","import type { Router } from \"./Router\";\nimport type { Navigator, DefaultDependencies } from \"@real-router/types\";\n\nexport const getNavigator = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n): Navigator =>\n Object.freeze({\n navigate: router.navigate,\n getState: router.getState,\n isActiveRoute: router.isActiveRoute,\n canNavigateTo: router.canNavigateTo,\n subscribe: router.subscribe,\n });\n"]}
1
+ {"version":3,"sources":["../../src/constants.ts","../../src/fsm/routerFSM.ts","../../src/helpers.ts","../../src/namespaces/DependenciesNamespace/validators.ts","../../src/namespaces/DependenciesNamespace/DependenciesNamespace.ts","../../src/namespaces/OptionsNamespace/constants.ts","../../src/namespaces/OptionsNamespace/helpers.ts","../../src/namespaces/OptionsNamespace/validators.ts","../../src/namespaces/OptionsNamespace/OptionsNamespace.ts","../../src/namespaces/StateNamespace/helpers.ts","../../src/namespaces/StateNamespace/StateNamespace.ts","../../src/namespaces/MiddlewareNamespace/validators.ts","../../src/namespaces/MiddlewareNamespace/MiddlewareNamespace.ts","../../src/namespaces/PluginsNamespace/constants.ts","../../src/namespaces/PluginsNamespace/validators.ts","../../src/namespaces/PluginsNamespace/PluginsNamespace.ts","../../src/namespaces/RouteLifecycleNamespace/validators.ts","../../src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts","../../src/namespaces/RoutesNamespace/constants.ts","../../src/namespaces/RoutesNamespace/helpers.ts","../../src/namespaces/RoutesNamespace/stateBuilder.ts","../../src/namespaces/RoutesNamespace/validators.ts","../../src/transitionPath.ts","../../src/namespaces/RoutesNamespace/RoutesNamespace.ts","../../src/namespaces/NavigationNamespace/transition/wrapSyncError.ts","../../src/RouterError.ts","../../src/namespaces/NavigationNamespace/transition/makeError.ts","../../src/namespaces/NavigationNamespace/transition/mergeStates.ts","../../src/namespaces/NavigationNamespace/transition/processLifecycleResult.ts","../../src/namespaces/NavigationNamespace/transition/executeLifecycleHooks.ts","../../src/namespaces/NavigationNamespace/transition/executeMiddleware.ts","../../src/namespaces/NavigationNamespace/transition/index.ts","../../src/namespaces/NavigationNamespace/validators.ts","../../src/namespaces/NavigationNamespace/NavigationNamespace.ts","../../src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts","../../src/namespaces/CloneNamespace/CloneNamespace.ts","../../src/namespaces/EventBusNamespace/EventBusNamespace.ts","../../src/namespaces/RouterLifecycleNamespace/constants.ts","../../src/typeGuards.ts","../../src/wiring/RouterWiringBuilder.ts","../../src/wiring/wireRouter.ts","../../src/Router.ts","../../src/createRouter.ts","../../src/getNavigator.ts"],"names":["FSM","logger","v","i","plugins","unsubscribed","unsubscribe","l","p","b","DEFAULT_ROUTE_NAME","j","c","d","h","f","n","e","s"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BO,IAAM,UAAA,GAAkC,OAAO,MAAA,CAAO;AAAA,EAC3D,kBAAA,EAAoB,aAAA;AAAA;AAAA,EACpB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EACxB,sBAAA,EAAwB,iBAAA;AAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA;AAAA,EACjB,WAAA,EAAa,aAAA;AAAA;AAAA,EACb,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EACnB,eAAA,EAAiB,iBAAA;AAAA;AAAA,EACjB,cAAA,EAAgB,gBAAA;AAAA;AAAA,EAChB,oBAAA,EAAsB,WAAA;AAAA;AAAA,EACtB,eAAA,EAAiB;AAAA;AACnB,CAAC;AAMM,IAAM,SAAA,GAAuB;AAAA,EAClC,aAAA,EAAe;AAAA;AACjB;AAMO,IAAM,OAAA,GAA4B;AAAA,EACvC,YAAA,EAAc,SAAA;AAAA;AAAA,EACd,WAAA,EAAa,QAAA;AAAA;AAAA,EACb,gBAAA,EAAkB,mBAAA;AAAA;AAAA,EAClB,iBAAA,EAAmB,oBAAA;AAAA;AAAA,EACnB,kBAAA,EAAoB,qBAAA;AAAA;AAAA,EACpB,gBAAA,EAAkB;AAAA;AACpB,CAAA;AAMO,IAAM,MAAA,GAAyB;AAAA,EACpC,YAAA,EAAc,QAAA;AAAA;AAAA,EACd,WAAA,EAAa,OAAA;AAAA;AAAA,EACb,gBAAA,EAAkB,SAAA;AAAA;AAAA,EAClB,iBAAA,EAAmB,UAAA;AAAA;AAAA,EACnB,kBAAA,EAAoB,WAAA;AAAA;AAAA,EACpB,gBAAA,EAAkB;AAAA;AACpB;AAKO,IAAM,eAAA,uBAAsB,GAAA,CAAe;AAAA,EAChD,MAAA,CAAO,YAAA;AAAA,EACP,MAAA,CAAO,gBAAA;AAAA,EACP,MAAA,CAAO,kBAAA;AAAA,EACP,MAAA,CAAO,gBAAA;AAAA,EACP,MAAA,CAAO,iBAAA;AAAA,EACP,MAAA,CAAO;AACT,CAAC,CAAA;AAMM,IAAM,cAAA,GAAiB;AAAA,EAC5B,eAAA,EAAiB,GAAA;AAAA,EACjB,UAAA,EAAY,EAAA;AAAA,EACZ,aAAA,EAAe,EAAA;AAAA,EACf,YAAA,EAAc,GAAA;AAAA,EACd,aAAA,EAAe,GAAA;AAAA,EACf,aAAA,EAAe,CAAA;AAAA,EACf,oBAAA,EAAsB;AACxB,CAAA;AAMO,IAAM,YAAA,GAAe;AAAA,EAC1B,eAAA,EAAiB,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAO;AAAA,EACvC,UAAA,EAAY,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAK;AAAA,EAChC,aAAA,EAAe,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAK;AAAA,EACnC,YAAA,EAAc,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAQ;AAAA,EACrC,aAAA,EAAe,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAQ;AAAA,EACtC,aAAA,EAAe,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAI;AAAA,EAClC,oBAAA,EAAsB,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA;AACvC,CAAA;AC/FO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,aAAA,EAAe,eAAA;AAAA,EACf,QAAA,EAAU;AACZ,CAAA;AAgBO,IAAM,YAAA,GAAe;AAAA,EAC1B,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAwCA,IAAM,eAAA,GAA6D;AAAA,EACjE,SAAS,YAAA,CAAa,IAAA;AAAA,EACtB,OAAA,EAAS,IAAA;AAAA,EACT,WAAA,EAAa;AAAA,IACX,CAAC,YAAA,CAAa,IAAI,GAAG;AAAA,MACnB,CAAC,YAAA,CAAa,KAAK,GAAG,YAAA,CAAa,QAAA;AAAA,MACnC,CAAC,YAAA,CAAa,OAAO,GAAG,YAAA,CAAa;AAAA,KACvC;AAAA,IACA,CAAC,YAAA,CAAa,QAAQ,GAAG;AAAA,MACvB,CAAC,YAAA,CAAa,OAAO,GAAG,YAAA,CAAa,KAAA;AAAA,MACrC,CAAC,YAAA,CAAa,IAAI,GAAG,YAAA,CAAa;AAAA,KACpC;AAAA,IACA,CAAC,YAAA,CAAa,KAAK,GAAG;AAAA,MACpB,CAAC,YAAA,CAAa,QAAQ,GAAG,YAAA,CAAa,aAAA;AAAA,MACtC,CAAC,YAAA,CAAa,IAAI,GAAG,YAAA,CAAa,KAAA;AAAA,MAClC,CAAC,YAAA,CAAa,IAAI,GAAG,YAAA,CAAa;AAAA,KACpC;AAAA,IACA,CAAC,YAAA,CAAa,aAAa,GAAG;AAAA,MAC5B,CAAC,YAAA,CAAa,QAAQ,GAAG,YAAA,CAAa,aAAA;AAAA,MACtC,CAAC,YAAA,CAAa,QAAQ,GAAG,YAAA,CAAa,KAAA;AAAA,MACtC,CAAC,YAAA,CAAa,MAAM,GAAG,YAAA,CAAa,KAAA;AAAA,MACpC,CAAC,YAAA,CAAa,IAAI,GAAG,YAAA,CAAa;AAAA,KACpC;AAAA,IACA,CAAC,YAAA,CAAa,QAAQ,GAAG;AAAC;AAE9B,CAAA;AAOO,SAAS,eAAA,GAKd;AACA,EAAA,OAAO,IAAIA,OAAA;AAAA,IACT;AAAA,GACF;AACF;;;ACvGA,SAAS,kBAAkB,KAAA,EAAgC;AACzD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,KAAA;AAEZ,EAAA,OACE,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,IACpB,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,IACpB,OAAO,GAAA,CAAI,MAAA,KAAW,QAAA,IACtB,IAAI,MAAA,KAAW,IAAA;AAEnB;AAiBO,SAAS,gBAAiC,KAAA,EAAa;AAG5D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,oDAAA,EAAuD,OAAO,KAAK,CAAA;AAAA,KACrE;AAAA,EACF;AAIA,EAAA,MAAM,WAAA,GAAc,gBAAgB,KAAK,CAAA;AAGzC,EAAA,MAAM,OAAA,uBAAc,OAAA,EAAgB;AAGpC,EAAA,SAAS,sBAAsB,GAAA,EAAoB;AAGjD,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACpB,MAAA;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AAGf,IAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAGjB,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAG,IAAI,GAAA,GAAM,MAAA,CAAO,OAAO,GAAG,CAAA;AAG3D,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAGA,EAAA,qBAAA,CAAsB,WAAW,CAAA;AAEjC,EAAA,OAAO,WAAA;AACT;AAGA,IAAM,WAAA,uBAAkB,OAAA,EAAgB;AAGxC,SAAS,gBAAgB,GAAA,EAAoB;AAE3C,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACxB,IAAA;AAAA,EACF;AAGA,EAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAGjB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,OAAO,GAAA,EAAK;AACrB,MAAA,eAAA,CAAiB,GAAA,CAAgC,GAAG,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AACF;AAaO,SAAS,mBAAoC,KAAA,EAAa;AAG/D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,eAAA,CAAgB,KAAK,CAAA;AAGrB,EAAA,WAAA,CAAY,IAAI,KAAK,CAAA;AAErB,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,kBAAkB,KAAA,EAGhC;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA;AAAA,IAC5B,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG;AAAA,GAC/B;AACF;AAMO,SAAS,YAAA,CAAa,UAAA,GAAoC,EAAC,EAAW;AAC3E,EAAA,OAAO,EAAE,GAAG,cAAA,EAAgB,GAAG,UAAA,EAAW;AAC5C;;;AChLO,SAAS,sBAAA,CACd,MACA,UAAA,EACwB;AACxB,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,yCAAA,EAA4C,OAAO,IAAI,CAAA;AAAA,KAC9E;AAAA,EACF;AACF;AAMO,SAAS,0BACd,IAAA,EACwB;AACxB,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,8DAAA,EAAiE,OAAO,IAAI,CAAA;AAAA,KAC9E;AAAA,EACF;AACF;AAMO,SAAS,0BAAA,CACd,MACA,UAAA,EACyC;AAEzC,EAAA,IAAI,EAAE,IAAA,IAAQ,OAAO,SAAS,QAAA,IAAY,IAAA,CAAK,gBAAgB,MAAA,CAAA,EAAS;AACtE,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,oDAAA,EAAuD,CAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,KACtG;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,MAAA,CAAO,wBAAA,CAAyB,IAAA,EAAM,GAAG,GAAG,GAAA,EAAK;AACnD,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,QAAA,EAAW,UAAU,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAA;AAAA,OACrD;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,wBAAA,CACd,OACA,cAAA,EACuC;AACvC,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,uCAAuC,cAAc,CAAA,WAAA;AAAA,KACvD;AAAA,EACF;AACF;AAMO,SAAS,wBACd,YAAA,EACA,QAAA,EACA,UAAA,EACA,eAAA,GAA0B,eAAe,eAAA,EACnC;AACN,EAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAa,YAAA,GAAe,QAAA;AAElC,EAAA,IAAI,cAAc,eAAA,EAAiB;AACjC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,6BAAA,EAAgC,eAAe,eACtD,UAAU,CAAA,oCAAA;AAAA,KAC1B;AAAA,EACF;AACF;;;AChFO,IAAM,wBAAN,MAEL;AAAA,EACS,gCAAuC,MAAA,CAAO,MAAA;AAAA,IACrD;AAAA,GACF;AAAA,EAEA,OAAA,GAAkB,cAAA;AAAA,EAElB,WAAA,CAAY,mBAAA,GAA6C,EAAC,EAAmB;AAC3E,IAAA,IAAA,CAAK,YAAY,mBAAmB,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,YAAA,CACL,IAAA,EACA,UAAA,EACwB;AACxB,IAAA,sBAAA,CAAuB,MAAM,UAAU,CAAA;AAAA,EACzC;AAAA,EAEA,OAAO,0BAA0B,IAAA,EAAuC;AACtE,IAAA,yBAAA,CAA0B,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,OAAO,0BAAA,CACL,IAAA,EACA,UAAA,EACyC;AACzC,IAAA,0BAAA,CAA2B,MAAM,UAAU,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAO,wBAAA,CACL,KAAA,EACA,cAAA,EACuC;AACvC,IAAA,wBAAA,CAAyB,OAAO,cAAc,CAAA;AAAA,EAChD;AAAA,EAEA,OAAO,uBAAA,CACL,YAAA,EACA,QAAA,EACA,YACA,eAAA,EACM;AACN,IAAA,uBAAA;AAAA,MACE,YAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,GAAA,CACE,gBACA,eAAA,EACS;AAET,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAW,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,eAAe,cAAc,CAAA;AAElE,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAA,CAAK,sBAAsB,eAAe,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,cAAc,CAAA;AAClD,MAAA,MAAM,aAAa,QAAA,KAAa,eAAA;AAEhC,MAAA,MAAM,aACJ,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA,CAAO,MAAM,eAAe,CAAA;AAExD,MAAA,IAAI,UAAA,IAAc,CAAC,UAAA,EAAY;AAC7B,QAAAC,aAAA,CAAO,IAAA;AAAA,UACL,sBAAA;AAAA,UACA,4DAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,cAAc,CAAA,GAAI,eAAA;AAErC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,IAAA,EAAmC;AAC7C,IAAA,MAAM,kBAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,IAAA,CAAK,GAAG,CAAA,KAAM,MAAA,EAAW;AAC3B,QAAA,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,GAAG,CAAA,EAAG;AAC1C,UAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA,QAC1B;AAEA,QAAA,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAAA,aAAA,CAAO,IAAA;AAAA,QACL,wBAAA;AAAA,QACA,cAAA;AAAA,QACA,eAAA,CAAgB,KAAK,IAAI;AAAA,OAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAkC,cAAA,EAAoC;AACpE,IAAA,OAAO,IAAA,CAAK,cAAc,cAAc,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAgC;AAC9B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,aAAA,EAAc;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAgB;AACd,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,cAAA,EAA0C;AAC/C,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,cAAc,CAAA,EAAG;AACtD,MAAAA,aAAA,CAAO,IAAA;AAAA,QACL,CAAA,uBAAA,CAAA;AAAA,QACA,CAAA,8CAAA,EAAiD,CAAA,CAAmB,cAAc,CAAC,CAAA,CAAA;AAAA,OACrF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,cAAc,cAAc,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAA,EAA6C;AAC/C,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,cAAc,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,aAAA,EAAe;AACpC,MAAA,OAAO,IAAA,CAAK,cAAc,GAAG,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,UAAA,EAA0B;AAC9C,IAAA,MAAM,eAAA,GAAkB,KAAK,OAAA,CAAQ,eAAA;AAErC,IAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA;AAErD,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,kBAAkB,eAAe,CAAA;AAEzD,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAAA,aAAA,CAAO,IAAA;AAAA,QACL,UAAU,UAAU,CAAA,CAAA;AAAA,QACpB,GAAG,IAAI,CAAA,wDAAA;AAAA,OACT;AAAA,IACF,CAAA,MAAA,IAAW,iBAAiB,KAAA,EAAO;AACjC,MAAAA,aAAA,CAAO,KAAA;AAAA,QACL,UAAU,UAAU,CAAA,CAAA;AAAA,QACpB,CAAA,EAAG,KAAK,CAAA,+EAAA,EAEW,eAAe,CAAA,CAAA;AAAA,OACpC;AAAA,IACF,CAAA,MAAA,IAAW,gBAAgB,eAAA,EAAiB;AAC1C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,QAAA,EAAW,UAAU,CAAA,6BAAA,EAAgC,eAAe,eACtD,YAAY,CAAA,kHAAA;AAAA,OAE5B;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;AClPO,IAAM,cAAA,GAA0B;AAAA,EACrC,YAAA,EAAc,EAAA;AAAA,EACd,eAAe,EAAC;AAAA,EAChB,aAAA,EAAe,UAAA;AAAA,EACf,eAAA,EAAiB,OAAA;AAAA,EACjB,WAAA,EAAa;AAAA,IACX,WAAA,EAAa,MAAA;AAAA,IACb,aAAA,EAAe,MAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AAAA,EACA,iBAAA,EAAmB,SAAA;AAAA,EACnB,aAAA,EAAe,IAAA;AAAA,EACf,kBAAA,EAAoB,IAAA;AAAA,EACpB,UAAA,EAAY;AACd,CAAA;AAMO,IAAM,mBAAA,GAAsB;AAAA,EACjC,aAAA,EAAe,CAAC,QAAA,EAAU,OAAA,EAAS,UAAU,UAAU,CAAA;AAAA,EACvD,eAAA,EAAiB,CAAC,SAAA,EAAW,QAAA,EAAU,OAAO,CAAA;AAAA,EAC9C,iBAAA,EAAmB,CAAC,SAAA,EAAW,KAAA,EAAO,gBAAgB,MAAM;AAC9D,CAAA;AAKO,IAAM,kBAAA,GAAqB;AAAA,EAChC,WAAA,EAAa,CAAC,MAAA,EAAQ,UAAA,EAAY,SAAS,OAAO,CAAA;AAAA,EAClD,aAAA,EAAe,CAAC,MAAA,EAAQ,QAAA,EAAU,YAAY,CAAA;AAAA,EAC9C,UAAA,EAAY,CAAC,SAAA,EAAW,QAAQ;AAClC,CAAA;;;AChCO,SAAS,WAA6B,GAAA,EAAqB;AAChE,EAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAEjB,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,MAAM,KAAA,GAAS,IAAgC,GAAG,CAAA;AAElD,IAAA,IAAI,SAAS,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,gBAAgB,MAAA,EAAQ;AACtE,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAkBO,SAAS,aAAA,CACd,OACA,aAAA,EACiB;AACjB,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAI/B,IAAA,OAAO,MAAM,aAAsB,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,KAAA;AACT;;;AC7BO,SAAS,mBAAA,CACd,KAAA,EACA,UAAA,EACA,UAAA,EAC0C;AAC1C,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,gBAAgB,MAAA,EAAQ;AACvE,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,WAAW,UAAU,CAAA,oBAAA,EAAuB,UAAU,CAAA,8BAAA,EACtB,CAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,KAC3D;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,GAAG,GAAG,GAAA,EAAK;AACpD,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,QAAA,EAAW,UAAU,CAAA,0BAAA,EAA6B,UAAU,OAAO,GAAG,CAAA,CAAA;AAAA,OACxE;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,mBAAA,CACd,OACA,UAAA,EACM;AACN,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,CAAC,CAAA,CAAS,GAAA,EAAK,kBAAkB,CAAA,EAAG;AACtC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,kBAAkB,CAAA,CAC7C,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CACnB,KAAK,IAAI,CAAA;AAEZ,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,QAAA,EAAW,UAAU,CAAA,4BAAA,EAA+B,GAAG,kBACtC,SAAS,CAAA;AAAA,OAC5B;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,GAAG,CAAA;AAC5B,IAAA,MAAM,WAAA,GAAc,mBAAmB,GAAG,CAAA;AAC1C,IAAA,MAAM,UAAW,WAAA,CAAkC,QAAA;AAAA,MACjD;AAAA,KACF;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,GAAA,CAAI,CAACC,EAAAA,KAAM,IAAIA,EAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAEhE,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,QAAA,EAAW,UAAU,CAAA,gCAAA,EAAmC,GAAG,qBACtC,aAAa,CAAA,OAAA,EAAU,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA;AAAA,OAChE;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,kBAAA,CACd,UAAA,EACA,KAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,WAAA,GAAc,oBAAoB,UAAU,CAAA;AAClD,EAAA,MAAM,OAAA,GAAW,WAAA,CAAkC,QAAA,CAAS,KAAe,CAAA;AAE3E,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,GAAA,CAAI,CAACA,EAAAA,KAAM,IAAIA,EAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAEhE,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,qBAAA,EAAwB,UAAU,sBAClC,aAAa,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,KAC3D;AAAA,EACF;AACF;AAMO,SAAS,mBAAA,CACd,UAAA,EACA,KAAA,EACA,UAAA,EACM;AAIN,EAAA,IACE,OAAO,KAAA,KAAU,UAAA,KAChB,UAAA,KAAe,cAAA,IAAkB,eAAe,eAAA,CAAA,EACjD;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,eAAe,UAAU,CAAA;AAG/C,EAAA,IAAI,aAAA,IAAiB,OAAO,aAAA,KAAkB,QAAA,EAAU;AACtD,IAAA,mBAAA,CAAoB,KAAA,EAAO,YAAY,UAAU,CAAA;AAEjD,IAAA,IAAI,eAAe,aAAA,EAAe;AAChC,MAAA,mBAAA,CAAoB,OAAO,UAAU,CAAA;AAAA,IACvC;AAEA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,KAAA,KAAU,OAAO,aAAA,EAAe;AACzC,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,oBAAA,EAAuB,UAAU,eACxC,OAAO,aAAa,CAAA,MAAA,EAAS,OAAO,KAAK,CAAA;AAAA,KACzD;AAAA,EACF;AAGA,EAAA,IAAI,cAAc,mBAAA,EAAqB;AACrC,IAAA,kBAAA;AAAA,MACE,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAMA,SAAS,qBAAA,CACP,GAAA,EACA,KAAA,EACA,UAAA,EACS;AACT,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,cAAA,CAAe,OAAO,UAAU,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAI,SAAA,CAAU,CAAA,QAAA,EAAW,UAAU,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,CAAG,CAAA;AACvE;AAMO,SAAS,eAAA,CACd,SACA,UAAA,EACqC;AACrC,EAAA,IACE,CAAC,OAAA,IACD,OAAO,YAAY,QAAA,IACnB,OAAA,CAAQ,gBAAgB,MAAA,EACxB;AACA,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,8CAAA,EAAiD,CAAA,CAAmB,OAAO,CAAC,CAAA;AAAA,KACnG;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAElD,IAAA,IAAI,CAAC,CAAA,CAAS,GAAA,EAAK,cAAc,CAAA,EAAG;AAClC,MAAA,qBAAA,CAAsB,GAAA,EAAK,OAAO,UAAU,CAAA;AAC5C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,mBAAA,CAAoB,GAAA,EAAK,OAAO,UAAU,CAAA;AAAA,EAC5C;AACF;AAKO,SAAS,kBAAA,CACd,SAAA,EACA,KAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AACzD,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,WAAW,UAAU,CAAA,UAAA,EAAa,SAAS,CAAA,0BAAA,EAA6B,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACvF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,aAAa,SAAS,CAAA;AAErC,EAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,GAAA,IAAO,KAAA,GAAQ,OAAO,GAAA,EAAK;AAC5C,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,UAAA,EAAa,SAAS,CAAA,kBAAA,EAAqB,MAAA,CAAO,GAAG,CAAA,KAAA,EAAQ,MAAA,CAAO,GAAG,CAAA,MAAA,EAAS,KAAK,CAAA;AAAA,KAC5G;AAAA,EACF;AACF;AAKO,SAAS,cAAA,CACd,QACA,UAAA,EACyC;AACzC,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,WAAW,QAAA,IAAY,MAAA,CAAO,gBAAgB,MAAA,EAAQ;AAC1E,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,8CAAA,EAAiD,OAAO,MAAM,CAAA;AAAA,KACrF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,YAAA,EAAc,GAAG,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,QAAA,EAAW,UAAU,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACvE;AAEA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,kBAAA,CAAmB,GAAA,EAA2B,OAAO,UAAU,CAAA;AAAA,EACjE;AACF;;;AC5OO,IAAM,mBAAN,MAAuB;AAAA,EACnB,QAAA;AAAA,EAET,WAAA,CAAY,cAAA,GAAmC,EAAC,EAAG;AAEjD,IAAA,IAAA,CAAK,WAAW,UAAA,CAAW;AAAA,MACzB,GAAG,cAAA;AAAA,MACH,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,eAAA,CACL,OAAA,EACA,UAAA,EACqC;AACrC,IAAA,eAAA,CAAgB,SAAS,UAAU,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,GAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AACF,CAAA;;;ACzCO,SAAS,qBAAqB,IAAA,EAAoC;AACvE,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,eAAe,IAAA,EAAM;AAC9B,IAAA,MAAM,QAAA,GAAW,KAAK,WAAW,CAAA;AAEjC,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,IAAI,QAAA,CAAS,KAAK,CAAA,KAAM,KAAA,EAAO;AAC7B,QAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAMO,SAAS,mBAAA,CAAoB,MAAe,IAAA,EAAwB;AACzE,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC9C,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAACA,EAAAA,EAAGC,EAAAA,KAAM,oBAAoBD,EAAAA,EAAG,IAAA,CAAKC,EAAC,CAAC,CAAC,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,KAAA;AACT;;;ACdO,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA,EAI1B,QAAA,GAAW,CAAA;AAAA;AAAA;AAAA;AAAA,EAKX,YAAA,GAAkC,MAAA;AAAA;AAAA;AAAA;AAAA,EAKlC,cAAA,GAAoC,MAAA;AAAA;AAAA;AAAA;AAAA,EAKpC,KAAA;AAAA;AAAA;AAAA;AAAA,EAKS,eAAA,uBAAsB,GAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASrD,OAAO,qBAAA,CACL,IAAA,EACA,MAAA,EACA,MACA,OAAA,EACM;AAEN,IAAA,IAAI,CAAC,CAAA,CAAS,IAAI,CAAA,EAAG;AACnB,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,CAAA,CAAmB,IAAI,CAAC,CAAA,kBAAA;AAAA,OAC9D;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,CAAC,CAAA,CAAS,MAAM,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,mCAAA,EAAsC,CAAA,CAAmB,MAAM,CAAC,CAAA,wBAAA;AAAA,OAClE;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,CAAC,CAAA,CAAS,IAAI,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,CAAA,CAAmB,IAAI,CAAC,CAAA,kBAAA;AAAA,OAC9D;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAO,OAAA,KAAY,QAAA,EAAU;AACxD,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,oCAAA,EAAuC,CAAA,CAAmB,OAAO,CAAC,CAAA,kBAAA;AAAA,OACpE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,0BAAA,CACL,MAAA,EACA,MAAA,EACA,iBAAA,EACM;AAEN,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,CAAA,CAAc,QAAQ,gBAAgB,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,CAAA,CAAc,QAAQ,gBAAgB,CAAA;AAAA,IACxC;AAEA,IAAA,IACE,iBAAA,KAAsB,MAAA,IACtB,OAAO,iBAAA,KAAsB,SAAA,EAC7B;AACA,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,mDAAA,EAAsD,CAAA,CAAmB,iBAAiB,CAAC,CAAA,mBAAA;AAAA,OAC7F;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,GAAA,GAEc;AACZ,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,KAAA,EAAgC;AAElC,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,YAAA;AAI3B,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA,GAAQ,kBAAA,CAAmB,KAAK,CAAA,GAAI,MAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAEc;AACZ,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AACtB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgB,IAAA,EAAwC;AACtD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAA,CACE,IAAA,EACA,MAAA,EACA,IAAA,EACA,MACA,OAAA,EACc;AACd,IAAA,MAAM,WAAW,IAAA,GACb;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,OAAA,IAAW,EAAE,IAAA,CAAK,QAAA;AAAA,MACtB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAS,IAAA,CAAK;AAAA,KAChB,GACA,MAAA;AAGJ,IAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,KAAA,CAAM,gBAAA,EAAiB;AACxD,IAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,MAAA,CAAO,mBAAA,EAAqB,IAAI,CAAA;AAGhE,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,YAAA,GAAe,EAAE,GAAG,mBAAA,CAAoB,IAAI,CAAA,EAAG,GAAG,MAAA,EAAO;AAAA,IAC3D,WAAW,MAAA,EAAQ;AACjB,MAAA,YAAA,GAAe,EAAE,GAAG,MAAA,EAAO;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,YAAA,GAAe,EAAC;AAAA,IAClB;AAEA,IAAA,MAAM,KAAA,GAAsB;AAAA,MAC1B,IAAA;AAAA,MACA,MAAA,EAAQ,YAAA;AAAA,MACR,MAAM,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAM,MAAM,CAAA;AAAA,MAC/C,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,MAAc,OAAA,EAAmC;AACjE,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACV,SAAA,CAAU,aAAA;AAAA,MACV,EAAE,IAAA,EAAK;AAAA,MACP,IAAA;AAAA,MACA;AAAA,QACE,OAAA;AAAA,QACA,QAAQ;AAAC;AACX,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAA,CACE,MAAA,EACA,MAAA,EACA,iBAAA,GAAoB,IAAA,EACX;AACT,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ;AACtB,MAAA,OAAO,CAAC,CAAC,MAAA,KAAW,CAAC,CAAC,MAAA;AAAA,IACxB;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,IAAA,EAAM;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,SAAA,GAAa,MAAA,CAAO,IAAA,EAAM,MAAA,IAAU,OAAO,IAAA,EAAM,MAAA;AAIvD,MAAA,MAAM,SAAA,GAAY,YACd,oBAAA,CAAqB,SAAS,IAC9B,IAAA,CAAK,aAAA,CAAc,OAAO,IAAI,CAAA;AAElC,MAAA,OAAO,SAAA,CAAU,KAAA;AAAA,QAAM,CAAC,KAAA,KACtB,mBAAA,CAAoB,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC;AAAA,OAChE;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAE5C,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,UAAA,CAAW,MAAA,EAAQ;AAC3C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,UAAA,CAAW,KAAA;AAAA,MAChB,CAAC,KAAA,KACC,KAAA,IAAS,MAAA,CAAO,MAAA,IAChB,mBAAA,CAAoB,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC;AAAA,KAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAc,IAAA,EAAwB;AACpC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAE5C,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,IAAI,CAAA;AAE3C,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAErC,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;;;AC1SA,SAAS,eAAe,OAAA,EAA2B;AACjD,EAAA,OAAO,QAAQ,IAAA,IAAQ,WAAA;AACzB;AAKO,SAAS,0BACd,WAAA,EAC+C;AAC/C,EAAA,KAAA,MAAW,CAACA,EAAAA,EAAG,UAAU,CAAA,IAAK,WAAA,CAAY,SAAQ,EAAG;AACnD,IAAA,IAAI,OAAO,eAAe,UAAA,EAAY;AACpC,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,qEAAA,EAAwEA,EAAC,CAAA,MAAA,EAChE,CAAA,CAAmB,UAAU,CAAC,CAAA;AAAA,OACzC;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,kBAAA,CACd,YACA,OAAA,EACkC;AAClC,EAAA,IAAI,OAAO,eAAe,UAAA,EAAY;AACpC,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,yEACS,CAAA,CAAmB,UAAU,CAAC,CAAA,WAAA,EACzB,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,KACvC;AAAA,EACF;AACF;AAKO,SAAS,oBAAA,CACd,cACA,iBAAA,EACM;AACN,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,iBAAiB,CAAA;AAE7C,EAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kIAAA,EAEc,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,OACvC;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,uBAAA,CACd,YAAA,EACA,QAAA,EACA,aAAA,GAAwB,eAAe,aAAA,EACjC;AACN,EAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,YAAA,GAAe,QAAA;AAEjC,EAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,kDAAA,EAAqD,aAAa,CAAA,YAAA,EACpD,YAAY,wBAAwB,QAAQ,CAAA,6EAAA;AAAA,KAE5D;AAAA,EACF;AACF;;;ACnEO,IAAM,sBAAN,MAEL;AAAA,EACS,UAAA,uBAAiB,GAAA,EAAqC;AAAA,EACtD,oBAAA,uBAA2B,GAAA,EAGlC;AAAA,EAEF,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAkB,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,OAAO,0BACL,WAAA,EAC+C;AAC/C,IAAA,yBAAA,CAA6B,WAAW,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAO,kBAAA,CACL,UAAA,EACA,OAAA,EACkC;AAClC,IAAA,kBAAA,CAAsB,YAAY,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,OAAO,oBAAA,CACL,YAAA,EACA,iBAAA,EACM;AACN,IAAA,oBAAA,CAAwB,cAAc,iBAAiB,CAAA;AAAA,EACzD;AAAA,EAEA,OAAO,uBAAA,CACL,YAAA,EACA,QAAA,EACA,aAAA,EACM;AACN,IAAA,uBAAA,CAAwB,YAAA,EAAc,UAAU,aAAa,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,MAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,gBAAgB,IAAA,EAAkD;AAChE,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAA,GAAgB;AACd,IAAA,OAAO,KAAK,UAAA,CAAW,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cACK,SAAA,EACoC;AACvC,IAAA,MAAM,cAAqD,EAAC;AAE5D,IAAA,KAAA,MAAW,WAAW,SAAA,EAAW;AAE/B,MAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAM,aAAa,CAAA;AAEjE,MAAA,WAAA,CAAY,IAAA,CAAK,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,WAAA,EAAiE;AAEtE,IAAA,IAAA,CAAK,qBAAA,CAAsB,YAAY,MAAM,CAAA;AAG7C,IAAA,KAAA,MAAW,EAAE,OAAA,EAAS,UAAA,EAAW,IAAK,WAAA,EAAa;AACjD,MAAA,IAAA,CAAK,UAAA,CAAW,IAAI,OAAO,CAAA;AAC3B,MAAA,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,OAAA,EAAS,UAAU,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,IAAA,OAAO,MAAY;AACjB,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,GAAe,IAAA;AAEf,MAAA,KAAA,MAAW,EAAE,OAAA,EAAQ,IAAK,WAAA,EAAa;AACrC,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,OAAO,CAAA;AAC9B,QAAA,IAAA,CAAK,oBAAA,CAAqB,OAAO,OAAO,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAAkD;AAChD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA6B;AAC3B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA;AAAA,EAC/C;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,qBAAqB,KAAA,EAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,QAAA,EAAwB;AAC5C,IAAA,MAAM,aAAA,GAAgB,KAAK,OAAA,CAAQ,aAAA;AAEnC,IAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,IAAA;AAE7C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,kBAAkB,aAAa,CAAA;AAEvD,IAAA,IAAI,aAAa,KAAA,EAAO;AACtB,MAAAF,aAAAA,CAAO,KAAA;AAAA,QACL,sBAAA;AAAA,QACA,CAAA,EAAG,SAAS,CAAA,qFAAA,EAEO,aAAa,CAAA,CAAA;AAAA,OAClC;AAAA,IACF,CAAA,MAAA,IAAW,aAAa,IAAA,EAAM;AAC5B,MAAAA,aAAAA,CAAO,IAAA;AAAA,QACL,sBAAA;AAAA,QACA,GAAG,SAAS,CAAA,sDAAA;AAAA,OAEd;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;AC/LO,IAAM,UAAA,GAAa;AAAA,EACxB,CAAC,OAAA,CAAc,YAAY,GAAG,MAAA,CAAa,YAAA;AAAA,EAC3C,CAAC,OAAA,CAAc,WAAW,GAAG,MAAA,CAAa,WAAA;AAAA,EAC1C,CAAC,OAAA,CAAc,kBAAkB,GAAG,MAAA,CAAa,kBAAA;AAAA,EACjD,CAAC,OAAA,CAAc,gBAAgB,GAAG,MAAA,CAAa,gBAAA;AAAA,EAC/C,CAAC,OAAA,CAAc,gBAAgB,GAAG,MAAA,CAAa,gBAAA;AAAA,EAC/C,CAAC,OAAA,CAAc,iBAAiB,GAAG,MAAA,CAAa;AAClD,CAAA;AAQO,IAAM,kBAAA,GAAqB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA;AAAA,EACxD,CAAC,SAAA,KACC,CAAA,CAA4B,SAAA,EAAW,UAAU;AACrD,CAAA;AAEO,IAAM,cAAA,GAAiB,kBAAA;;;AChBvB,SAAS,sBACdG,QAAAA,EACuC;AACvC,EAAA,KAAA,MAAW,UAAUA,QAAAA,EAAS;AAC5B,IAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,yDAAA,EAA4D,OAAO,MAAM,CAAA;AAAA,OAC3E;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,eAAe,MAAA,EAAsB;AAEnD,EAAA,IAAI,EAAE,UAAU,OAAO,MAAA,KAAW,aAAa,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACpE,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,6DAAA,EAAgE,CAAA;AAAA,QAC9D;AAAA,OACD,CAAA;AAAA,KACH;AAAA,EACF;AAGA,EAAA,IAAI,OAAQ,MAAA,CAAyC,IAAA,KAAS,UAAA,EAAY;AACxE,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,mHAAA;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,IAAI,EAAE,GAAA,KAAQ,UAAA,IAAc,CAAA,CAA4B,GAAA,EAAK,UAAU,CAAA,CAAA,EAAI;AACzE,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,wCAAwC,GAAG,CAAA,iEAAA;AAAA,OAE7C;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,mBAAA,CACd,YAAA,EACA,QAAA,EACA,UAAA,GAAqB,eAAe,UAAA,EAC9B;AACN,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAa,YAAA,GAAe,QAAA;AAElC,EAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EAC5E;AACF;;;AClDO,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAEX;AAAA,EACS,QAAA,uBAAe,GAAA,EAAiC;AAAA,EAChD,aAAA,uBAAoB,GAAA,EAAiB;AAAA,EAE9C,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAkB,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,OAAO,sBACLA,QAAAA,EACuC;AACvC,IAAA,qBAAA,CAAyBA,QAAO,CAAA;AAAA,EAClC;AAAA,EAEA,OAAO,eAAe,MAAA,EAAsB;AAC1C,IAAA,cAAA,CAAe,MAAM,CAAA;AAAA,EACvB;AAAA,EAEA,OAAO,mBAAA,CACL,YAAA,EACA,QAAA,EACA,UAAA,EACM;AACN,IAAA,mBAAA,CAAoB,YAAA,EAAc,UAAU,UAAU,CAAA;AAAA,EACxD;AAAA,EAEA,OAAO,0BAAA,CACL,YAAA,EACA,SAAA,EACM;AACN,IAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,MAAA,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,4GAAA;AAAA,SAEF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,MAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,gBAAgB,IAAA,EAA+C;AAC7D,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,KAAA,GAAgB;AACd,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,SAAA,EAAuD;AAE5D,IAAA,IAAA,CAAK,qBAAA,CAAsB,UAAU,MAAM,CAAA;AAG3C,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,OAAA,GAAU,UAAU,CAAC,CAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAEzC,MAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AAEzB,MAAA,IAAIC,aAAAA,GAAe,KAAA;AAEnB,MAAA,MAAMC,eAA2B,MAAM;AACrC,QAAA,IAAID,aAAAA,EAAc;AAChB,UAAA;AAAA,QACF;AAEA,QAAAA,aAAAA,GAAe,IAAA;AACf,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAA;AAC5B,QAAA,IAAA,CAAK,aAAA,CAAc,OAAOC,YAAW,CAAA;AACrC,QAAA,IAAI;AACF,UAAA,OAAA,EAAQ;AAAA,QACV,SAAS,KAAA,EAAO;AACd,UAAAL,aAAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,uBAAA,EAAyB,KAAK,CAAA;AAAA,QAC7D;AAAA,MACF,CAAA;AAEA,MAAA,IAAA,CAAK,aAAA,CAAc,IAAIK,YAAW,CAAA;AAElC,MAAA,OAAOA,YAAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AAGpD,IAAA,MAAM,qBAGA,EAAC;AAGP,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAExC,QAAA,kBAAA,CAAmB,IAAA,CAAK,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAS,CAAA;AAAA,MACtD;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,KAAA,MAAW,EAAE,OAAA,EAAQ,IAAK,kBAAA,EAAoB;AAC5C,QAAA,IAAI;AACF,UAAA,OAAA,EAAQ;AAAA,QACV,SAAS,YAAA,EAAc;AACrB,UAAAL,aAAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,gBAAA,EAAkB,YAAY,CAAA;AAAA,QAC7D;AAAA,MACF;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,KAAA,MAAW,EAAE,OAAA,EAAQ,IAAK,kBAAA,EAAoB;AAC5C,MAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,IAAA,MAAM,cAA2B,MAAM;AACrC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,IAAA,CAAK,aAAA,CAAc,OAAO,WAAW,CAAA;AAErC,MAAA,KAAA,MAAW,EAAE,OAAA,EAAQ,IAAK,kBAAA,EAAoB;AAC5C,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,MAC9B;AAEA,MAAA,KAAA,MAAW,EAAE,OAAA,EAAQ,IAAK,kBAAA,EAAoB;AAC5C,QAAA,IAAI;AACF,UAAA,OAAA,EAAQ;AAAA,QACV,SAAS,KAAA,EAAO;AACd,UAAAA,aAAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,uBAAA,EAAyB,KAAK,CAAA;AAAA,QAC7D;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,WAAW,CAAA;AAElC,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAwC;AACtC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,EAA+C;AACjD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,EAClC;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,KAAA,MAAW,WAAA,IAAe,KAAK,aAAA,EAAe;AAC5C,MAAA,WAAA,EAAY;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,QAAA,EAAwB;AAC5C,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,UAAA;AAEhC,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA;AAE5C,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,kBAAkB,UAAU,CAAA;AAEpD,IAAA,IAAI,cAAc,KAAA,EAAO;AACvB,MAAAA,aAAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,CAAA,EAAG,UAAU,CAAA,oBAAA,CAAsB,CAAA;AAAA,IAClE,CAAA,MAAA,IAAW,cAAc,IAAA,EAAM;AAC7B,MAAAA,aAAAA,CAAO,IAAA,CAAK,cAAA,EAAgB,CAAA,EAAG,UAAU,CAAA,mBAAA,CAAqB,CAAA;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBACEG,QAAAA,EACkC;AAClC,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAiC;AAEzD,IAAA,KAAA,MAAW,UAAUA,QAAAA,EAAS;AAC5B,MAAA,IAAI,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA,EAAG;AAC3B,QAAAH,aAAAA,CAAO,IAAA;AAAA,UACL,cAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAI,MAAM,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,aAAa,aAAA,EAAyD;AAGpE,IAAA,MAAM,gBAAgB,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAM,aAAa,CAAA;AAE1E,IAAA,iBAAA,CAAiB,eAAe,aAAa,CAAA;AAE7C,IAAA,MAAA,CAAO,OAAO,aAAa,CAAA;AAG3B,IAAA,MAAM,uBAAsC,EAAC;AAG7C,IAAA,KAAA,MAAW,cAAc,kBAAA,EAAoB;AAC3C,MAAA,IAAI,cAAc,aAAA,EAAe;AAC/B,QAAA,IAAI,OAAO,aAAA,CAAc,UAAU,CAAA,KAAM,UAAA,EAAY;AACnD,UAAA,oBAAA,CAAqB,IAAA;AAAA,YACnB,KAAK,KAAA,CAAM,gBAAA;AAAA,cACT,WAAW,UAAU,CAAA;AAAA,cACrB,cAAc,UAAU;AAAA;AAC1B,WACF;AAEA,UAAA,IAAI,UAAA,KAAe,SAAA,IAAa,IAAA,CAAK,KAAA,CAAM,aAAY,EAAG;AACxD,YAAAA,aAAAA,CAAO,IAAA;AAAA,cACL,cAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAAA,aAAAA,CAAO,IAAA;AAAA,YACL,cAAA;AAAA,YACA,aAAa,UAAU,CAAA,6BAAA;AAAA,WACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,MAAW,kBAAkB,oBAAA,EAAsB;AACjD,QAAA,cAAA,EAAe;AAAA,MACjB;AAEA,MAAA,IAAI,OAAO,aAAA,CAAc,QAAA,KAAa,UAAA,EAAY;AAChD,QAAA,aAAA,CAAc,QAAA,EAAS;AAAA,MACzB;AAAA,IACF,CAAA;AAAA,EACF;AACF,CAAA;;;ACnTO,SAAS,eAAA,CACd,SACA,UAAA,EACqD;AACrD,EAAA,IAAI,CAAC,CAAA,CAAU,OAAO,CAAA,IAAK,OAAO,YAAY,UAAA,EAAY;AACxD,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,qDAAA,EACZ,CAAA,CAAmB,OAAO,CAAC,CAAA;AAAA,KACtC;AAAA,EACF;AACF;AAMO,SAAS,sBAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,uBAAA,EAA0B,IAAI,CAAA,6BAAA;AAAA,KACrD;AAAA,EACF;AACF;AAKO,SAAS,oBAAA,CACd,YAAA,EACA,UAAA,EACA,oBAAA,GAA+B,eAAe,oBAAA,EACxC;AACN,EAAA,IAAI,yBAAyB,CAAA,EAAG;AAC9B,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,gBAAgB,oBAAA,EAAsB;AACxC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,oCAAA,EAAuC,oBAAoB,CAAA,iHAAA;AAAA,KAGlF;AAAA,EACF;AACF;;;ACtCA,SAAS,iBACP,KAAA,EACmC;AACnC,EAAA,MAAM,eAA6B,MAAM,KAAA;AAEzC,EAAA,OAAO,MAAM,YAAA;AACf;AAQO,IAAM,0BAAN,MAEL;AAAA,EACS,uBAAA,uBAA8B,GAAA,EAGrC;AAAA,EACO,qBAAA,uBAA4B,GAAA,EAGnC;AAAA,EACO,uBAAA,uBAA8B,GAAA,EAA0B;AAAA,EACxD,qBAAA,uBAA4B,GAAA,EAA0B;AAAA,EAEtD,YAAA,uBAAmB,GAAA,EAAY;AAAA,EAExC,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAkB,cAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,OAAO,eAAA,CACL,OAAA,EACA,UAAA,EACqD;AACrD,IAAA,eAAA,CAAmB,SAAS,UAAU,CAAA;AAAA,EACxC;AAAA,EAEA,UAAU,MAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,gBAAgB,IAAA,EAAsD;AACpE,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,cAAA,CACE,IAAA,EACA,OAAA,EACA,cAAA,EACM;AACN,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,sBAAA;AAAA,QACE,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,QAC1B,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA;AAEvD,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,cAAA,EAAgB;AACnC,MAAA,oBAAA;AAAA,QACE,IAAA,CAAK,sBAAsB,IAAA,GAAO,CAAA;AAAA,QAClC,kBAAA;AAAA,QACA,KAAK,OAAA,CAAQ;AAAA,OACf;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA;AAAA,MACH,UAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,CAAK,qBAAA;AAAA,MACL,IAAA,CAAK,qBAAA;AAAA,MACL,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAA,CACE,IAAA,EACA,OAAA,EACA,cAAA,EACM;AACN,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,sBAAA;AAAA,QACE,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,QAC1B,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,IAAI,CAAA;AAEzD,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,cAAA,EAAgB;AACnC,MAAA,oBAAA;AAAA,QACE,IAAA,CAAK,wBAAwB,IAAA,GAAO,CAAA;AAAA,QACpC,oBAAA;AAAA,QACA,KAAK,OAAA,CAAQ;AAAA,OACf;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA;AAAA,MACH,YAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,CAAK,uBAAA;AAAA,MACL,IAAA,CAAK,uBAAA;AAAA,MACL,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,IAAA,EAAoB;AACnC,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,IAAI,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,IAAA,EAAoB;AACrC,IAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,IAAI,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,sBAAsB,KAAA,EAAM;AACjC,IAAA,IAAA,CAAK,sBAAsB,KAAA,EAAM;AACjC,IAAA,IAAA,CAAK,wBAAwB,KAAA,EAAM;AACnC,IAAA,IAAA,CAAK,wBAAwB,KAAA,EAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,GAGE;AACA,IAAA,MAAM,mBAGF,EAAC;AACL,IAAA,MAAM,iBAGF,EAAC;AAEL,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,KAAK,uBAAA,EAAyB;AAC1D,MAAA,gBAAA,CAAiB,IAAI,CAAA,GAAI,OAAA;AAAA,IAC3B;AAEA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,KAAK,qBAAA,EAAuB;AACxD,MAAA,cAAA,CAAe,IAAI,CAAA,GAAI,OAAA;AAAA,IACzB;AAEA,IAAA,OAAO,CAAC,kBAAkB,cAAc,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,GAAuE;AACrE,IAAA,OAAO,CAAC,IAAA,CAAK,uBAAA,EAAyB,IAAA,CAAK,qBAAqB,CAAA;AAAA,EAClE;AAAA,EAEA,sBAAA,CACE,IAAA,EACA,OAAA,EACA,SAAA,EACS;AACT,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV,IAAA,CAAK,qBAAA;AAAA,MACL,IAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,wBAAA,CACE,IAAA,EACA,OAAA,EACA,SAAA,EACS;AACT,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV,IAAA,CAAK,uBAAA;AAAA,MACL,IAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBACE,IAAA,EACA,IAAA,EACA,SACA,SAAA,EACA,SAAA,EACA,YACA,WAAA,EACM;AAEN,IAAA,IAAI,WAAA,EAAa;AACf,MAAAA,aAAAA,CAAO,IAAA;AAAA,QACL,UAAU,UAAU,CAAA,CAAA;AAAA,QACpB,CAAA,qBAAA,EAAwB,IAAI,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA;AAAA,OACzD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,qBAAA,CAAsB,SAAA,CAAU,IAAA,GAAO,CAAA,EAAG,UAAU,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,UAAU,CAAA,CAAU,OAAO,CAAA,GAC7B,gBAAA,CAA+B,OAAO,CAAA,GACtC,OAAA;AAGJ,IAAA,SAAA,CAAU,GAAA,CAAI,MAAM,OAAO,CAAA;AAG3B,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,IAAI,CAAA;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,KAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAM,aAAa,CAAA;AAEzD,MAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,CAAA,QAAA,EAAW,UAAU,CAAA,sCAAA,EAAyC,CAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,SACtF;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,IACxB,SAAS,KAAA,EAAO;AAEd,MAAA,SAAA,CAAU,OAAO,IAAI,CAAA;AAErB,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,eAAA,CACE,SAAA,EACA,IAAA,EACA,OAAA,EACA,WACA,UAAA,EACS;AACT,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAElC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA;AAEzC,MAAA,IAAI,OAAO,WAAW,SAAA,EAAW;AAC/B,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,IAAI,CAAA,CAAU,MAAM,CAAA,EAAG;AACrB,QAAAA,aAAAA,CAAO,IAAA;AAAA,UACL,UAAU,UAAU,CAAA,CAAA;AAAA,UACpB,cAAc,IAAI,CAAA,oFAAA;AAAA,SACpB;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAGA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,qBAAA,CAAsB,aAAqB,UAAA,EAA0B;AACnE,IAAA,MAAM,oBAAA,GAAuB,KAAK,OAAA,CAAQ,oBAAA;AAE1C,IAAA,IAAI,yBAAyB,CAAA,EAAG;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,kBAAkB,oBAAoB,CAAA;AAE9D,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAAA,aAAAA,CAAO,KAAA;AAAA,QACL,UAAU,UAAU,CAAA,CAAA;AAAA,QACpB,CAAA,EAAG,WAAW,CAAA,iEAAA,EACwB,oBAAoB,CAAA,CAAA;AAAA,OAC5D;AAAA,IACF,CAAA,MAAA,IAAW,eAAe,IAAA,EAAM;AAC9B,MAAAA,aAAAA,CAAO,IAAA;AAAA,QACL,UAAU,UAAU,CAAA,CAAA;AAAA,QACpB,GAAG,WAAW,CAAA,6DAAA;AAAA,OAEhB;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/XO,IAAM,kBAAA,GAAqB,EAAA;AAQ3B,IAAM,mBAAA,uBAA0B,GAAA,EAAY;;;ACI5C,SAAS,iBAAA,GAAiC;AAC/C,EAAA,OAAO;AAAA,IACL,QAAA,kBAAU,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,IAC5B,QAAA,kBAAU,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,IAC5B,aAAA,kBAAe,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,IACjC,UAAA,kBAAY,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA;AAAA,IAE9B,YAAA,kBAAc,MAAA,CAAO,MAAA,CAAO,IAAI;AAAA,GAClC;AACF;AAUO,SAAS,WAAA,CAAY,QAAgB,MAAA,EAAyB;AACnE,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,MAAA,CAAO,GAAG,CAAA,EAAG;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,oBAAA,CACd,MAAA,EACA,MAAA,EACA,QAAA,EACS;AACT,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,MAAA,CAAO,GAAG,CAAA,EAAG;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,cACd,KAAA,EACiB;AACjB,EAAA,MAAM,SAAA,GAA6B;AAAA,IACjC,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,MAAM,KAAA,CAAM;AAAA,GACd;AAEA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,SAAA,CAAU,QAAA,GAAW,MAAM,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,qBAAA,CACd,WAAA,EACA,SAAA,EACA,YAAA,GAAe,EAAA,EACN;AACT,EAAA,KAAA,IAASE,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAI,WAAA,CAAY,QAAQA,EAAAA,EAAAA,EAAK;AAC3C,IAAA,MAAM,KAAA,GAAQ,YAAYA,EAAC,CAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,eACb,CAAA,EAAG,YAAY,IAAI,KAAA,CAAM,IAAI,KAC7B,KAAA,CAAM,IAAA;AAEV,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,WAAA,CAAY,MAAA,CAAOA,IAAG,CAAC,CAAA;AAEvB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IACE,KAAA,CAAM,QAAA,IACN,SAAA,CAAU,UAAA,CAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAG,CAAA,IACnC,qBAAA,CAAsB,KAAA,CAAM,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAA,EACzD;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,kBAAA,CACd,QACA,OAAA,EACM;AACN,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChB,MAAA,OAAO,OAAO,GAAG,CAAA;AAAA,IACnB;AAAA,EACF;AACF;AASA,SAAS,yBAAA,CAA0B,WAAoB,QAAA,EAAwB;AAC7E,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,cAAc,UAAA,EAAY;AACnC,IAAA,MAAM,aAAA,GACH,SAAA,CAAgD,WAAA,CAAY,IAAA,KAC7D,eAAA;AACF,IAAA,MAAM,iBAAA,GAAoB,SAAA,CAAU,QAAA,EAAS,CAAE,SAAS,WAAW,CAAA;AAEnE,IAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,mEAAmE,QAAQ,CAAA,6CAAA;AAAA,OAE7E;AAAA,IACF;AAAA,EACF;AACF;AAYO,SAAS,uBAAA,CAEd,OAA4B,QAAA,EAAwB;AAEpD,EAAA,IACE,MAAM,WAAA,KAAgB,MAAA,IACtB,OAAO,KAAA,CAAM,gBAAgB,UAAA,EAC7B;AACA,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,+DAA+D,QAAQ,CAAA,OAAA,EAC9D,CAAA,CAAmB,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,KAChD;AAAA,EACF;AAGA,EAAA,IACE,MAAM,aAAA,KAAkB,MAAA,IACxB,OAAO,KAAA,CAAM,kBAAkB,UAAA,EAC/B;AACA,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,iEAAiE,QAAQ,CAAA,OAAA,EAChE,CAAA,CAAmB,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,KAClD;AAAA,EACF;AAIA,EAAA,IAAI,KAAA,CAAM,kBAAkB,MAAA,EAAW;AACrC,IAAA,MAAM,SAAkB,KAAA,CAAM,aAAA;AAE9B,IAAA,IACE,MAAA,KAAW,QACX,OAAO,MAAA,KAAW,YAClB,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EACpB;AACA,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,gEAAgE,QAAQ,CAAA,OAAA,EAC/D,CAAA,CAAmB,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,YAAA,EAAc,WAAA,CAAY,IAAA,KAAS,eAAA,EAAiB;AAC5D,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,6DAA6D,QAAQ,CAAA,6CAAA;AAAA,KACvE;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,YAAA,EAAc,WAAA,CAAY,IAAA,KAAS,eAAA,EAAiB;AAC5D,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,6DAA6D,QAAQ,CAAA,6CAAA;AAAA,KACvE;AAAA,EACF;AAGA,EAAA,yBAAA,CAA0B,KAAA,CAAM,WAAW,QAAQ,CAAA;AAGnD,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,KAAA,MAAW,KAAA,IAAS,MAAM,QAAA,EAAU;AAClC,MAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,CAAA;AAE/C,MAAA,uBAAA,CAAwB,OAAO,aAAa,CAAA;AAAA,IAC9C;AAAA,EACF;AACF;AAUA,SAAS,sBAAsB,IAAA,EAA2B;AACxD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,UAAA,GAAa,qBAAA;AACnB,EAAA,IAAI,KAAA;AAEJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAC/C,IAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,uBAAuB,KAAA,EAAuC;AACrE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,KAAA,IAAS,qBAAA,CAAsB,IAAI,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,oBACP,MAAA,EACA,SAAA,EACA,aAAa,EAAA,EACb,KAAA,GAAkB,EAAC,EACT;AACV,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,aAAa,CAAA,EAAG,UAAU,IAAI,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA;AACpE,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,KAAA,EAAO,MAAM,IAAI,CAAA;AAE1C,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,IAAI,MAAM,QAAA,IAAY,SAAA,CAAU,WAAW,CAAA,EAAG,QAAQ,GAAG,CAAA,EAAG;AAC1D,MAAA,OAAO,mBAAA;AAAA,QACL,KAAA,CAAM,QAAA;AAAA,QACN,SAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,0CAA0C,SAAS,CAAA,WAAA;AAAA,GACrD;AACF;AAKA,SAAS,iBAAA,CACP,MAAA,EACA,UAAA,GAAa,EAAA,EACA;AACb,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAE9B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,aAAa,CAAA,EAAG,UAAU,IAAI,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA;AAEpE,IAAA,KAAA,CAAM,IAAI,QAAQ,CAAA;AAElB,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,KAAA,MAAW,SAAA,IAAa,iBAAA,CAAkB,KAAA,CAAM,QAAA,EAAU,QAAQ,CAAA,EAAG;AACnE,QAAA,KAAA,CAAM,IAAI,SAAS,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAMA,SAAS,sBAAA,CACP,MAAA,EACA,UAAA,GAAa,EAAA,EACQ;AACrB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AAEzC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,aAAa,CAAA,EAAG,UAAU,IAAI,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA;AAEpE,IAAA,IAAI,KAAA,CAAM,SAAA,IAAa,OAAO,KAAA,CAAM,cAAc,QAAA,EAAU;AAC1D,MAAA,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,KAAA,CAAM,SAAS,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,sBAAA;AAAA,QACzB,KAAA,CAAM,QAAA;AAAA,QACN;AAAA,OACF,EAAG;AACD,QAAA,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,kBAAkB,QAAA,EAA6C;AACtE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAE9B,IAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW;AAC/C,MAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,IAClB;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY;AAChD,MAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,iBAAA,CAAkB,MAAiB,SAAA,EAA4B;AACtE,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACpC,EAAA,IAAI,OAAA,GAAiC,IAAA;AAErC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAEtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,eAAA,CACP,WAAA,EACA,YAAA,EACA,IAAA,EACA,MAAA,EACa;AACb,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,UAAA,GAAaI,EAAAA,CAAkB,IAAA,EAAM,WAAW,CAAA;AAItD,IAAA,OAAO,kBAAkB,UAAW,CAAA;AAAA,EACtC;AAGA,EAAA,OAAO,sBAAA,CAAuB,mBAAA,CAAoB,MAAA,EAAQ,WAAW,CAAC,CAAA;AACxE;AAKA,SAAS,qBAAA,CACP,SAAA,EACA,WAAA,EACA,MAAA,EACA,YACA,IAAA,EACM;AACN,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,IAAA,EAAM,WAAW,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA;AAEhD,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,aAAA,EAAe;AACnC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oCAAA,EAAuC,WAAW,CAAA,4BAAA,EAClC,SAAS,CAAA,CAAA;AAAA,KAC3B;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,sBAAA;AAAA,IACjB,mBAAA,CAAoB,QAAQ,SAAS;AAAA,GACvC;AAGA,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,WAAA,EAAa,YAAA,EAAc,MAAM,MAAM,CAAA;AAGxE,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,QAAQ,CAAA,CAAE,MAAA,CAAO,CAACC,EAAAA,KAAM,CAAC,UAAA,CAAW,GAAA,CAAIA,EAAC,CAAC,CAAA;AAEpE,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oCAAA,EAAuC,WAAW,CAAA,mBAAA,EAC5C,aAAA,CAAc,KAAK,IAAI,CAAC,6CAA6C,SAAS,CAAA,CAAA;AAAA,KACtF;AAAA,EACF;AACF;AAMO,SAAS,mBAAA,CACd,UAAA,EACA,UAAA,EACA,QAAA,GAAW,GAAA,EACH;AACR,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,KAAA,GAAkB,CAAC,UAAU,CAAA;AACnC,EAAA,IAAI,OAAA,GAAU,UAAA;AAEd,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAA,GAAO,WAAW,OAAO,CAAA;AAE/B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACrB,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AACrC,MAAA,MAAM,QAAQ,CAAC,GAAG,MAAM,KAAA,CAAM,UAAU,GAAG,IAAI,CAAA;AAE/C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAM,IAAA,CAAK,UAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,OAAA,GAAU,IAAA;AAEV,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,0CAA0C,QAAQ,CAAA,GAAA,EAAM,KAAA,CAAM,IAAA,CAAK,UAAK,CAAC,CAAA;AAAA,OAC3E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAaO,SAAS,wBAAA,CAGd,MAAA,EACA,kBAAA,EACA,IAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,kBAAkB,MAAM,CAAA;AAC3C,EAAA,MAAM,aAAA,GAAgB,uBAAuB,MAAM,CAAA;AAGnD,EAAA,MAAM,kBAAA,GAA6C,EAAE,GAAG,kBAAA,EAAmB;AAE3E,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,CAAA,IAAK,aAAA,EAAe;AACtC,IAAA,kBAAA,CAAmB,IAAI,CAAA,GAAI,EAAA;AAAA,EAC7B;AAGA,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,CAAA,IAAK,aAAA,EAAe;AACpD,IAAA,qBAAA,CAAsB,SAAA,EAAW,WAAA,EAAa,MAAA,EAAQ,UAAA,EAAY,IAAI,CAAA;AAAA,EACxE;AAGA,EAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,kBAAkB,CAAA,EAAG;AACvD,IAAA,mBAAA,CAAoB,WAAW,kBAAkB,CAAA;AAAA,EACnD;AACF;;;ACzfO,SAAS,sBACd,QAAA,EACQ;AACR,EAAA,OAAO,QAAA,CAAS,EAAA,CAAG,EAAE,CAAA,EAAG,QAAA,IAAY,EAAA;AACtC;AAwBO,SAAS,gBAAA,CACd,aAKA,IAAA,EACmB;AACnB,EAAA,MAAM,YAAA,GAAe,IAAA,IAAQ,qBAAA,CAAsB,WAAA,CAAY,QAAQ,CAAA;AAEvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,QAAQ,WAAA,CAAY,MAAA;AAAA,IACpB,MAAM,WAAA,CAAY;AAAA,GACpB;AACF;;;AC3CO,SAAS,wBAAwB,IAAA,EAAuC;AAC7E,EAAA,CAAA,CAAkB,MAAM,aAAa,CAAA;AACvC;AAKO,SAAS,wBACd,QAAA,EAC4B;AAC5B,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,oDAAA,EAAuD,CAAA,CAAmB,QAAQ,CAAC,CAAA;AAAA,KACrF;AAAA,EACF;AACF;AAOO,SAAS,qBAAqB,MAAA,EAAqC;AACxE,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAI1B,IAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,+CAAA,EAAkD,CAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,OAC7E;AAAA,IACF;AAIA,IAAA,uBAAA,CAAwB,KAAA,EAAO,MAAM,IAAI,CAAA;AAAA,EAC3C;AACF;AAKO,SAAS,qBACd,MAAA,EAC0B;AAC1B,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,EAAA,EAAI;AAC/C,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,gEAAA,EAAmE,CAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,KAC/F;AAAA,EACF;AAGA,EAAA,CAAA,CAAkB,QAAQ,UAAU,CAAA;AACtC;AAKO,SAAS,yBAAA,CACd,IAAA,EACA,MAAA,EACA,cAAA,EACA,iBAAA,EACM;AAEN,EAAA,IAAI,CAAC,CAAA,CAAS,IAAI,CAAA,EAAG;AACnB,IAAA,MAAM,IAAI,UAAU,CAAA,2BAAA,CAA6B,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,CAAC,CAAA,CAAS,MAAM,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAI,UAAU,CAAA,+CAAA,CAAiD,CAAA;AAAA,EACvE;AAGA,EAAA,IAAI,cAAA,KAAmB,MAAA,IAAa,OAAO,cAAA,KAAmB,SAAA,EAAW;AACvE,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,6DAAA,EAAgE,OAAO,cAAc,CAAA;AAAA,KACvF;AAAA,EACF;AAGA,EAAA,IACE,iBAAA,KAAsB,MAAA,IACtB,OAAO,iBAAA,KAAsB,SAAA,EAC7B;AACA,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,gEAAA,EAAmE,OAAO,iBAAiB,CAAA;AAAA,KAC7F;AAAA,EACF;AACF;AAKO,SAAS,wBAAA,CACd,SAAA,EACA,WAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,CAAC,CAAA,CAAS,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,qBAAA,EAAwB,CAAA,CAAmB,SAAS,CAAC,CAAA,kBAAA;AAAA,KAC5E;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,CAAA,CAAS,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,uBAAA,EAA0B,CAAA,CAAmB,WAAW,CAAC,CAAA,wBAAA;AAAA,KAChF;AAAA,EACF;AACF;AAMO,SAAS,4BAAA,CAGd,MACA,OAAA,EACoD;AAEpD,EAAA,CAAA,CAAkB,MAAM,aAAa,CAAA;AAErC,EAAA,IAAI,SAAS,EAAA,EAAI;AACf,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,yEAAA;AAAA,KACF;AAAA,EACF;AAIA,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,8DAAA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACzD,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,0DAAA,EAA6D,CAAA,CAAmB,OAAO,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACF;AAQA,SAAS,cAAA,CAAe,OAAiB,SAAA,EAAyB;AAChE,EAAA,IACG,KAAA,CAA4C,YAAY,IAAA,KACvD,eAAA,IACD,MAAqC,QAAA,EAAS,CAAE,QAAA,CAAS,WAAW,CAAA,EACrE;AACA,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,8BAA8B,SAAS,CAAA,4BAAA;AAAA,KACzC;AAAA,EACF;AACF;AAKA,SAAS,qBAAA,CAAsB,OAAgB,SAAA,EAAyB;AACtE,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,2BAAA,EAA8B,SAAS,CAAA,iCAAA,EAAoC,OAAO,KAAK,CAAA;AAAA,KACzF;AAAA,EACF;AAEA,EAAA,cAAA,CAAe,OAAO,SAAS,CAAA;AACjC;AAMO,SAAS,gCAAA,CACd,SAAA,EACA,aAAA,EACA,YAAA,EACA,YAAA,EACM;AAEN,EAAA,IAAI,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,IAAA,EAAM;AACjD,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,OAAO,cAAc,UAAA,EAAY;AACpE,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,8EAAA,EAAiF,CAAA,CAAmB,SAAS,CAAC,CAAA;AAAA,OAChH;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,cAAc,UAAA,EAAY;AACnC,MAAA,cAAA,CAAe,WAAW,oBAAoB,CAAA;AAAA,IAChD;AAAA,EACF;AAGA,EAAA,IACE,aAAA,KAAkB,MAAA,IAClB,aAAA,KAAkB,IAAA,KACjB,OAAO,kBAAkB,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,CAAA,EACjE;AACA,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,wEAAA,EAA2E,CAAA,CAAmB,aAAa,CAAC,CAAA;AAAA,KAC9G;AAAA,EACF;AAEA,EAAA,qBAAA,CAAsB,cAAc,cAAc,CAAA;AAClD,EAAA,qBAAA,CAAsB,cAAc,cAAc,CAAA;AACpD;AAKO,SAAS,sBAAsB,KAAA,EAAyC;AAC7E,EAAA,IAAI,CAAC,CAAA,CAAS,KAAK,CAAA,IAAK,UAAU,EAAA,EAAI;AACpC,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,kEAAkE,OAAO,KAAA,KAAU,QAAA,GAAW,IAAA,GAAO,OAAO,KAAK,CAAA;AAAA,KACnH;AAAA,EACF;AACF;AAKO,SAAS,sBAAsB,IAAA,EAAuC;AAC3E,EAAA,IAAI,CAAC,CAAA,CAAS,IAAI,CAAA,EAAG;AACnB,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,oDAAA,EAAuD,OAAO,IAAI,CAAA;AAAA,KACpE;AAAA,EACF;AACF;AAKO,SAAS,6BACd,QAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,CAAA,CAAS,QAAQ,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,yDAAA,EAA4D,OAAO,QAAQ,CAAA;AAAA,KAC7E;AAAA,EACF;AACF;AAWO,SAAS,cAAA,CACd,MAAA,EACA,IAAA,EACA,UAAA,EACA,UAAA,EACM;AAEN,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAElC,IAAA,KAAA,MAAW,OAAA,IAAW,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,EAAG;AAC3C,MAAA,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAEhC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,mCAAmC,UAAU,CAAA,gBAAA;AAAA,SAC/C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAyB;AAEvD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAAC,EAAAA;AAAA,MACE,KAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA,IAAc,EAAA;AAAA,MACd,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,wBAAA,CAAyB,MAAA,EAAQ,YAAY,IAAI,CAAA;AAAA,EACnD;AACF;;;AClTA,IAAM,uBAAA,GAA0B,GAAA;AAChC,IAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAMC,mBAAAA,GAAqB,EAAA;AAU3B,SAAS,aAAa,GAAA,EAAyB;AAC7C,EAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,IAASP,EAAAA,GAAI,GAAA,GAAM,CAAA,EAAGA,EAAAA,IAAK,GAAGA,EAAAA,EAAAA,EAAK;AACjC,IAAA,MAAA,CAAO,IAAA,CAAK,GAAA,CAAIA,EAAC,CAAC,CAAA;AAAA,EACpB;AAEA,EAAA,OAAO,MAAA;AACT;AAeA,SAAS,iBAAiB,IAAA,EAAwB;AAEhD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,uBAAuB,CAAA;AACnD,EAAA,MAAM,eAAe,QAAA,CAAS,MAAA;AAG9B,EAAA,MAAM,GAAA,GAAgB,CAAC,QAAA,CAAS,CAAC,CAAC,CAAA;AAIlC,EAAA,IAAI,aAAA,GAAgB,QAAA,CAAS,CAAC,CAAA,CAAE,MAAA;AAEhC,EAAA,KAAA,IAASA,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAI,YAAA,GAAe,GAAGA,EAAAA,EAAAA,EAAK;AACzC,IAAA,aAAA,IAAiB,CAAA,GAAI,QAAA,CAASA,EAAC,CAAA,CAAE,MAAA;AACjC,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,aAAa,CAAC,CAAA;AAAA,EACvC;AAGA,EAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AAEb,EAAA,OAAO,GAAA;AACT;AAUA,SAAS,oBAAA,CAAqB,MAAc,KAAA,EAA6B;AACvE,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA;AAGpC,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAgB;AAEhC,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA,EAAG;AAC7B,MAAA;AAAA,IACF;AAKA,IAAA,IAAI,IAAA,CAAK,GAAG,CAAA,KAAM,MAAA,EAAW;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAG9B,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA;AAAA,IACF;AAKA,IAAA,IACE,OAAO,UAAU,QAAA,IACjB,OAAO,UAAU,QAAA,IACjB,OAAO,UAAU,SAAA,EACjB;AACA,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,IAC5B;AAAA,EAEF;AAEA,EAAA,OAAO,MAAA;AACT;AAaA,SAAS,iBAAA,CACP,OAAA,EACA,SAAA,EACA,UAAA,EACA,cACA,IAAA,EACQ;AACR,EAAA,KAAA,IAASA,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAI,IAAA,EAAMA,EAAAA,EAAAA,EAAK;AAC7B,IAAA,MAAM,SAAA,GAAY,WAAWA,EAAC,CAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,aAAaA,EAAC,CAAA;AAGlC,IAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,MAAA,OAAOA,EAAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,SAAA,EAAW,OAAO,CAAA;AACxD,IAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,WAAA,EAAa,SAAS,CAAA;AAG9D,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAEvC,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ;AACrC,MAAA,OAAOA,EAAAA;AAAA,IACT;AAGA,IAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,MAAA,IAAI,QAAA,CAAS,GAAG,CAAA,KAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACrC,QAAA,OAAOA,EAAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AA8BO,SAAS,UAAU,IAAA,EAAwB;AAGhD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,CAACO,mBAAkB,CAAA;AAAA,EAC5B;AAIA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,uBAAuB,CAAA;AAErD,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO,CAAC,IAAI,CAAA;AAAA,EACd;AAIA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAyB,WAAW,CAAC,CAAA;AAEpE,EAAA,IAAI,cAAc,EAAA,EAAI;AACpB,IAAA,OAAO;AAAA,MACL,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA;AAAA,MACtB;AAAA;AAAA,KACF;AAAA,EACF;AAIA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAyB,YAAY,CAAC,CAAA;AAEpE,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA;AAAA,MACtB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AAAA;AAAA,MACvB;AAAA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAyB,WAAW,CAAC,CAAA;AAEpE,EAAA,IAAI,cAAc,EAAA,EAAI;AACpB,IAAA,OAAO;AAAA,MACL,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,MACtB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AAAA,MACvB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,MACtB;AAAA,KACF;AAAA,EACF;AAIA,EAAA,OAAO,iBAAiB,IAAI,CAAA;AAC9B;AA8EO,SAAS,iBAAA,CACd,SACA,SAAA,EACgB;AAGhB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,kBAAA;AAAA,MACd,UAAA,EAAY,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,MAClC,cAAc;AAAC,KACjB;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,IAAA,EAAM,OAAA,IAAW,EAAC;AAIjD,EAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,kBAAA;AAAA,MACd,UAAA,EAAY,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,MAClC,YAAA,EAAc,YAAA,CAAa,SAAA,CAAU,SAAA,CAAU,IAAI,CAAC;AAAA,KACtD;AAAA,EACF;AAIA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAA,EAAM,MAAA,KAAW,MAAA;AAC3C,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,IAAA,EAAM,MAAA,KAAW,MAAA;AAE/C,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,WAAA,EAAa;AAE9B,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,kBAAA;AAAA,MACd,UAAA,EAAY,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,MAClC,YAAA,EAAc,YAAA,CAAa,SAAA,CAAU,SAAA,CAAU,IAAI,CAAC;AAAA,KACtD;AAAA,EACF;AAIA,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,SAAA,CAAU,IAAA,IAAQ,aAAa,WAAA,EAAa;AAC/D,IAAA,MAAM,aAAA,GACJ,QAAQ,IAAA,IAAQ,MAAA,CAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,CAAA;AAC9D,IAAA,MAAM,eAAA,GACJ,UAAU,IAAA,IAAQ,MAAA,CAAO,KAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,CAAA;AAElE,IAAA,IAAI,iBAAiB,eAAA,EAAiB;AAEpC,MAAA,OAAO;AAAA,QACL,cAAc,OAAA,CAAQ,IAAA;AAAA,QACtB,YAAY,EAAC;AAAA,QACb,cAAc;AAAC,OACjB;AAAA,IACF;AAAA,EACF;AAIA,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AACzC,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAC7C,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,MAAA,EAAQ,WAAW,MAAM,CAAA;AAI5D,EAAA,MAAMP,EAAAA,GAAI,iBAAA;AAAA,IACR,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,KAAA,IAASQ,KAAI,YAAA,CAAa,MAAA,GAAS,CAAA,EAAGA,EAAAA,IAAKR,IAAGQ,EAAAA,EAAAA,EAAK;AACjD,IAAA,YAAA,CAAa,IAAA,CAAK,YAAA,CAAaA,EAAC,CAAC,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,CAAMR,EAAC,CAAA;AAIrC,EAAA,MAAM,eAAeA,EAAAA,GAAI,CAAA,GAAI,YAAA,CAAaA,EAAAA,GAAI,CAAC,CAAA,GAAI,kBAAA;AAEnD,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC1XA,IAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAQ/B,IAAM,kBAAN,MAEL;AAAA;AAAA;AAAA;AAAA,EAKS,eAAkC,EAAC;AAAA,EACnC,UAAuB,iBAAA,EAAkB;AAAA,EACzC,sCAA8C,MAAA,CAAO,MAAA;AAAA,IAC5D;AAAA,GACF;AAAA;AAAA;AAAA,EAIS,mBAAA,uBAA0B,GAAA,EAGjC;AAAA;AAAA;AAAA,EAIO,qBAAA,uBAA4B,GAAA,EAGnC;AAAA,EAEF,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA,QAAA;AAAA,EACS,eAAA;AAAA;AAAA,EAGT,UAAA;AAAA;AAAA,EAGA,mBAAA;AAAA;AAAA,EAGS,WAAA;AAAA;AAAA;AAAA;AAAA,EAKT,IAAI,KAAA,GAA0C;AAE5C,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMA,YACE,MAAA,GAAgC,EAAC,EACjC,UAAA,GAAa,OACb,cAAA,EACA;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AAGvB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,IAC7C;AAGA,IAAA,IAAA,CAAK,KAAA,GAAQS,EAAAA;AAAA,MACX,kBAAA;AAAA,MACA,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAGA,IAAA,IAAA,CAAK,QAAA,GAAWC,GAAc,cAAc,CAAA;AAC5C,IAAA,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAIrC,IAAA,IAAA,CAAK,0BAA0B,MAAM,CAAA;AAIrC,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,2BAAA,EAA4B;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,wBAAwB,IAAA,EAAuC;AACpE,IAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,OAAO,wBACL,QAAA,EAC4B;AAC5B,IAAA,uBAAA,CAAwB,QAAQ,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,OAAO,qBAAqB,MAAA,EAAqC;AAC/D,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,EAC7B;AAAA,EAEA,OAAO,qBAAqB,MAAA,EAA2C;AACrE,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,EAC7B;AAAA,EAEA,OAAO,yBAAA,CACL,IAAA,EACA,MAAA,EACA,gBACA,iBAAA,EACM;AACN,IAAA,yBAAA,CAA0B,IAAA,EAAM,MAAA,EAAQ,cAAA,EAAgB,iBAAiB,CAAA;AAAA,EAC3E;AAAA,EAEA,OAAO,wBAAA,CACL,SAAA,EACA,WAAA,EACA,UAAA,EACM;AACN,IAAA,wBAAA,CAAyB,SAAA,EAAW,aAAa,UAAU,CAAA;AAAA,EAC7D;AAAA,EAEA,OAAO,4BAAA,CACL,IAAA,EACA,OAAA,EAC4C;AAC5C,IAAA,4BAAA,CAAmC,MAAM,OAAO,CAAA;AAAA,EAClD;AAAA,EAEA,OAAO,gCAAA,CACL,SAAA,EACA,aAAA,EACA,cACA,YAAA,EACM;AACN,IAAA,gCAAA;AAAA,MACE,SAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAO,sBAAsB,KAAA,EAAyC;AACpE,IAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEA,OAAO,sBAAsB,IAAA,EAAuC;AAClE,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEA,OAAO,6BACL,QAAA,EAC4B;AAC5B,IAAA,4BAAA,CAA6B,QAAQ,CAAA;AAAA,EACvC;AAAA,EAEA,OAAO,cAAA,CACL,MAAA,EACA,IAAA,EACA,YACA,UAAA,EACM;AACN,IAAA,cAAA,CAAe,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,UAAU,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgB,IAAA,EAA8C;AAC5D,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAGlB,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,OAAO,CAAA,IAAK,KAAK,mBAAA,EAAqB;AAC3D,MAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAAA,IAC1C;AAGA,IAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAG/B,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,OAAO,CAAA,IAAK,KAAK,qBAAA,EAAuB;AAC7D,MAAA,IAAA,CAAK,kBAAA,CAAmB,WAAW,OAAO,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAA,CAAK,sBAAsB,KAAA,EAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,sBACE,SAAA,EACM;AAEN,IAAA,IAAA,CAAK,mBAAA,GAAsB,SAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAA2C;AACzC,IAAA,OAAO,KAAK,OAAA,CAAQ,UAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,WAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,WAAA;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAAuB;AAC9B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAA+C;AACtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,IAAI,CAAA;AAErD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,QAAgC,CAAA;AACxE,IAAA,MAAM,UAAA,GAAaC,GAAiB,UAAU,CAAA;AAE9C,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAA,CAAU,QAA+B,UAAA,EAA2B;AAElE,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,cAAc,UAAU,CAAA;AAEpE,MAAA,SAAA,CAAU,aAAa,EAAC;AACxB,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,MAC7C;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,yBAAA,CAA0B,MAAA,EAAQ,UAAA,IAAc,EAAE,CAAA;AAGvD,IAAA,IAAA,CAAK,YAAA,EAAa;AAGlB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,IAAA,EAAuB;AACjC,IAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,IAAA,CAAK,YAAA,EAAc,IAAI,CAAA;AAEhE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,0BAA0B,IAAI,CAAA;AAGnC,IAAA,IAAA,CAAK,YAAA,EAAa;AAGlB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAExB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,iBAAA,CACE,MACA,OAAA,EAMM;AAEN,IAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,IAC/C;AAGA,IAAA,IAAI,OAAA,CAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,IAAI,OAAA,CAAQ,kBAAkB,IAAA,EAAM;AAClC,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,IAAI,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,IAAI,CAAA,GAAI,OAAA,CAAQ,aAAA;AAAA,MAC7C;AAAA,IACF;AAIA,IAAA,IAAI,OAAA,CAAQ,iBAAiB,MAAA,EAAW;AACtC,MAAA,IAAI,OAAA,CAAQ,iBAAiB,IAAA,EAAM;AACjC,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,MAAM,UAAU,OAAA,CAAQ,YAAA;AAExB,QAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAI,CAAA,GAAI,CAAC,MAAA,KAC5B,OAAA,CAAQ,MAAM,CAAA,IAA4B,MAAA;AAAA,MAC/C;AAAA,IACF;AAIA,IAAA,IAAI,OAAA,CAAQ,iBAAiB,MAAA,EAAW;AACtC,MAAA,IAAI,OAAA,CAAQ,iBAAiB,IAAA,EAAM;AACjC,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,MAAM,UAAU,OAAA,CAAQ,YAAA;AAExB,QAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAI,CAAA,GAAI,CAAC,MAAA,KAC5B,OAAA,CAAQ,MAAM,CAAA,IAA4B,MAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA;AAG3B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AACvC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA;AAAA,IAClC;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AACvC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA;AAAA,IAClC;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe;AAC5C,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,GAAG,CAAA;AAAA,IACvC;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY;AACzC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA;AAAA,IACpC;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc;AAC3C,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,GAAG,CAAA;AAAA,IACtC;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,mBAAA,EAAqB;AAC1C,MAAA,OAAO,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAAA,IACrC;AAGA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAA,CAAU,KAAA,EAAe,MAAA,EAAiB,OAAA,EAA2B;AACnE,IAAA,IAAI,KAAA,KAAU,UAAU,aAAA,EAAe;AACrC,MAAA,OAAO,CAAA,CAAS,MAAA,EAAQ,IAAI,CAAA,GAAI,OAAO,IAAA,GAAO,EAAA;AAAA,IAChD;AAGA,IAAA,MAAM,oBAAoB,MAAA,CAAO,MAAA,CAAO,KAAK,OAAA,CAAQ,aAAA,EAAe,KAAK,CAAA,GACrE,EAAE,GAAG,IAAA,CAAK,OAAA,CAAQ,cAAc,KAAK,CAAA,EAAG,GAAG,MAAA,EAAO,GACjD,UAAU,EAAC;AAGhB,IAAA,MAAM,gBACJ,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,KAAM,UAAA,GACpC,IAAA,CAAK,OAAA,CAAQ,SAAS,KAAK,CAAA,CAAE,EAAE,GAAG,iBAAA,EAAmB,CAAA,GACrD,iBAAA;AAGN,IAAA,MAAM,KAAK,OAAA,EAAS,aAAA;AACpB,IAAA,MAAM,aAAA,GAAgB,EAAA,KAAO,OAAA,IAAW,EAAA,KAAO,WAAW,EAAA,GAAK,MAAA;AAE/D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,KAAA,EAAO,aAAA,EAAe;AAAA,MACnD,aAAA;AAAA,MACA,iBAAiB,OAAA,EAAS;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CACE,MACA,OAAA,EAC0B;AAE1B,IAAA,MAAM,IAAA,GAAO,OAAA;AAEb,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAE5C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,iBAAiB,WAAW,CAAA;AAC/C,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,GAAI,UAAA;AAE/B,IAAA,MAAM,aAAA,GACJ,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAI,CAAA,KAAM,UAAA,GACnC,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,CAAE,MAAgB,CAAA,GAC5C,MAAA;AAEN,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,WAAA,EAAY,GAAI,KAAK,KAAA,CAAM,YAAA;AAAA,MAC1D,IAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,SAAA,GAAY,IAAA;AAEhB,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,MAAM,WAAA,GACJ,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,KAAM,UAAA,GACxC,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,CAAE;AAAA,QAC/B,GAAI;AAAA,OACL,CAAA,GACA,WAAA;AAEP,MAAA,MAAM,KAAK,IAAA,CAAK,aAAA;AAEhB,MAAA,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,SAAA,EAAW,WAAA,EAAa;AAAA,QAC1D,aAAA,EAAe,EAAA,KAAO,OAAA,IAAW,EAAA,KAAO,WAAW,EAAA,GAAK,MAAA;AAAA,QACxD,iBAAiB,IAAA,CAAK;AAAA,OACvB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAiB,SAAA,EAAW,aAAa,SAAA,EAAW;AAAA,MACpE,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAA,CACE,MACA,MAAA,EAC6B;AAE7B,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,IAAI,CAAA,EAAG;AAClD,MAAA,MAAM,wBAAA,GAA2B,IAAA,CAAK,mBAAA,CAAoB,IAAA,EAAM,MAAM,CAAA;AACtE,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA;AACrD,MAAA,MAAM,WAAW,IAAA,CAAK,sBAAA;AAAA,QACpB,IAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,wBAAwB;AAAA,OACrE;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA,IAAK,IAAA;AAGxD,IAAA,IACE,aAAA,KAAkB,QAClB,MAAA,CAAO,MAAA,CAAO,KAAK,OAAA,CAAQ,YAAA,EAAc,aAAa,CAAA,EACtD;AACA,MAAA,MAAM,wBAAA,GAA2B,IAAA,CAAK,mBAAA,CAAoB,IAAA,EAAM,MAAM,CAAA;AACtE,MAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AACpE,MAAA,MAAM,WAAW,IAAA,CAAK,sBAAA;AAAA,QACpB,aAAA;AAAA,QACA,oBAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,wBAAwB;AAAA,OACrE;AAAA,IACF;AAGA,IAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,MAAA,MAAM,wBAAA,GAA2B,IAAA,CAAK,mBAAA,CAAoB,IAAA,EAAM,MAAM,CAAA;AAEtE,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,QAAQ,IAAA,CAAK,mBAAA;AAAA,UACX,aAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF;AAGA,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAK,mBAAA,CAAoB,IAAA,EAAM,MAAM,CAAA,EAAE;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,CACE,cACA,cAAA,EAC4B;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,YAAY,CAAA;AAE7D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,YAAY,CAAA;AAErD,IAAA,OAAO,gBAAA;AAAA,MACL,EAAE,QAAA,EAAU,MAAA,EAAQ,cAAA,EAAgB,IAAA,EAAK;AAAA,MACzC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,8BAAA,CACE,cACA,cAAA,EAC6C;AAC7C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,YAAY,CAAA;AAE7D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,YAAY,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,gBAAA;AAAA,MACZ;AAAA,QACE,QAAA;AAAA,QACA,MAAA,EAAQ,cAAA;AAAA,QACR;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,OAAO,QAAA,EAA2C;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAA,CACE,MACA,MAAA,GAAiB,IACjB,cAAA,GAAiB,KAAA,EACjB,oBAAoB,IAAA,EACX;AAET,IAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAI,IAAI,CAAA,EAAG;AAClC,MAAA,CAAA,CAAkB,MAAM,eAAe,CAAA;AACvC,MAAA,mBAAA,CAAoB,IAAI,IAAI,CAAA;AAAA,IAC9B;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AAExC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAa,WAAA,CAAY,IAAA;AAG/B,IAAA,IACE,UAAA,KAAe,IAAA,IACf,CAAC,UAAA,CAAW,WAAW,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,CAAA,IACjC,CAAC,IAAA,CAAK,UAAA,CAAW,CAAA,EAAG,UAAU,GAAG,CAAA,EACjC;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,IAAI,CAAA;AAKrD,IAAA,IAAI,cAAA,IAAkB,eAAe,IAAA,EAAM;AACzC,MAAA,MAAM,kBAAkB,aAAA,GACpB,EAAE,GAAG,aAAA,EAAe,GAAG,QAAO,GAC9B,MAAA;AAEJ,MAAA,MAAM,WAAA,GAAqB;AAAA,QACzB,IAAA;AAAA,QACA,MAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACR;AAEA,MAAA,OAAO,KAAK,KAAA,CAAM,cAAA;AAAA,QAChB,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,eAAe,WAAA,CAAY,MAAA;AAEjC,IAAA,IAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,YAAY,CAAA,EAAG;AACtC,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,OACE,CAAC,aAAA,IACD,oBAAA,CAAqB,aAAA,EAAe,cAAc,MAAM,CAAA;AAAA,EAE5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBACE,QAAA,EACgD;AAChD,IAAA,OAAO,CAAC,SAAgB,SAAA,KAA+B;AAErD,MAAA,IAAI,EAAE,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,IAAY,UAAU,OAAA,CAAA,EAAU;AAClE,QAAA,MAAM,IAAI,SAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,MAAA,EAAQ;AAChC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,QAAA,KAAa,kBAAA,IAAsB,CAAC,SAAA,EAAW;AACjD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,EAAE,YAAA,EAAc,UAAA,EAAY,YAAA,EAAa,GAAI,iBAAA;AAAA,QACjD,OAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA,EAAG;AACjC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,YAAA,CAAa,SAAS,QAAQ,CAAA;AAAA,IACvC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,IAAA,EAAwB;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,IAAI,CAAA;AAErD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,IAAA,CAAK,uBAAuB,QAAgC,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAAgD;AAC9C,IAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,GAAA,EAAmC;AACvD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,mBAAA,EAAqB,GAAG,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAA,CACE,QACA,kBAAA,EACM;AACN,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,OAAO,QAAQ,CAAA;AACpD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,OAAO,QAAQ,CAAA;AACpD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,OAAO,aAAa,CAAA;AAC9D,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,OAAO,UAAU,CAAA;AACxD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,OAAO,YAAY,CAAA;AAC5D,IAAA,IAAA,CAAK,qBAAA,CAAsB,EAAE,GAAG,kBAAA,EAAoB,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAqC;AACnC,IAAA,OAAOC,EAAAA,CAAuB,KAAK,KAAK,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,mCAAA,CACE,YACA,UAAA,EACM;AACN,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAA;AAC1D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAA;AAG1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,iBAAA,CAAkB,cAAc,CAAA;AAC1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,cAAc,CAAA;AAG/D,IAAA,MAAM,gBAAgB,YAAA,CAAa,MAAA;AAAA,MACjC,CAAC,KAAA,KAAU,CAAC,YAAA,CAAa,IAAI,KAAK;AAAA,KACpC;AAEA,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gCAAA,EAAmC,UAAU,CAAA,mBAAA,EACvC,aAAA,CAAc,KAAK,IAAI,CAAC,6CAA6C,UAAU,CAAA,CAAA;AAAA,OACvF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,sBAAA,CAAuB,YAAoB,UAAA,EAA0B;AAEnE,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAG,KAAK,OAAA,CAAQ,UAAA;AAAA,MAChB,CAAC,UAAU,GAAG;AAAA,KAChB;AAGA,IAAA,mBAAA,CAAoB,YAAY,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,mBAAA,CACE,IAAA,EACA,gBAAA,EACA,YAAA,EACS;AAET,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,eAAe,gBAAA,KAAqB,IAAA;AAC1C,MAAA,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,UAAA,CAAW,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,CAAA;AAEhE,MAAA,IAAI,gBAAgB,iBAAA,EAAmB;AACrC,QAAA,MAAM,MAAA,GAAS,YAAA,GAAe,EAAA,GAAK,CAAA,YAAA,EAAe,gBAAgB,CAAA,EAAA,CAAA;AAElE,QAAAd,aAAAA,CAAO,IAAA;AAAA,UACL,oBAAA;AAAA,UACA,CAAA,qBAAA,EAAwB,IAAI,CAAA,+BAAA,EAA6B,MAAM,CAAA,sBAAA;AAAA,SACjE;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAAA,aAAAA,CAAO,IAAA;AAAA,QACL,oBAAA;AAAA,QACA,UAAU,IAAI,CAAA,8EAAA;AAAA,OAChB;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,oBAAoB,YAAA,EAAgC;AAClD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAAA,aAAAA,CAAO,KAAA;AAAA,QACL,oBAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBAAA,CACE,MACA,SAAA,EACM;AAEN,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,qCAAqC,IAAI,CAAA,gBAAA;AAAA,OAC3C;AAAA,IACF;AAGA,IAAA,IACE,cAAc,MAAA,IACd,SAAA,KAAc,IAAA,IACd,OAAO,cAAc,QAAA,EACrB;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,gDAAgD,SAAS,CAAA,gBAAA;AAAA,SAC3D;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,mCAAA,CAAoC,MAAM,SAAS,CAAA;AAGxD,MAAA,IAAA,CAAK,sBAAA,CAAuB,MAAM,SAAS,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,CACE,MACA,SAAA,EACM;AACN,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AACnC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA;AAAA,IACvC,CAAA,MAAA,IAAW,OAAO,SAAA,KAAc,QAAA,EAAU;AACxC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA;AACrC,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,GAAI,SAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AACnC,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA,GAAI,SAAA;AAAA,IACpC;AAEA,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,CACE,WACA,MAAA,EACG;AACH,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,SAAS,CAAA,EAAG;AACxD,MAAA,OAAO,EAAE,GAAG,IAAA,CAAK,OAAA,CAAQ,cAAc,SAAS,CAAA,EAAG,GAAG,MAAA,EAAO;AAAA,IAC/D;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAA,CACE,SAAA,EAEA,OAAA,EACA,MAAA,EACQ;AACR,IAAA,MAAM,OAAA,mBAAU,IAAI,GAAA,CAAY,CAAC,SAAS,CAAC,CAAA;AAG3C,IAAA,IAAI,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,eAAsB,MAAM,CAAA;AAC7D,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,SAAA,GAAY,GAAA;AAGlB,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,6CAAA,EAAgD,OAAO,OAAO,CAAA;AAAA,OAChE;AAAA,IACF;AAEA,IAAA,OAAO,QAAQ,SAAA,EAAW;AAGxB,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,OAAO,MAAM,MAAA,EAAW;AAC1D,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,gBAAA,CAAkB,CAAA;AAAA,MACrD;AAGA,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACxB,QAAA,MAAM,QAAQ,CAAC,GAAG,SAAS,OAAO,CAAA,CAAE,KAAK,UAAK,CAAA;AAE9C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAE,CAAA;AAAA,MACzD;AAEA,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAGnB,MAAA,IAAI,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,OAAO,CAAA,EAAG;AACrD,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAG5C,QAAA,OAAA,GAAU,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,aAAA,EAAsB,MAAM,CAAA;AAEpD,QAAA,KAAA,EAAA;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAGrD,MAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,QAAA,OAAA,GAAU,aAAA;AACV,QAAA,KAAA,EAAA;AACA,QAAA;AAAA,MACF;AAGA,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,SAAS,CAAA,CAAE,CAAA;AAAA,EACnE;AAAA,EAEA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQW,EAAAA;AAAA,MACX,kBAAA;AAAA,MACA,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAGA,IAAA,IAAA,CAAK,QAAA,GAAWC,EAAAA,CAAc,IAAA,CAAK,eAAe,CAAA;AAClD,IAAA,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,IAAA,EAAoC;AAEtD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,QAAA,EAA2C;AAEzD,IAAA,OAAO,QAAA,CAAS,GAAG,EAAE,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAAA,EAA6C;AAC7D,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAE9B,MAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW;AAC/C,QAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAuB,QAAA,EAA0C;AAC/D,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAE9B,MAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW;AAC/C,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA2B;AACzB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,2BAAA,EAA4B;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,2BAAA,GAAoC;AAElC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,mBAAA,EAAqB;AAC1C,MAAA,OAAO,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAAA,IACrC;AAGA,IAAA,KAAA,MAAW,aAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC5D,MAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA,GAAI,mBAAA;AAAA,QACpC,SAAA;AAAA,QACA,KAAK,OAAA,CAAQ;AAAA,OACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAyB;AAEvB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,mBAAA,EAAqB;AAC1C,MAAA,OAAO,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAAA,IACrC;AAGA,IAAA,KAAA,MAAW,aAAa,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC5D,MAAA,IAAI,OAAA,GAAU,SAAA;AAEd,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AACvC,QAAA,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAAA,MAC3C;AAEA,MAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA,GAAI,OAAA;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,0BAA0B,SAAA,EAAyB;AACjD,IAAA,MAAM,WAAA,GAAc,CAACG,EAAAA,KACnBA,EAAAA,KAAM,aAAaA,EAAAA,CAAE,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,CAAA,CAAG,CAAA;AAEjD,IAAA,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,WAAW,CAAA;AACrD,IAAA,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,WAAW,CAAA;AACrD,IAAA,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,WAAW,CAAA;AAC1D,IAAA,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,WAAW,CAAA;AACvD,IAAA,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,WAAW,CAAA;AAGzD,IAAA,kBAAA;AAAA,MAAmB,KAAK,OAAA,CAAQ,UAAA;AAAA,MAAY,CAAC,GAAA,KAC3C,WAAA,CAAY,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAC;AAAA,KAC1C;AAGA,IAAA,MAAM,CAAC,sBAAA,EAAwB,oBAAoB,CAAA,GACjD,IAAA,CAAK,oBAAoB,YAAA,EAAa;AAExC,IAAA,KAAA,MAAWA,EAAAA,IAAK,MAAA,CAAO,IAAA,CAAK,oBAAoB,CAAA,EAAG;AACjD,MAAA,IAAI,WAAA,CAAYA,EAAC,CAAA,EAAG;AAClB,QAAA,IAAA,CAAK,mBAAA,CAAoB,iBAAiBA,EAAC,CAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,KAAA,MAAWA,EAAAA,IAAK,MAAA,CAAO,IAAA,CAAK,sBAAsB,CAAA,EAAG;AACnD,MAAA,IAAI,WAAA,CAAYA,EAAC,CAAA,EAAG;AAClB,QAAA,IAAA,CAAK,mBAAA,CAAoB,mBAAmBA,EAAC,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,yBAAA,CACE,MAAA,EACA,UAAA,GAAa,EAAA,EACP;AACN,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,QAAA,GAAW,aAAa,CAAA,EAAG,UAAU,IAAI,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA;AAEpE,MAAA,IAAA,CAAK,4BAAA,CAA6B,OAAO,QAAQ,CAAA;AAEjD,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,IAAA,CAAK,yBAAA,CAA0B,KAAA,CAAM,QAAA,EAAU,QAAQ,CAAA;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,4BAAA,CACE,OACA,QAAA,EACM;AAEN,IAAA,IAAI,MAAM,WAAA,EAAa;AAGrB,MAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,QAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,QAAA,EAAU,KAAA,CAAM,WAAW,CAAA;AAAA,MAC9D,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,QAAA,EAAU,KAAA,CAAM,WAAW,CAAA;AAAA,MAC1D;AAAA,IACF;AAGA,IAAA,IAAI,MAAM,aAAA,EAAe;AAGvB,MAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,QAAA,IAAA,CAAK,UAAA,CAAW,kBAAA,CAAmB,QAAA,EAAU,KAAA,CAAM,aAAa,CAAA;AAAA,MAClE,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,QAAA,EAAU,KAAA,CAAM,aAAa,CAAA;AAAA,MAC9D;AAAA,IACF;AAGA,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,QAAQ,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAQ,CAAA,GAAI,CAAC,MAAA,KACjC,KAAA,CAAM,YAAA,GAAe,MAAM,CAAA,IAAK,MAAA;AAAA,IACpC;AAEA,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAQ,CAAA,GAAI,CAAC,MAAA,KACjC,KAAA,CAAM,YAAA,GAAe,MAAM,CAAA,IAAK,MAAA;AAAA,IACpC;AAGA,IAAA,IAAI,MAAM,aAAA,EAAe;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAA,GAAI,KAAA,CAAM,aAAA;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,eAAA,CACE,WAAA,EACA,QAAA,EACA,YAAA,GAAe,EAAA,EACc;AAC7B,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,MAAM,eAAA,GAAkB,eACpB,CAAA,EAAG,YAAY,IAAI,GAAA,CAAI,IAAI,KAC3B,GAAA,CAAI,IAAA;AAER,MAAA,IAAI,oBAAoB,QAAA,EAAU;AAChC,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,IAAI,IAAI,QAAA,IAAY,QAAA,CAAS,WAAW,CAAA,EAAG,eAAe,GAAG,CAAA,EAAG;AAC9D,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAA,EAAU,UAAU,eAAe,CAAA;AAAA,MACrE;AAAA,IACF;AAGA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,kBAAA,CAAmB,OAA4B,QAAA,EAAwB;AACrE,IAAA,IAAI,MAAM,WAAA,EAAa;AAErB,MAAA,MAAM,gBACJ,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GAAW,MAAM,SAAA,GAAY,WAAA;AAE1D,MAAAf,aAAAA,CAAO,IAAA;AAAA,QACL,aAAA;AAAA,QACA,CAAA,OAAA,EAAU,QAAQ,CAAA,kKAAA,EAEyB,aAAa,CAAA,EAAA;AAAA,OAC1D;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,aAAA,EAAe;AAEvB,MAAA,MAAM,gBACJ,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GAAW,MAAM,SAAA,GAAY,WAAA;AAE1D,MAAAA,aAAAA,CAAO,IAAA;AAAA,QACL,aAAA;AAAA,QACA,CAAA,OAAA,EAAU,QAAQ,CAAA,wKAAA,EAE2B,aAAa,CAAA,EAAA;AAAA,OAC5D;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,UAAA,EAAY;AACzC,MAAA,MAAM,aAAA,GACH,KAAA,CAAM,SAAA,CAAgD,WAAA,CACpD,IAAA,KAAS,eAAA;AACd,MAAA,MAAM,oBAAoB,KAAA,CAAM,SAAA,CAC7B,QAAA,EAAS,CACT,SAAS,WAAW,CAAA;AAEvB,MAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,iDAAiD,QAAQ,CAAA,6CAAA;AAAA,SAE3D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AACvC,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,GAAI,KAAA,CAAM,SAAA;AAAA,IAC5C,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA,GAAI,KAAA,CAAM,SAAA;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,YAAA,CACE,UACA,SAAA,EACqB;AACrB,IAAA,MAAM,KAAA,GAA6B;AAAA,MACjC,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,MAAM,QAAA,CAAS;AAAA,KACjB;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA;AACvD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA;AAGtD,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,KAAA,CAAM,SAAA,GAAY,WAAA;AAAA,IAEpB,CAAA,MAAA,IAAW,iBAAiB,MAAA,EAAW;AACrC,MAAA,KAAA,CAAM,SAAA,GAAY,YAAA;AAAA,IACpB;AAEA,IAAA,IAAI,SAAA,IAAa,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe;AAC3C,MAAA,KAAA,CAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,SAAS,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,SAAA,IAAa,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AACtC,MAAA,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,SAAA,IAAa,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AACtC,MAAA,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,CAAC,sBAAA,EAAwB,oBAAoB,CAAA,GACjD,IAAA,CAAK,oBAAoB,YAAA,EAAa;AAExC,IAAA,IAAI,aAAa,oBAAA,EAAsB;AACrC,MAAA,KAAA,CAAM,WAAA,GAAc,qBAAqB,SAAS,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,aAAa,sBAAA,EAAwB;AACvC,MAAA,KAAA,CAAM,aAAA,GAAgB,uBAAuB,SAAS,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,KAAA,CAAM,QAAA,GAAW,SAAS,QAAA,CAAS,GAAA;AAAA,QAAI,CAAC,KAAA,KACtC,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,GAAG,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE;AAAA,OACvD;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;;;ACz7CA,IAAM,wBAAA,uBAA+B,GAAA,CAAI;AAAA,EACvC,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAwBM,SAAS,aAAA,CACd,QACA,OAAA,EACmB;AAEnB,EAAA,MAAM,IAAA,GAA0B,OAAA,GAAU,EAAE,OAAA,KAAY,EAAC;AAGzD,EAAA,IAAI,kBAAkB,KAAA,EAAO;AAC3B,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAO,MAAA,CAAO,KAAA;AAAA;AAAA,MAEd,GAAI,WAAW,MAAA,IACb,MAAA,CAAO,UAAU,MAAA,IAAa,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA;AAAM,KACxD;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,IAAA,MAAM,WAAoC,EAAC;AAE3C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAEjD,MAAA,IAAI,CAAC,wBAAA,CAAyB,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,QAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,QAAA,EAAS;AAAA,EAChC;AAIA,EAAA,OAAO,IAAA;AACT;;;ACxEA,IAAM,kBAAkB,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,UAAU,CAAC,CAAA;AAGzD,IAAM,kBAAA,uBAAyB,GAAA,CAAI,CAAC,QAAQ,SAAA,EAAW,MAAA,EAAQ,UAAU,CAAC,CAAA;AAG1E,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA;AAAA;AAAA,EAK5B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA;AAAA;AAAA,EAIT,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqCA,YACE,IAAA,EACA;AAAA,IACE,OAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,GACL,GAMI,EAAC,EACL;AACA,IAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAErB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAEZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA,GAAW,eAAA,CAAgB,QAAQ,CAAA,GAAI,MAAA;AAIvD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,IAAI,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,+CAA+C,GAAG,CAAA,CAAA;AAAA,SACpD;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,QAAQ,OAAA,EAAuB;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AAGZ,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,iBAAiB,GAAA,EAAkB;AAEjC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,SAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,KAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,IAAS,EAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,oBAAoB,MAAA,EAAuC;AAEzD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,mEAAmE,GAAG,CAAA,CAAA;AAAA,SACxE;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,SAAS,GAAA,EAAsB;AAC7B,IAAA,OAAO,GAAA,IAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,SAAS,GAAA,EAAsB;AAC7B,IAAA,OAAO,KAAK,GAAG,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BA,MAAA,GAAkC;AAChC,IAAA,MAAM,MAAA,GAAkC;AAAA,MACtC,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK;AAAA,KAChB;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,MAAA,MAAA,CAAO,UAAU,IAAA,CAAK,OAAA;AAAA,IACxB;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,MAAA,CAAO,OAAO,IAAA,CAAK,IAAA;AAAA,IACrB;AACA,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,MAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AAAA,IACzB;AAKA,IAAA,MAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,MAC1B,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,MAAA,CAAO,OAAO,IAAA,EAAM,GAAG,KAAK,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACrD,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;AC3SO,SAAS,oBAAA,CACd,KAAA,EACA,SAAA,EACA,OAAA,EACO;AACP,EAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,IAAA,KAAA,CAAM,QAAQ,SAAS,CAAA;AAEvB,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,MAAM,IAAI,WAAA,CAAY,SAAA,EAAW,aAAA,CAAc,KAAA,EAAO,OAAO,CAAC,CAAA;AAChE;;;ACnBO,IAAM,WAAA,GAAc,CAAC,OAAA,EAAgB,SAAA,KAA4B;AACtE,EAAA,MAAM,SAAS,OAAA,CAAQ,IAAA;AACvB,EAAA,MAAM,WAAW,SAAA,CAAU,IAAA;AAI3B,EAAA,MAAM,WAAW,MAAA,EAAQ,MAAA;AACzB,EAAA,MAAM,aAAa,QAAA,EAAU,MAAA;AAG7B,EAAA,MAAM,UAAA,GACJ,QAAA,IAAY,UAAA,GACR,EAAE,GAAG,QAAA,EAAU,GAAG,UAAA,EAAW,GAC5B,QAAA,IAAY,UAAA,IAAc,EAAC;AAIlC,EAAA,MAAM,UAAA,GAAwB;AAAA;AAAA,IAE5B,EAAA,EAAI,CAAA;AAAA,IACJ,SAAS,EAAC;AAAA;AAAA,IAEV,GAAG,QAAA;AAAA;AAAA,IAEH,GAAG,MAAA;AAAA;AAAA,IAEH,MAAA,EAAQ;AAAA,GACV;AAKA,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,IAAA,EAAM;AAAA,GACR;AACF,CAAA;;;ACvCA,SAAS,kBAAA,CACP,QACA,SAAA,EACmB;AACnB,EAAA,IAAI,kBAAkB,KAAA,EAAO;AAC3B,IAAA,OAAO;AAAA,MACL,GAAG,SAAA;AAAA,MACH,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAO,MAAA,CAAO,KAAA;AAAA;AAAA,MAEd,GAAI,WAAW,MAAA,IACb,MAAA,CAAO,UAAU,MAAA,IAAa,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA;AAAM,KACxD;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,IAAA,OAAO,EAAE,GAAG,SAAA,EAAW,GAAG,MAAA,EAAO;AAAA,EACnC;AAEA,EAAA,OAAO,SAAA;AACT;AAGO,IAAM,sBAAA,GAAyB,OACpC,MAAA,EACA,YAAA,EACA,OAAA,KACmB;AACnB,EAAA,MAAM,SAAA,GAAY,OAAA,GAAU,EAAE,OAAA,KAAY,EAAC;AAE3C,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,WAAW,SAAA,EAAW;AAC/B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,YAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,cAAA,EAAgB,SAAS,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,IAAI,CAAA,CAAQ,MAAM,CAAA,EAAG;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAA,CAAuC,MAAM,CAAA,EAAG;AAElD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,MAAA;AAErB,MAAA,OAAO,MAAM,sBAAA,CAAuB,MAAA,EAAQ,YAAA,EAAc,OAAO,CAAA;AAAA,IACnE,SAAS,MAAA,EAAiB;AACxB,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,UAAA,CAAW,cAAA;AAAA,QACX,kBAAA,CAAmB,QAAQ,SAAS;AAAA,OACtC;AAAA,IACF;AAAA,EACF;AAIA,EAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,cAAA,EAAgB;AAAA,IAC/C,GAAG,SAAA;AAAA,IACH,OAAA,EAAS,CAAA,+BAAA,EAAkC,OAAO,MAAM,CAAA;AAAA,GACzD,CAAA;AACH,CAAA;;;AClEO,IAAM,wBAAwB,OACnC,KAAA,EACA,SACA,SAAA,EACA,QAAA,EACA,WACA,WAAA,KACmB;AACnB,EAAA,IAAI,YAAA,GAAe,OAAA;AACnB,EAAA,MAAM,iBAAA,GAAoB,SAAS,MAAA,CAAO,CAAC,SAAS,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AAEnE,EAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACvC,IAAA,IAAI,aAAY,EAAG;AACjB,MAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,oBAAoB,CAAA;AAAA,IACvD;AAIA,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAEhC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,EAAc,SAAS,CAAA;AAC7C,MAAA,MAAM,WAAW,MAAM,sBAAA;AAAA,QACrB,MAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAIA,MAAA,IAAI,QAAA,KAAa,YAAA,IAAgB,CAAA,CAAQ,QAAQ,CAAA,EAAG;AAElD,QAAA,IAAI,QAAA,CAAS,IAAA,KAAS,YAAA,CAAa,IAAA,EAAM;AACvC,UAAA,MAAM,IAAI,YAAY,SAAA,EAAW;AAAA,YAC/B,OAAA,EACE,4DAAA;AAAA,YACF,iBAAA,EAAmB;AAAA,cACjB,MAAM,QAAA,CAAS,IAAA;AAAA,cACf,QAAQ,QAAA,CAAS,MAAA;AAAA,cACjB,MAAM,QAAA,CAAS;AAAA;AACjB,WACD,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,aACJ,QAAA,CAAS,MAAA,KAAW,aAAa,MAAA,IACjC,QAAA,CAAS,SAAS,YAAA,CAAa,IAAA;AAEjC,QAAA,IAAI,UAAA,EAAY;AACd,UAAAA,aAAAA,CAAO,KAAA;AAAA,YACL,iBAAA;AAAA,YACA,0CAAA;AAAA,YACA,EAAE,IAAA,EAAM,YAAA,EAAc,EAAA,EAAI,QAAA;AAAS,WACrC;AAAA,QACF;AAEA,QAAA,YAAA,GAAe,WAAA,CAAY,UAAU,YAAY,CAAA;AAAA,MACnD;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,oBAAA,CAAqB,KAAA,EAAO,WAAW,OAAO,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT,CAAA;ACrEO,IAAM,iBAAA,GAAoB,OAC/B,mBAAA,EACA,OAAA,EACA,WACA,WAAA,KACmB;AACnB,EAAA,IAAI,YAAA,GAAe,OAAA;AAEnB,EAAA,KAAA,MAAW,gBAAgB,mBAAA,EAAqB;AAC9C,IAAA,IAAI,aAAY,EAAG;AACjB,MAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,oBAAoB,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,YAAA,EAAc,SAAS,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,CAAuB,MAAA,EAAQ,YAAY,CAAA;AAIlE,MAAA,IAAI,QAAA,KAAa,YAAA,IAAgB,CAAA,CAAQ,QAAQ,CAAA,EAAG;AAClD,QAAA,MAAM,UAAA,GACJ,QAAA,CAAS,IAAA,KAAS,YAAA,CAAa,IAAA,IAC/B,QAAA,CAAS,MAAA,KAAW,YAAA,CAAa,MAAA,IACjC,QAAA,CAAS,IAAA,KAAS,YAAA,CAAa,IAAA;AAEjC,QAAA,IAAI,UAAA,EAAY;AACd,UAAAA,aAAAA,CAAO,KAAA;AAAA,YACL,iBAAA;AAAA,YACA,oDAAA;AAAA,YACA,EAAE,IAAA,EAAM,YAAA,EAAc,EAAA,EAAI,QAAA;AAAS,WACrC;AAAA,QACF;AAEA,QAAA,YAAA,GAAe,WAAA,CAAY,UAAU,YAAY,CAAA;AAAA,MACnD;AAAA,IACF,SAAS,KAAA,EAAgB;AACvB,MAAA,oBAAA,CAAqB,KAAA,EAAO,WAAW,cAAc,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT,CAAA;;;AC5CA,eAAsB,UAAA,CACpB,IAAA,EACA,OAAA,EACA,SAAA,EACA,IAAA,EAC2B;AAE3B,EAAA,MAAM,CAAC,sBAAA,EAAwB,oBAAoB,CAAA,GACjD,KAAK,qBAAA,EAAsB;AAC7B,EAAA,MAAM,mBAAA,GAAsB,KAAK,sBAAA,EAAuB;AACxD,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,IAAA,KAAS,SAAA,CAAU,aAAA;AAIlD,EAAA,MAAM,WAAA,GAAc,MAAM,CAAC,IAAA,CAAK,QAAA,EAAS;AAEzC,EAAA,MAAM,EAAE,YAAA,EAAc,UAAA,EAAY,YAAA,EAAa,GAAI,iBAAA;AAAA,IACjD,OAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,mBACJ,SAAA,IAAa,CAAC,IAAA,CAAK,eAAA,IAAmB,aAAa,MAAA,GAAS,CAAA;AAC9D,EAAA,MAAM,cAAA,GAAiB,CAAC,cAAA,IAAkB,UAAA,CAAW,MAAA,GAAS,CAAA;AAC9D,EAAA,MAAM,mBAAA,GAAsB,oBAAoB,MAAA,GAAS,CAAA;AAEzD,EAAA,IAAI,YAAA,GAAe,OAAA;AAEnB,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,YAAA,GAAe,MAAM,qBAAA;AAAA,MACnB,sBAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA,CAAW,iBAAA;AAAA,MACX;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,aAAY,EAAG;AACjB,IAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,oBAAoB,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,YAAA,GAAe,MAAM,qBAAA;AAAA,MACnB,oBAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA,CAAW,eAAA;AAAA,MACX;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,aAAY,EAAG;AACjB,IAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,oBAAoB,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,YAAA,GAAe,MAAM,iBAAA;AAAA,MACnB,mBAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,aAAY,EAAG;AACjB,IAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,oBAAoB,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAC7C,IAAA,MAAM,sBAAA,GAAyB,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAEvD,IAAA,KAAA,MAAW,QAAQ,sBAAA,EAAwB;AACzC,MAAA,IAAI,CAAC,eAAe,QAAA,CAAS,IAAI,KAAK,sBAAA,CAAuB,GAAA,CAAI,IAAI,CAAA,EAAG;AACtE,QAAA,IAAA,CAAK,mBAAmB,IAAI,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,YAAA;AAAA,MACP,QAAA,EAAU;AAAA,QACR,WAAA,EAAa,YAAA;AAAA,QACb,SAAA,EAAW,UAAA;AAAA,QACX;AAAA;AACF;AACF,GACF;AACF;;;AC5FO,SAAS,qBAAqB,IAAA,EAAuC;AAC1E,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,2DAAA,EAA8D,CAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,KACxF;AAAA,EACF;AACF;AAKO,SAAS,2BAAA,CACd,OAAA,EACA,SAAA,EACA,IAAA,EACM;AAEN,EAAA,IACE,CAAC,OAAA,IACD,OAAO,OAAA,KAAY,QAAA,IACnB,OAAQ,OAAA,CAAkB,IAAA,KAAS,QAAA,IACnC,OAAQ,OAAA,CAAkB,IAAA,KAAS,QAAA,EACnC;AACA,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,kFAAA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IACE,SAAA,KAAc,MAAA,KACb,CAAC,SAAA,IACA,OAAO,cAAc,QAAA,IACrB,OAAQ,SAAA,CAAoB,IAAA,KAAS,QAAA,CAAA,EACvC;AACA,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,8EAAA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,8EAAA,EAAiF,CAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,KAC3G;AAAA,EACF;AACF;AAKO,SAAS,8BAA8B,IAAA,EAAqB;AAEjE,EAAA,IAAI,SAAS,MAAA,KAAc,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,IAAA,CAAA,EAAO;AACrE,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,4CAAA,EAA+C,CAAA,CAAmB,IAAI,CAAC,CAAA,oCAAA;AAAA,KACzE;AAAA,EACF;AACF;AAKO,SAAS,yBAAA,CACd,MACA,UAAA,EACmC;AACnC,EAAA,IAAI,CAACgB,EAAAA,CAAoB,IAAI,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,QAAA,EAAW,UAAU,CAAA,mBAAA,EAAsB,CAAA,CAAmB,IAAI,CAAC,CAAA,oCAAA;AAAA,KACrE;AAAA,EACF;AACF;;;ACtDO,IAAM,mBAAA,GAAN,MAAM,oBAAA,CAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,YAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,qBAAqB,IAAA,EAAuC;AACjE,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,OAAO,2BAAA,CACL,OAAA,EACA,SAAA,EACA,IAAA,EACM;AACN,IAAA,2BAAA,CAA4B,OAAA,EAAS,WAAW,IAAI,CAAA;AAAA,EACtD;AAAA,EAEA,OAAO,8BAA8B,IAAA,EAAqB;AACxD,IAAA,6BAAA,CAA8B,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,OAAO,yBAAA,CACL,IAAA,EACA,UAAA,EACmC;AACnC,IAAA,yBAAA,CAA0B,MAAM,UAAU,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,eAAe,EAAA,EAAyB;AACtC,IAAA,IAAA,CAAK,YAAA,GAAe,EAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,IAAA,EAAoC;AAClD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,0BAA0B,IAAA,EAAoC;AAC5D,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAA,CACJ,IAAA,EACA,MAAA,EACA,IAAA,EACgB;AAChB,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAa,EAAG;AACxB,MAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,kBAAkB,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAElB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,sBAAA,CAAuB,IAAA,EAAM,MAAM,CAAA;AAEvD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,UAAA,CAAW,eAAe,CAAA;AAEtD,MAAA,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAW,IAAA,CAAK,QAAA,IAAY,GAAG,CAAA;AAExD,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AAEzB,IAAA,MAAM,UAAU,IAAA,CAAK,SAAA;AAAA,MACnB,KAAA,CAAM,IAAA;AAAA,MACN,KAAA,CAAM,MAAA;AAAA,MACN,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,MAAM,MAAM,CAAA;AAAA,MACvC;AAAA,QACE,QAAQ,KAAA,CAAM,IAAA;AAAA,QACd,OAAA,EAAS;AAAA;AACX,KACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,QAAA,EAAS;AAEhC,IAAA,IACE,CAAC,IAAA,CAAK,MAAA,IACN,CAAC,IAAA,CAAK,KAAA,IACN,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,OAAA,EAAS,KAAK,CAAA,EAC7C;AACA,MAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,UAAA,CAAW,WAAW,CAAA;AAElD,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,SAAA,EAAW,GAAG,CAAA;AAEhD,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,SAAA,EAAW,IAAI,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAA,CACJ,OAAA,EACA,SAAA,EACA,IAAA,EACgB;AAChB,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,MAAM,iBAAiB,IAAA,CAAK,eAAA;AAE5B,IAAA,IAAI,cAAA,CAAe,iBAAgB,EAAG;AACpC,MAAAhB,aAAAA,CAAO,IAAA;AAAA,QACL,iBAAA;AAAA,QACA;AAAA,OAEF;AACA,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,SAAS,SAAS,CAAA;AAEvC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,gBAAA,KAAqB,MAAM,UAAA;AAAA,QAC1D,cAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IACE,UAAA,CAAW,SAAS,SAAA,CAAU,aAAA,IAC9B,KAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,EAC7B;AACA,QAAA,MAAM,sBAAsB,oBAAA,CAAoB,kBAAA;AAAA,UAC9C,UAAA;AAAA,UACA,gBAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAA,CAAK,SAAS,mBAAmB,CAAA;AACjC,QAAA,IAAA,CAAK,kBAAA,CAAmB,mBAAA,EAAqB,SAAA,EAAW,IAAI,CAAA;AAE5D,QAAA,OAAO,mBAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,UAAA,CAAW,eAAA,EAAiB;AAAA,UACtD,WAAW,UAAA,CAAW;AAAA,SACvB,CAAA;AAED,QAAA,IAAA,CAAK,mBAAA,CAAoB,UAAA,EAAY,SAAA,EAAW,GAAG,CAAA;AAEnD,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,OAAA,EAAS,SAAS,CAAA;AAEpD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,IAAA,EAAyC;AAC/D,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAEhC,IAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AACzB,MAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,eAAA,EAAiB;AAAA,QAChD,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,aAAA,GAAgB,aAAA;AAAA,MACpB,OAAA,CAAQ,YAAA;AAAA,MACR,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,eAAA,EAAiB;AAAA,QAChD,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,cAAA,GAAiB,aAAA;AAAA,MACrB,OAAA,CAAQ,aAAA;AAAA,MACR,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,aAAA,EAAe,cAAA,EAAgB,IAAI,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,kBAAA,CACL,UAAA,EACA,gBAAA,EACA,SAAA,EACO;AACP,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,OAAO,gBAAA,CAAiB,KAAA;AAAA,MACxB,GAAI,SAAA,EAAW,IAAA,KAAS,UAAa,EAAE,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,MAC5D,MAAA,EAAQ,SAAA;AAAA,MACR,UAAU,gBAAA,CAAiB;AAAA,KAC7B;AAEA,IAAA,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,QAAA,CAAS,WAAW,CAAA;AACjD,IAAA,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,QAAA,CAAS,SAAS,CAAA;AAC/C,IAAA,MAAA,CAAO,MAAA,CAAO,eAAe,QAAQ,CAAA;AACrC,IAAA,MAAA,CAAO,OAAO,cAAc,CAAA;AAE5B,IAAA,OAAO;AAAA,MACL,GAAG,UAAA;AAAA,MACH,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,CACE,KAAA,EACA,OAAA,EACA,SAAA,EACM;AACN,IAAA,MAAM,WAAA,GAAc,KAAA;AAGpB,IAAA,IACE,YAAY,IAAA,KAAS,UAAA,CAAW,wBAChC,WAAA,CAAY,IAAA,KAAS,WAAW,eAAA,EAChC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IACE,YAAY,IAAA,KAAS,UAAA,CAAW,mBAChC,WAAA,CAAY,IAAA,KAAS,WAAW,iBAAA,EAChC;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,qBAAA,CAAsB,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAAA,IAClE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAA,CAAM,mBAAA,CAAoB,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAAA,IAChE;AAAA,EACF;AACF,CAAA;;;AC7RO,IAAM,2BAAN,MAA+B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpC,gBAAA;AAAA,EAMA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,kBAAkB,IAAA,EAAuB;AAE9C,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,OAAO,IAAA,CAAK,CAAC,MAAM,QAAA,EAAU;AACpD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,mBACE,EAAA,EAKM;AACN,IAAA,IAAA,CAAK,gBAAA,GAAmB,EAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,IAAA,EAAyC;AACvD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,MAAM,SAAA,EAAmC;AAC7C,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAEhC,IAAA,MAAM,YAAA,GAAkC;AAAA,MACtC,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAE7C,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,OAAA,CAAQ,aAAA,EAAe;AAC3C,MAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,UAAA,CAAW,eAAA,EAAiB;AAAA,QACtD,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAW,MAAA,EAAW,GAAG,CAAA;AAElD,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA;AAAA,QACtB,YAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,YAAY,CAAA;AAEpE,MAAA,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA;AAAA,QACtB,aAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,MAAM,QAAA,EAAS;AAAA,EACtB;AACF,CAAA;;;AC5HO,IAAM,iBAAN,MAEL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,kBAAkB,YAAA,EAA6B;AAEpD,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,MAAA;AAAA,IACF;AAGA,IAAA,IACE,EACE,YAAA,IACA,OAAO,iBAAiB,QAAA,IACxB,YAAA,CAAa,gBAAgB,MAAA,CAAA,EAE/B;AACA,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,kFAAA,EAAqF,CAAA,CAAmB,YAAY,CAAC,CAAA;AAAA,OACvH;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,MAAA,IAAI,MAAA,CAAO,wBAAA,CAAyB,YAAA,EAAc,GAAG,GAAG,GAAA,EAAK;AAC3D,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,wDAAwD,GAAG,CAAA,CAAA;AAAA,SAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,YAAA,EAAmD;AACjE,IAAA,IAAA,CAAK,aAAA,GAAgB,YAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAA,CACE,YAAA,EACA,OAAA,EACA,WAAA,EACsB;AAEtB,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAc;AAGhC,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,GAAG,IAAA,CAAK,YAAA;AAAA,MACR,GAAG;AAAA,KACL;AAGA,IAAA,MAAM,YAAY,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,UAAU,CAAA;AAG/D,IAAA,KAAA,MAAW,CAAC,MAAM,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,sBAAsB,CAAA,EAAG;AACzE,MAAA,SAAA,CAAU,kBAAA,CAAmB,MAAM,OAAO,CAAA;AAAA,IAC5C;AAEA,IAAA,KAAA,MAAW,CAAC,MAAM,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,oBAAoB,CAAA,EAAG;AACvE,MAAA,SAAA,CAAU,gBAAA,CAAiB,MAAM,OAAO,CAAA;AAAA,IAC1C;AAGA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,SAAA,CAAU,aAAA,CAAc,GAAG,IAAA,CAAK,mBAAmB,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,SAAA,CAAU,SAAA,CAAU,GAAG,IAAA,CAAK,eAAe,CAAA;AAAA,IAC7C;AAGA,IAAA,WAAA,CAAY,SAAA,EAAW,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,kBAAkB,CAAA;AAEhE,IAAA,OAAO,SAAA;AAAA,EACT;AACF,CAAA;;;ACnGO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA,EACpB,IAAA;AAAA,EACA,QAAA;AAAA,EAET,eAAA;AAAA,EAEA,YAAY,OAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,SAAA;AACpB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA;AACxB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA,EAEA,OAAO,kBAAkB,SAAA,EAA0B;AACjD,IAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,SAAsB,CAAA,EAAG;AAChD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,OAAO,oBAAA,CACL,SAAA,EACA,EAAA,EACM;AACN,IAAA,kBAAA,CAAkB,kBAAkB,SAAS,CAAA;AAE7C,IAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,gDAAgD,SAAS,CAAA;AAAA,OAC3D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,0BAA0B,QAAA,EAAyB;AACxD,IAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,MAAA,MAAM,IAAI,SAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA;AAAA,EACxC;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAAA,EACvC;AAAA,EAEA,mBAAA,CAAoB,SAAgB,SAAA,EAAyB;AAC3D,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,SAAS,SAAS,CAAA;AAAA,EAChE;AAAA,EAEA,qBAAA,CACE,OAAA,EACA,SAAA,EACA,IAAA,EACM;AACN,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAoB,OAAA,EAAS,WAAW,IAAI,CAAA;AAAA,EACxE;AAAA,EAEA,mBAAA,CACE,OAAA,EACA,SAAA,EACA,KAAA,EACM;AACN,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,OAAA,EAAS,WAAW,KAAK,CAAA;AAAA,EACvE;AAAA,EAEA,oBAAA,CAAqB,SAAgB,SAAA,EAAyB;AAC5D,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,iBAAA,EAAmB,SAAS,SAAS,CAAA;AAAA,EACjE;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,eAAA,CAAgB,SAAgB,SAAA,EAAyB;AACvD,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA;AACvB,IAAA,IAAA,CAAK,KAAK,IAAA,CAAK,YAAA,CAAa,UAAU,EAAE,OAAA,EAAS,WAAW,CAAA;AAAA,EAC9D;AAAA,EAEA,kBAAA,CACE,KAAA,EACA,SAAA,EACA,IAAA,GAA0B,EAAC,EACrB;AACN,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU;AAAA,MACpC,KAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,EACzB;AAAA,EAEA,cAAA,CAAe,OAAA,EAAiB,SAAA,EAAmB,KAAA,EAAuB;AACxE,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,YAAA,CAAa,IAAA,EAAM,EAAE,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,EACzB;AAAA,EAEA,gBAAA,CAAiB,SAAgB,SAAA,EAAyB;AACxD,IAAA,IAAA,CAAK,KAAK,IAAA,CAAK,YAAA,CAAa,QAAQ,EAAE,OAAA,EAAS,WAAW,CAAA;AAC1D,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,EACzB;AAAA,EAEA,yBAAA,CACE,OAAA,EACA,SAAA,EACA,KAAA,EACM;AACN,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS,KAAM,aAAa,KAAA,EAAO;AAC/C,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,YAAA,CAAa,IAAA,EAAM,EAAE,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAAA,IACjE,CAAA,MAAO;AAGL,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,SAAA,EAAW,KAAoB,CAAA;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,kBAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA;AAAA,EAChD;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AAAA,EAC9C;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,MAAMiB,EAAAA,GAAI,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS;AAE7B,IAAA,OAAOA,EAAAA,KAAM,YAAA,CAAa,IAAA,IAAQA,EAAAA,KAAM,YAAA,CAAa,QAAA;AAAA,EACvD;AAAA,EAEA,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS,KAAM,YAAA,CAAa,QAAA;AAAA,EAC/C;AAAA,EAEA,eAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS,KAAM,YAAA,CAAa,aAAA;AAAA,EAC/C;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS,KAAM,YAAA,CAAa,KAAA;AAAA,EAC/C;AAAA,EAEA,iBAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,gBAAA,CACE,WACA,EAAA,EACa;AACb,IAAA,OAAO,KAAK,QAAA,CAAS,EAAA;AAAA,MACnB,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,UAAU,QAAA,EAAoC;AAC5C,IAAA,OAAO,KAAK,QAAA,CAAS,EAAA;AAAA,MACnB,MAAA,CAAO,kBAAA;AAAA,MACP,CAAC,SAAgB,SAAA,KAAsB;AACrC,QAAA,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,WAAW,CAAA;AAAA,MACvD;AAAA,KACF;AAAA,EACF;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,SAAS,QAAA,EAAS;AAAA,EACzB;AAAA,EAEA,UAAU,MAAA,EAID;AACP,IAAA,IAAA,CAAK,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,EAChC;AAAA,EAEA,0BAA0B,SAAA,EAAoC;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAU,EAAG;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,eAAA,EAAkB,SAAS,CAAA;AAAA,EACxD;AAAA,EAEA,gBAAA,GAAyB;AACvB,IAAA,MAAM,MAAM,IAAA,CAAK,IAAA;AAEjB,IAAA,GAAA,CAAI,EAAA,CAAG,YAAA,CAAa,QAAA,EAAU,YAAA,CAAa,SAAS,MAAM;AACxD,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACvB,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,EAAA,CAAG,YAAA,CAAa,KAAA,EAAO,YAAA,CAAa,MAAM,MAAM;AAClD,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,GAAG,YAAA,CAAa,KAAA,EAAO,YAAA,CAAa,QAAA,EAAU,CAAC,MAAA,KAAW;AAC5D,MAAA,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAAA,IAC3D,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,GAAG,YAAA,CAAa,aAAA,EAAe,YAAA,CAAa,QAAA,EAAU,CAAC,MAAA,KAAW;AACpE,MAAA,IAAA,CAAK,sBAAsB,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,SAAA,EAAW,OAAO,IAAI,CAAA;AAAA,IACxE,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,GAAG,YAAA,CAAa,aAAA,EAAe,YAAA,CAAa,MAAA,EAAQ,CAAC,MAAA,KAAW;AAClE,MAAA,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAAA,IAC5D,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,GAAG,YAAA,CAAa,QAAA,EAAU,YAAA,CAAa,IAAA,EAAM,CAAC,MAAA,KAAW;AAC3D,MAAA,IAAA,CAAK,mBAAA;AAAA,QACH,MAAA,CAAO,OAAA;AAAA,QACP,MAAA,CAAO,SAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AAAA,IACF,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,GAAG,YAAA,CAAa,KAAA,EAAO,YAAA,CAAa,IAAA,EAAM,CAAC,MAAA,KAAW;AACxD,MAAA,IAAA,CAAK,mBAAA;AAAA,QACH,MAAA,CAAO,OAAA;AAAA,QACP,MAAA,CAAO,SAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AAAA,IACF,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,GAAG,YAAA,CAAa,aAAA,EAAe,YAAA,CAAa,IAAA,EAAM,CAAC,MAAA,KAAW;AAChE,MAAA,IAAA,CAAK,mBAAA;AAAA,QACH,MAAA,CAAO,OAAA;AAAA,QACP,MAAA,CAAO,SAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF,CAAA;;;ACzPO,IAAM,+BAA+B,IAAI,WAAA;AAAA,EAC9C,UAAA,CAAW;AACb,CAAA;;;ACFA,IAAM,mCAAmB,IAAI,GAAA,CAAY,CAAC,KAAA,EAAO,YAAA,EAAc,YAAY,CAAC,CAAA;AAE5E,SAAS,aAAa,KAAA,EAAyC;AAC7D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,gBAAA,CAAiB,IAAI,KAAK,CAAA;AAChE;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,EAClB;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AAGA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEO,SAAS,eAAe,MAAA,EAAyC;AACtE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,IAAA,MAAM,IAAI,UAAU,iCAAiC,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA;AAGZ,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,EAAY;AACzC,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,OAAO,GAAA,CAAI,KAAA,KAAU,UAAa,CAAC,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AACzE,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,sBAAA,EAAyB,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC,CAAA,+CAAA;AAAA,KACjD;AAAA,EACF;AAGA,EAAA,IACE,UAAA,IAAc,OACd,GAAA,CAAI,QAAA,KAAa,UACjB,OAAO,GAAA,CAAI,aAAa,UAAA,EACxB;AACA,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,wCAAA,EAA2C,OAAO,GAAA,CAAI,QAAQ,CAAA;AAAA,KAChE;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;AC1DO,IAAM,sBAAN,MAEL;AAAA,EACiB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YAAY,aAAA,EAA4C;AACtD,IAAA,IAAA,CAAK,SAAS,aAAA,CAAc,MAAA;AAC5B,IAAA,IAAA,CAAK,UAAU,aAAA,CAAc,OAAA;AAC7B,IAAA,IAAA,CAAK,SAAS,aAAA,CAAc,MAAA;AAC5B,IAAA,IAAA,CAAK,eAAe,aAAA,CAAc,YAAA;AAClC,IAAA,IAAA,CAAK,QAAQ,aAAA,CAAc,KAAA;AAC3B,IAAA,IAAA,CAAK,SAAS,aAAA,CAAc,MAAA;AAC5B,IAAA,IAAA,CAAK,iBAAiB,aAAA,CAAc,cAAA;AACpC,IAAA,IAAA,CAAK,aAAa,aAAA,CAAc,UAAA;AAChC,IAAA,IAAA,CAAK,UAAU,aAAA,CAAc,OAAA;AAC7B,IAAA,IAAA,CAAK,aAAa,aAAA,CAAc,UAAA;AAChC,IAAA,IAAA,CAAK,YAAY,aAAA,CAAc,SAAA;AAC/B,IAAA,IAAA,CAAK,QAAQ,aAAA,CAAc,KAAA;AAC3B,IAAA,IAAA,CAAK,WAAW,aAAA,CAAc,QAAA;AAAA,EAChC;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AACvC,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AACrC,IAAA,IAAA,CAAK,SAAS,SAAA,CAAU;AAAA,MACtB,YAAA,EAAc,KAAK,MAAA,CAAO,YAAA;AAAA,MAC1B,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,MAC3B,aAAA,EAAe,KAAK,MAAA,CAAO;AAAA,KAC5B,CAAA;AACD,IAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,sBAAA,GAA+B;AAC7B,IAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAEzC,IAAA,MAAM,kBAAA,GAA+D;AAAA,MACnE,eAAe,CAA+B,cAAA,KAC5C,IAAA,CAAK,YAAA,CAAa,IAAI,cAAc;AAAA,KACxC;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe,gBAAgB,kBAAkB,CAAA;AAAA,EACxD;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,MAAM,UAAA,GAA+C;AAAA,MACnD,gBAAA,EAAkB,CAAC,IAAA,EAAM,OAAA,KAAY;AACnC,QAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAA,EAAM,OAAO,CAAA;AAAA,MAC5C,CAAA;AAAA,MACA,kBAAA,EAAoB,CAAC,IAAA,EAAM,OAAA,KAAY;AACrC,QAAA,IAAA,CAAK,MAAA,CAAO,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAAA,MAC9C,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,KAC9B,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,MAC/C,QAAA,EAAU,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI;AAAA,MAC/B,cAAA,EAAgB,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAC/B,KAAK,KAAA,CAAM,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,iBAAiB,CAAA;AAAA,MAC7D,eAAe,CAAC,IAAA,KAAS,IAAA,CAAK,YAAA,CAAa,IAAI,IAAI,CAAA;AAAA,MACnD,YAAA,EAAc,CAAC,IAAA,EAAM,MAAA,KAAW,KAAK,MAAA,CAAO,YAAA,CAAa,MAAM,MAAM;AAAA,KACvE;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAgB,UAAU,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,CAAO,qBAAA,CAAsB,IAAA,CAAK,cAAc,CAAA;AAAA,EACvD;AAAA,EAEA,kBAAA,GAA2B;AACzB,IAAA,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAErC,IAAA,MAAM,cAAA,GAAuD;AAAA,MAC3D,eAAe,CAA+B,cAAA,KAC5C,IAAA,CAAK,YAAA,CAAa,IAAI,cAAc;AAAA,KACxC;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,gBAAgB,cAAc,CAAA;AAAA,EAChD;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAElC,IAAA,MAAM,WAAA,GAAiD;AAAA,MACrD,gBAAA,EAAkB,CAAC,SAAA,EAAW,EAAA,KAC5B,KAAK,QAAA,CAAS,gBAAA,CAAiB,WAAW,EAAE,CAAA;AAAA,MAC9C,WAAA,EAAa,MAAM,IAAA,CAAK,QAAA,CAAS,kBAAA,EAAmB;AAAA,MACpD,eAAe,CAA+B,cAAA,KAC5C,IAAA,CAAK,YAAA,CAAa,IAAI,cAAc;AAAA,KACxC;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,gBAAgB,WAAW,CAAA;AAAA,EAC1C;AAAA,EAEA,kBAAA,GAA2B;AACzB,IAAA,MAAM,cAAA,GAAyC;AAAA,MAC7C,UAAA,EAAY,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI;AAAA,MACnC,UAAU,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,MAC7C,QAAA,EAAU,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI;AAAA,MAC/B,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAA,CAAK,KAAA,CAAM,IAAI,KAAK,CAAA;AAAA,MACtB,CAAA;AAAA,MACA,sBAAA,EAAwB,CAAC,SAAA,EAAW,WAAA,KAAgB;AAClD,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,KAAK,MAAA,CAAO,YAAA;AAAA,UACnC,SAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,8BAAA,CAA+B,IAAA,EAAM,MAAM,CAAA;AAAA,MAChE,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,KAC9B,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,MAC/C,SAAA,EAAW,CAAC,KAAA,EAAO,MAAA,KACjB,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,CAAA;AAAA,MACzD,cAAA,EAAgB,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAC/B,KAAK,KAAA,CAAM,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,iBAAiB,CAAA;AAAA,MAC7D,eAAe,CAAC,IAAA,KACd,IAAA,CAAK,YAAA,CAAa,IAAI,IAA0B,CAAA;AAAA,MAClD,eAAA,EAAiB,CAAC,OAAA,EAAS,SAAA,KAAc;AACvC,QAAA,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS,SAAS,CAAA;AAAA,MAClD,CAAA;AAAA,MACA,kBAAkB,MAAM;AACtB,QAAA,IAAA,CAAK,QAAA,CAAS,gBAAA;AAAA,UACZ,IAAA,CAAK,SAAS,iBAAA,EAAkB;AAAA;AAAA,UAChC,IAAA,CAAK,MAAM,GAAA;AAAI,SACjB;AAAA,MACF,CAAA;AAAA,MACA,kBAAA,EAAoB,CAAC,KAAA,EAAO,SAAA,EAAW,IAAA,KAAS;AAC9C,QAAA,IAAA,CAAK,QAAA,CAAS,kBAAA,CAAmB,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,MACzD,CAAA;AAAA,MACA,qBAAA,EAAuB,CAAC,OAAA,EAAS,SAAA,EAAW,KAAA,KAAU;AACpD,QAAA,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,OAAA,EAAS,SAAA,EAAW,KAAK,CAAA;AAAA,MACxD,CAAA;AAAA,MACA,mBAAA,EAAqB,CAAC,OAAA,EAAS,SAAA,EAAW,KAAA,KAAU;AAClD,QAAA,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,OAAA,EAAS,SAAA,EAAW,KAAK,CAAA;AAAA,MACxD,CAAA;AAAA,MACA,mBAAA,EAAqB,CAAC,OAAA,EAAS,SAAA,EAAW,KAAA,KAAU;AAClD,QAAA,IAAA,CAAK,QAAA,CAAS,yBAAA,CAA0B,OAAA,EAAS,SAAA,EAAW,KAAK,CAAA;AAAA,MACnE;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,gBAAgB,cAAc,CAAA;AAE9C,IAAA,MAAM,cAAA,GAAyC;AAAA,MAC7C,qBAAA,EAAuB,MAAM,IAAA,CAAK,cAAA,CAAe,YAAA,EAAa;AAAA,MAC9D,sBAAA,EAAwB,MAAM,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa;AAAA,MAC3D,QAAA,EAAU,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AAAA,MACrC,eAAA,EAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,eAAA,EAAgB;AAAA,MACrD,kBAAA,EAAoB,CAAC,IAAA,KAAS;AAC5B,QAAA,IAAA,CAAK,cAAA,CAAe,mBAAmB,IAAI,CAAA;AAAA,MAC7C;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,0BAA0B,cAAc,CAAA;AAAA,EAC1D;AAAA,EAEA,iBAAA,GAA0B;AACxB,IAAA,MAAM,aAAA,GAA6C;AAAA,MACjD,UAAA,EAAY,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI;AAAA,MACnC,iBAAA,EAAmB,CAAC,IAAA,EAAM,OAAA,KACxB,KAAK,KAAA,CAAM,iBAAA,CAAkB,MAAM,OAAO,CAAA;AAAA,MAC5C,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,IAAA,CAAK,KAAA,CAAM,IAAI,KAAK,CAAA;AAAA,MACtB,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,UAAU,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,CAAA;AAAA,MACnE,eAAe,MAAM;AACnB,QAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAAA,MAC9B,CAAA;AAAA,MACA,mBAAA,EAAqB,CAAC,OAAA,EAAS,SAAA,EAAW,KAAA,KAAU;AAClD,QAAA,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,OAAA,EAAS,SAAA,EAAW,KAAK,CAAA;AAAA,MACxD;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,aAAa,CAAA;AAAA,EAC9C;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,MAAM,eAAA,CAAgB;AAAA,MACzB,gBAAA,EAAkB,MAAM,IAAA,CAAK,MAAA,CAAO,WAAU,CAAE,aAAA;AAAA,MAChD,SAAA,EAAW,CAAC,IAAA,EAAM,MAAA,KAChB,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,CAAA;AAAA,MACxD,cAAc,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,aAAa,IAAI;AAAA,KACtD,CAAA;AAAA,EACH;AAAA,EAEA,kBAAA,GAA2B;AACzB,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAgB,MAAM;AAC/B,MAAA,MAAM,CAAC,sBAAA,EAAwB,oBAAoB,CAAA,GACjD,IAAA,CAAK,eAAe,YAAA,EAAa;AAEnC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY;AAAA,QAChC,SAAS,EAAE,GAAG,IAAA,CAAK,OAAA,CAAQ,KAAI,EAAE;AAAA,QACjC,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,MAAA,EAAO;AAAA,QACvC,sBAAA;AAAA,QACA,oBAAA;AAAA,QACA,mBAAA,EAAqB,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa;AAAA,QAClD,eAAA,EAAiB,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO;AAAA,QACrC,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU;AAAA,QACnC,kBAAA,EAAoB,IAAA,CAAK,MAAA,CAAO,qBAAA;AAAsB,OACxD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,WAAW,cAAA,CAAe,MAAM,IAAA,CAAK,QAAA,CAAS,oBAAoB,CAAA;AAEvE,IAAA,IAAA,CAAK,SAAA,CAAU,kBAAA;AAAA,MAAmB,CAAC,SAAS,SAAA,EAAW,IAAA,KACrD,KAAK,UAAA,CAAW,eAAA,CAAgB,OAAA,EAAS,SAAA,EAAW,IAAI;AAAA,KAC1D;AAAA,EACF;AACF,CAAA;;;AC3NO,SAAS,WACd,OAAA,EACM;AACN,EAAA,OAAA,CAAQ,UAAA,EAAW;AACnB,EAAA,OAAA,CAAQ,sBAAA,EAAuB;AAC/B,EAAA,OAAA,CAAQ,cAAA,EAAe;AACvB,EAAA,OAAA,CAAQ,kBAAA,EAAmB;AAC3B,EAAA,OAAA,CAAQ,eAAA,EAAgB;AACxB,EAAA,OAAA,CAAQ,kBAAA,EAAmB;AAC3B,EAAA,OAAA,CAAQ,iBAAA,EAAkB;AAC1B,EAAA,OAAA,CAAQ,aAAA,EAAc;AACtB,EAAA,OAAA,CAAQ,kBAAA,EAAmB;AAC3B,EAAA,OAAA,CAAQ,cAAA,EAAe;AACzB;;;ACkDO,IAAM,MAAA,GAAN,MAAM,OAAA,CAEX;AAAA;AAAA;AAAA;AAAA,EAQS,QAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EAEA,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWT,WAAA,CACE,SAAgC,EAAC,EACjC,UAA4B,EAAC,EAC7B,YAAA,GAA6B,EAAC,EAC9B;AAEA,IAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAA,EAAG;AACpD,MAAAjB,aAAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAA;AAC/B,MAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IACjB;AAOA,IAAA,gBAAA,CAAiB,eAAA,CAAgB,SAAS,aAAa,CAAA;AAGvD,IAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,KAAA;AAGzC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,qBAAA,CAAsB,0BAAA;AAAA,QACpB,YAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAIA,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACpC,MAAA,eAAA,CAAgB,qBAAqB,MAAM,CAAA;AAC3C,MAAA,eAAA,CAAgB,eAAe,MAAM,CAAA;AAAA,IACvC;AAMA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,OAAO,CAAA;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,YAAA,CAAa,OAAA,CAAQ,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,qBAAA,CAAoC,YAAY,CAAA;AACzE,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,EAAe;AACjC,IAAA,IAAA,CAAK,UAAU,IAAI,eAAA;AAAA,MACjB,MAAA;AAAA,MACA,UAAA;AAAA,MACA,oBAAA,CAAqB,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK;AAAA,KAC1C;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,uBAAA,EAAsC;AACjE,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,mBAAA,EAAkC;AACzD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,EAA+B;AACnD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,mBAAA,EAAoB;AAC3C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,wBAAA,EAAyB;AAC/C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,EAA6B;AAC/C,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AAMnB,IAAA,MAAM,YAAY,eAAA,EAAgB;AAClC,IAAA,MAAM,OAAA,GAAU,IAAI,CAAA,CAA6B;AAAA,MAC/C,eAAA,EAAiB,CAAC,SAAA,EAAW,KAAA,KAAU;AACrC,QAAAA,cAAO,KAAA,CAAM,QAAA,EAAU,CAAA,sBAAA,EAAyB,SAAS,KAAK,KAAK,CAAA;AAAA,MACrE,CAAA;AAAA,MACA,cAAA,EAAgB,CAAC,SAAA,EAAW,KAAA,KAAU;AACpC,QAAAA,aAAAA,CAAO,IAAA;AAAA,UACL,yBAAA;AAAA,UACA,CAAA,OAAA,EAAU,SAAS,CAAA,MAAA,EAAS,KAAK,CAAA,sCAAA;AAAA,SACnC;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,YAAY,IAAI,iBAAA,CAAkB,EAAE,SAAA,EAAW,SAAS,CAAA;AAM7D,IAAA,UAAA;AAAA,MACE,IAAI,mBAAA,CAAkC;AAAA,QACpC,MAAA,EAAQ,IAAA;AAAA,QACR,SAAS,IAAA,CAAK,QAAA;AAAA,QACd,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,cAAc,IAAA,CAAK,aAAA;AAAA,QACnB,OAAO,IAAA,CAAK,MAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,gBAAgB,IAAA,CAAK,eAAA;AAAA,QACrB,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,SAAS,IAAA,CAAK,QAAA;AAAA,QACd,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,OAAO,IAAA,CAAK,MAAA;AAAA,QACZ,UAAU,IAAA,CAAK;AAAA,OAChB;AAAA,KACH;AAWA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAG7C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAG7C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACvD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AACnD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AAC/D,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAGvD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAG3C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAGrC,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACvD,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAC3D,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AAC7D,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AACjE,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAGjD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAGzC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAEjD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACrD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACrD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACvD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAGzD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAGvD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACzD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAGrD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAGzC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,CACE,QACA,OAAA,EACM;AACN,IAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA;AAC3D,IAAA,MAAM,aAAa,OAAA,EAAS,MAAA;AAE5B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAErB,MAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,QAAA,eAAA,CAAgB,qBAAqB,UAAU,CAAA;AAAA,MACjD;AAGA,MAAA,eAAA,CAAgB,qBAAqB,UAAU,CAAA;AAG/C,MAAA,eAAA,CAAgB,cAAA;AAAA,QACd,UAAA;AAAA,QACA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,QACrB,IAAA,CAAK,QAAQ,gBAAA,EAAiB;AAAA,QAC9B;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,UAAU,CAAA;AAE7C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,IAAA,EAAoB;AAE9B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,wBAAwB,IAAI,CAAA;AAAA,IAC9C;AAGA,IAAA,MAAM,SAAA,GAAY,KAAK,OAAA,CAAQ,mBAAA;AAAA,MAC7B,IAAA;AAAA,MACA,IAAA,CAAK,MAAA,CAAO,GAAA,EAAI,EAAG,IAAA;AAAA,MACnB,IAAA,CAAK,UAAU,eAAA;AAAgB,KACjC;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAI,CAAA;AAEhD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAAA,aAAAA,CAAO,IAAA;AAAA,QACL,oBAAA;AAAA,QACA,UAAU,IAAI,CAAA,6BAAA;AAAA,OAChB;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,eAAA,EAAgB;AAGpD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,YAAY,CAAA;AAE9D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AAGzB,IAAA,IAAA,CAAK,gBAAgB,QAAA,EAAS;AAG9B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,MAAS,CAAA;AAEzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,IAAA,EAA+C;AACtD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,CAAA,CAAkB,MAAM,UAAU,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,SAAS,IAAA,EAAuB;AAC9B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,CAAA,CAAkB,MAAM,UAAU,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,WAAA,CAAY,MAAc,OAAA,EAAgD;AAExE,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,4BAAA,CAA6B,MAAM,OAAO,CAAA;AAAA,IAC5D;AAKA,IAAA,MAAM;AAAA,MACJ,SAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,GAAI,OAAA;AAGJ,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,gCAAA;AAAA,QACd,SAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,eAAA,EAAgB,EAAG;AACpC,MAAAA,aAAAA,CAAO,KAAA;AAAA,QACL,oBAAA;AAAA,QACA,mBAAmB,IAAI,CAAA,sEAAA;AAAA,OACzB;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,IAAA,EAAM,SAAS,CAAA;AAAA,IAClD;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,kBAAkB,IAAA,EAAM;AAAA,MACnC,SAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAID,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,IAAA,CAAK,eAAA,CAAgB,iBAAiB,IAAI,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,WAAW,CAAA;AAAA,MACzC;AAAA,IACF;AAIA,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,QAAA,IAAA,CAAK,eAAA,CAAgB,mBAAmB,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,kBAAA,CAAmB,MAAM,aAAa,CAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,CACE,IAAA,EACA,MAAA,EACA,cAAA,EACA,iBAAA,EACS;AACT,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,yBAAA;AAAA,QACd,IAAA;AAAA,QACA,MAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAAA,aAAAA,CAAO,IAAA;AAAA,QACL,aAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAK,OAAA,CAAQ,aAAA;AAAA,MAClB,IAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,OAAe,MAAA,EAAyB;AAChD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,sBAAsB,KAAK,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,IAAA,CAAK,QAAQ,SAAA,CAAU,KAAA,EAAO,QAAQ,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AAAA,EAClE;AAAA,EAEA,UACE,IAAA,EAC0B;AAC1B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,sBAAsB,IAAI,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,KAAK,OAAA,CAAQ,SAAA,CAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AAAA,EAChE;AAAA,EAEA,YAAY,QAAA,EAAwB;AAClC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,wBAAwB,QAAQ,CAAA;AAAA,IAClD;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,WAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,EAAY;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,CACE,IAAA,EACA,MAAA,EACA,IAAA,EACA,MACA,OAAA,EACc;AACd,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,cAAA,CAAe,qBAAA,CAAsB,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA,CAAiB,MAAM,MAAA,EAAQ,IAAA,EAAM,MAAM,OAAO,CAAA;AAAA,EACvE;AAAA,EAEA,QAAA,GAEc;AACZ,IAAA,OAAO,IAAA,CAAK,OAAO,GAAA,EAAW;AAAA,EAChC;AAAA,EAEA,gBAAA,GAAsC;AACpC,IAAA,OAAO,IAAA,CAAK,OAAO,WAAA,EAAY;AAAA,EACjC;AAAA,EAEA,cAAA,CACE,MAAA,EACA,MAAA,EACA,iBAAA,GAAoB,IAAA,EACX;AACT,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,cAAA,CAAe,0BAAA;AAAA,QACb,MAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,MAAA,EAAQ,QAAQ,iBAAiB,CAAA;AAAA,EACrE;AAAA,EAEA,YAAA,CACE,WACA,WAAA,EACgB;AAChB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,wBAAA;AAAA,QACd,SAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAgB,SAAA,EAAW,WAAW,CAAA;AAAA,EAC5D;AAAA,EAEA,UAAA,CACE,WACA,WAAA,EAC4B;AAC5B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,wBAAA;AAAA,QACd,SAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,KAAW,IAAA,CAAK,YAAA,CAAa,WAAW,WAAW,CAAA;AAEjE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,IAAA,EAAM,MAAM,CAAA;AAAA,EACrD;AAAA,EAEA,oBAAA,CAAqB,IAAA,EAAc,MAAA,GAAiB,EAAC,EAAsB;AACzE,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,wBAAA;AAAA,QACd,IAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA;AAE9C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACV,SAAA,CAAU,IAAA;AAAA,MACV,SAAA,CAAU,MAAA;AAAA,MACV,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,MAC/C;AAAA,QACE,QAAQ,SAAA,CAAU,IAAA;AAAA,QAClB,SAAS;AAAC;AACZ,KACF;AAAA,EACF;AAAA,EAEA,iBACE,QAAA,EACgD;AAChD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,eAAA,CAAgB,6BAA6B,QAAQ,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,UAAU,QAAA,EAAS;AAAA,EACjC;AAAA,EAEA,MAAM,MAAM,SAAA,EAAmC;AAE7C,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,wBAAA,CAAyB,iBAAA,CAAkB,CAAC,SAAS,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,EAAS,EAAG;AAC9B,MAAA,MAAM,4BAAA;AAAA,IACR;AAEA,IAAA,IAAA,CAAK,UAAU,SAAA,EAAU;AAEzB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ,EAAG;AAC5B,QAAA,IAAA,CAAK,WAAW,IAAA,EAAK;AACrB,QAAA,IAAA,CAAK,UAAU,QAAA,EAAS;AAAA,MAC1B;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,SAAA,CAAU,yBAAA,CAA0B,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAE1D,IAAA,IAAI,CAAC,KAAK,SAAA,CAAU,OAAA,MAAa,CAAC,IAAA,CAAK,SAAA,CAAU,eAAA,EAAgB,EAAG;AAClE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,WAAW,IAAA,EAAK;AACrB,IAAA,IAAA,CAAK,UAAU,QAAA,EAAS;AAExB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,UAAA,EAAW,EAAG;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,yBAAA,CAA0B,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAE1D,IAAA,IAAI,KAAK,SAAA,CAAU,OAAA,MAAa,IAAA,CAAK,SAAA,CAAU,iBAAgB,EAAG;AAChE,MAAA,IAAA,CAAK,WAAW,IAAA,EAAK;AACrB,MAAA,IAAA,CAAK,UAAU,QAAA,EAAS;AAAA,IAC1B;AAEA,IAAA,IAAA,CAAK,UAAU,WAAA,EAAY;AAC3B,IAAA,IAAA,CAAK,UAAU,QAAA,EAAS;AAExB,IAAA,IAAA,CAAK,SAAS,UAAA,EAAW;AACzB,IAAA,IAAA,CAAK,YAAY,QAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,IAAA,IAAA,CAAK,gBAAgB,QAAA,EAAS;AAC9B,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAEzB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAA,CACE,MACA,oBAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,CAAA,CAAkB,MAAM,oBAAoB,CAAA;AAC5C,MAAA,uBAAA,CAAwB,eAAA;AAAA,QACtB,oBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,gBAAA;AAAA,MACnB,IAAA;AAAA,MACA,oBAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,gBAAA,CACE,MACA,kBAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,CAAA,CAAkB,MAAM,kBAAkB,CAAA;AAC1C,MAAA,uBAAA,CAAwB,eAAA;AAAA,QACtB,kBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,cAAA;AAAA,MACnB,IAAA;AAAA,MACA,kBAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,oBAAoB,IAAA,EAAoB;AACtC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,CAAA,CAAkB,MAAM,qBAAqB,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,iBAAiB,IAAI,CAAA;AAAA,EAC5C;AAAA,EAEA,sBAAsB,IAAA,EAAoB;AACxC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,CAAA,CAAkB,MAAM,uBAAuB,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,mBAAmB,IAAI,CAAA;AAAA,EAC9C;AAAA,EAEA,aAAA,CAAc,MAAc,MAAA,EAA0B;AACpD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,CAAA,CAAkB,MAAM,eAAe,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACxB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,cAAA,KAAmB,IAAA,CAAK,YAAA;AAAA,MAC1D,IAAA;AAAA,MACA,UAAU;AAAC,KACb;AACA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,cAAc,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,KAAK,QAAA,EAAS;AAEhC,IAAA,MAAM,EAAE,YAAA,EAAc,UAAA,EAAW,GAAI,iBAAA,CAAkB,SAAS,SAAS,CAAA;AAEzE,IAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,MAAA,IACE,CAAC,KAAK,eAAA,CAAgB,wBAAA;AAAA,QACpB,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF,EACA;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,WAAW,UAAA,EAAY;AAChC,MAAA,IACE,CAAC,KAAK,eAAA,CAAgB,sBAAA;AAAA,QACpB,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF,EACA;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,aAAaG,QAAAA,EAAqD;AAChE,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAErB,MAAA,gBAAA,CAAiB,sBAAoCA,QAAO,CAAA;AAG5D,MAAA,gBAAA,CAAiB,mBAAA;AAAA,QACf,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,QACpBA,QAAAA,CAAQ,MAAA;AAAA,QACR,KAAK,OAAA,CAAQ;AAAA,OACf;AAGA,MAAA,gBAAA,CAAiB,0BAAA;AAAA,QACfA,QAAAA;AAAA,QACA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,KAAK,QAAQ;AAAA,OACtC;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAGA,QAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAMA,iBACK,WAAA,EACU;AACb,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAErB,MAAA,mBAAA,CAAoB,0BAAwC,WAAW,CAAA;AAGvE,MAAA,mBAAA,CAAoB,oBAAA;AAAA,QAClB,WAAA;AAAA,QACA,IAAA,CAAK,YAAY,YAAA;AAAa,OAChC;AAGA,MAAA,mBAAA,CAAoB,uBAAA;AAAA,QAClB,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,QACvB,WAAA,CAAY,MAAA;AAAA,QACZ,KAAK,OAAA,CAAQ;AAAA,OACf;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,GAAG,WAAW,CAAA;AAG9D,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,KAAA,MAAW,EAAE,UAAA,EAAY,OAAA,EAAQ,IAAK,WAAA,EAAa;AACjD,QAAA,mBAAA,CAAoB,kBAAA;AAAA,UAClB,UAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,WAAW,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,CACE,gBACA,UAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,qBAAA,CAAsB,0BAA0B,cAAc,CAAA;AAAA,IAChE;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,cAAA,EAAgB,UAAU,CAAA;AAEjD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,gBAAgB,IAAA,EAA0B;AACxC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,qBAAA,CAAsB,0BAAA,CAA2B,MAAM,iBAAiB,CAAA;AACxE,MAAA,qBAAA,CAAsB,uBAAA;AAAA,QACpB,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,QACzB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA;AAAA,QAClB,iBAAA;AAAA,QACA,KAAK,OAAA,CAAQ;AAAA,OACf;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,YAAY,IAAI,CAAA;AAEnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAA4C,GAAA,EAAyB;AACnE,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,qBAAA,CAAsB,YAAA,CAAa,KAAK,eAAe,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAExC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,qBAAA,CAAsB,wBAAA,CAAyB,OAAO,GAAa,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,eAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,cAAc,MAAA,EAAO;AAAA,EACnC;AAAA,EAEA,iBAAiB,cAAA,EAA0C;AACzD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,qBAAA,CAAsB,YAAA,CAAa,gBAAgB,kBAAkB,CAAA;AAAA,IACvE;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,OAAO,cAAc,CAAA;AAExC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAc,cAAA,EAA6C;AACzD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,qBAAA,CAAsB,YAAA,CAAa,gBAAgB,eAAe,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAAA,EAC9C;AAAA,EAEA,iBAAA,GAA0B;AACxB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAEzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,CACE,WACA,EAAA,EACa;AACb,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,iBAAA,CAAkB,oBAAA,CAAqB,WAAW,EAAE,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,SAAA,EAAW,EAAE,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,QAAA,EAAoC;AAC5C,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,iBAAA,CAAkB,0BAA0B,QAAQ,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,QAAQ,CAAA;AAAA,EAC1C;AAAA,EAaA,QAAA,CACE,SAAA,EACA,WAAA,EACA,OAAA,EACgB;AAEhB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,mBAAA,CAAoB,qBAAqB,SAAS,CAAA;AAAA,IACpD;AAGA,IAAA,MAAM,IAAA,GAAO,WAAW,EAAC;AAEzB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,mBAAA,CAAoB,yBAAA,CAA0B,MAAM,UAAU,CAAA;AAAA,IAChE;AAGA,IAAA,MAAM,YAAA,GAAe,KAAK,WAAA,CAAY,QAAA;AAAA,MACpC,SAAA;AAAA,MACA,eAAe,EAAC;AAAA,MAChB;AAAA,KACF;AAEA,IAAA,OAAA,CAAO,4BAA4B,YAAY,CAAA;AAE/C,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAIA,kBAAkB,OAAA,EAA6C;AAE7D,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,mBAAA,CAAoB,8BAA8B,OAAO,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,IAAA,GAAO,WAAW,EAAC;AAEzB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,mBAAA,CAAoB,yBAAA,CAA0B,MAAM,mBAAmB,CAAA;AAAA,IACzE;AAGA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,WAAA,CAAY,iBAAA,CAAkB,IAAI,CAAA;AAE5D,IAAA,OAAA,CAAO,4BAA4B,YAAY,CAAA;AAE/C,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,eAAA,CACE,OAAA,EACA,SAAA,EACA,IAAA,EACgB;AAChB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,mBAAA,CAAoB,2BAAA,CAA4B,OAAA,EAAS,SAAA,EAAW,IAAI,CAAA;AAAA,IAC1E;AAEA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,eAAA,CAAgB,OAAA,EAAS,WAAW,IAAI,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,EAAmD;AACvD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,cAAA,CAAe,kBAAkB,YAAY,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACjB,YAAA;AAAA,MACA,CAAC,QAAQ,OAAA,EAAS,IAAA,KAChB,IAAI,OAAA,CAAqB,MAAA,EAAQ,SAAS,IAAI,CAAA;AAAA,MAChD,CAAC,SAAA,EAAW,MAAA,EAAQ,kBAAA,KAAuB;AACzC,QAAA,MAAM,WAAA,GAAc,SAAA;AAEpB,QAAA,WAAA,CAAY,OAAA,CAAQ,iBAAA,CAAkB,MAAA,EAAQ,kBAAkB,CAAA;AAAA,MAClE;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAgB,kBAAA,GAAqB,CAAC,KAAA,KAAyB;AAC7D,IAAA,IACE,iBAAiB,WAAA,KAChB,KAAA,CAAM,IAAA,KAAS,UAAA,CAAW,eACzB,KAAA,CAAM,IAAA,KAAS,UAAA,CAAW,oBAAA,IAC1B,MAAM,IAAA,KAAS,UAAA,CAAW,sBAC1B,KAAA,CAAM,IAAA,KAAS,WAAW,eAAA,CAAA,EAC5B;AACA,MAAA;AAAA,IACF;AAEA,IAAAH,aAAAA,CAAO,KAAA,CAAM,iBAAA,EAAmB,6BAAA,EAA+B,KAAK,CAAA;AAAA,EACtE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,4BAA4B,OAAA,EAA+B;AAChE,IAAA,OAAA,CAAQ,KAAA,CAAM,QAAO,kBAAkB,CAAA;AAAA,EACzC;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,aAAA;AAChB,IAAA,IAAA,CAAK,iBAAA,GAAoB,aAAA;AACzB,IAAA,IAAA,CAAK,eAAA,GAAkB,aAAA;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,aAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,aAAA;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA;AACnB,IAAA,IAAA,CAAK,gBAAA,GAAmB,aAAA;AACxB,IAAA,IAAA,CAAK,kBAAA,GAAqB,aAAA;AAC1B,IAAA,IAAA,CAAK,mBAAA,GAAsB,aAAA;AAC3B,IAAA,IAAA,CAAK,qBAAA,GAAwB,aAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,aAAA;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,eAAA,GAAkB,aAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,GAAmB,aAAA;AACxB,IAAA,IAAA,CAAK,iBAAA,GAAoB,aAAA;AACzB,IAAA,IAAA,CAAK,gBAAA,GAAmB,aAAA;AACxB,IAAA,IAAA,CAAK,SAAA,GAAY,aAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,aAAA;AACb,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AACF;AAEA,SAAS,aAAA,GAAuB;AAC9B,EAAA,MAAM,IAAI,WAAA,CAAY,UAAA,CAAW,eAAe,CAAA;AAClD;AAMA,SAAS,qBACP,OAAA,EACsB;AACtB,EAAA,OAAO;AAAA,IACL,mBAAA,EAAqB,QAAQ,aAAA,KAAkB,QAAA;AAAA,IAC/C,iBAAA,EAAmB,QAAQ,eAAA,KAAoB,QAAA;AAAA,IAC/C,mBAAmB,OAAA,CAAQ,iBAAA;AAAA;AAAA,IAE3B,aAAa,OAAA,CAAQ;AAAA,GACvB;AACF;;;AC9nCO,IAAM,YAAA,GAAe,CAG1B,MAAA,GAAgC,EAAC,EACjC,UAA4B,EAAC,EAC7B,YAAA,GAA6B,EAAC,KACL;AACzB,EAAA,OAAO,IAAI,MAAA,CAAqB,MAAA,EAAQ,OAAA,EAAS,YAAY,CAAA;AAC/D;;;AC5BO,IAAM,YAAA,GAAe,CAG1B,MAAA,KAEA,MAAA,CAAO,MAAA,CAAO;AAAA,EACZ,UAAU,MAAA,CAAO,QAAA;AAAA,EACjB,UAAU,MAAA,CAAO,QAAA;AAAA,EACjB,eAAe,MAAA,CAAO,aAAA;AAAA,EACtB,eAAe,MAAA,CAAO,aAAA;AAAA,EACtB,WAAW,MAAA,CAAO;AACpB,CAAC","file":"index.js","sourcesContent":["// packages/real-router/modules/constants.ts\n\nimport type {\n EventName,\n EventToNameMap,\n EventToPluginMap,\n ErrorCodeToValueMap,\n ErrorCodeKeys,\n ErrorCodeValues,\n} from \"@real-router/types\";\n\nexport type ConstantsKeys = \"UNKNOWN_ROUTE\";\n\nexport type Constants = Record<ConstantsKeys, string>;\n\n// =============================================================================\n// Error Codes (migrated from router-error)\n// =============================================================================\n\nexport type ErrorCodes = Record<ErrorCodeKeys, ErrorCodeValues>;\n\n/**\n * Error codes for router operations.\n * Used to identify specific failure scenarios in navigation and lifecycle.\n * Frozen to prevent accidental modifications.\n */\nexport const errorCodes: ErrorCodeToValueMap = Object.freeze({\n ROUTER_NOT_STARTED: \"NOT_STARTED\", // navigate() called before start()\n NO_START_PATH_OR_STATE: \"NO_START_PATH_OR_STATE\", // start() without initial route\n ROUTER_ALREADY_STARTED: \"ALREADY_STARTED\", // start() called twice\n ROUTE_NOT_FOUND: \"ROUTE_NOT_FOUND\", // Navigation to non-existent route\n SAME_STATES: \"SAME_STATES\", // Navigate to current route without reload\n CANNOT_DEACTIVATE: \"CANNOT_DEACTIVATE\", // canDeactivate guard blocked navigation\n CANNOT_ACTIVATE: \"CANNOT_ACTIVATE\", // canActivate guard blocked navigation\n TRANSITION_ERR: \"TRANSITION_ERR\", // Generic transition failure\n TRANSITION_CANCELLED: \"CANCELLED\", // Navigation cancelled by user or new navigation\n ROUTER_DISPOSED: \"DISPOSED\", // Router has been disposed\n});\n\n/**\n * General router constants.\n * Special route names and identifiers.\n */\nexport const constants: Constants = {\n UNKNOWN_ROUTE: \"@@router/UNKNOWN_ROUTE\", // Special route for 404/not found states\n};\n\n/**\n * Plugin method names.\n * Maps to methods that plugins can implement to hook into router lifecycle.\n */\nexport const plugins: EventToPluginMap = {\n ROUTER_START: \"onStart\", // Plugin method called when router starts\n ROUTER_STOP: \"onStop\", // Plugin method called when router stops\n TRANSITION_START: \"onTransitionStart\", // Plugin method called when navigation begins\n TRANSITION_CANCEL: \"onTransitionCancel\", // Plugin method called when navigation cancelled\n TRANSITION_SUCCESS: \"onTransitionSuccess\", // Plugin method called when navigation succeeds\n TRANSITION_ERROR: \"onTransitionError\", // Plugin method called when navigation fails\n};\n\n/**\n * Event names for router event system.\n * Used with addEventListener/removeEventListener for reactive subscriptions.\n */\nexport const events: EventToNameMap = {\n ROUTER_START: \"$start\", // Emitted when router.start() succeeds\n ROUTER_STOP: \"$stop\", // Emitted when router.stop() is called\n TRANSITION_START: \"$$start\", // Emitted when navigation begins\n TRANSITION_CANCEL: \"$$cancel\", // Emitted when navigation is cancelled\n TRANSITION_SUCCESS: \"$$success\", // Emitted when navigation completes successfully\n TRANSITION_ERROR: \"$$error\", // Emitted when navigation fails\n};\n\n/**\n * Valid event names for validation.\n */\nexport const validEventNames = new Set<EventName>([\n events.ROUTER_START,\n events.TRANSITION_START,\n events.TRANSITION_SUCCESS,\n events.TRANSITION_ERROR,\n events.TRANSITION_CANCEL,\n events.ROUTER_STOP,\n]);\n\n/**\n * Default limits configuration for the router.\n * These values match the hardcoded constants from the current codebase.\n */\nexport const DEFAULT_LIMITS = {\n maxDependencies: 100,\n maxPlugins: 50,\n maxMiddleware: 50,\n maxListeners: 10_000,\n warnListeners: 1000,\n maxEventDepth: 5,\n maxLifecycleHandlers: 200,\n} as const;\n\n/**\n * Bounds for each limit - defines min and max allowed values.\n * Used for runtime validation in setLimit/withLimits.\n */\nexport const LIMIT_BOUNDS = {\n maxDependencies: { min: 0, max: 10_000 },\n maxPlugins: { min: 0, max: 1000 },\n maxMiddleware: { min: 0, max: 1000 },\n maxListeners: { min: 0, max: 100_000 },\n warnListeners: { min: 0, max: 100_000 },\n maxEventDepth: { min: 0, max: 100 },\n maxLifecycleHandlers: { min: 0, max: 10_000 },\n} as const;\n","// packages/core/src/fsm/routerFSM.ts\n\nimport { FSM } from \"@real-router/fsm\";\n\nimport type { FSMConfig } from \"@real-router/fsm\";\nimport type { NavigationOptions, State } from \"@real-router/types\";\n\n/**\n * Router FSM states.\n *\n * - IDLE: Router not started or stopped\n * - STARTING: Router is initializing\n * - READY: Router is ready for navigation\n * - TRANSITIONING: Navigation in progress\n * - DISPOSED: Router has been disposed (R2+)\n */\nexport const routerStates = {\n IDLE: \"IDLE\",\n STARTING: \"STARTING\",\n READY: \"READY\",\n TRANSITIONING: \"TRANSITIONING\",\n DISPOSED: \"DISPOSED\",\n} as const;\n\nexport type RouterState = (typeof routerStates)[keyof typeof routerStates];\n\n/**\n * Router FSM events.\n *\n * - START: Begin router initialization\n * - STARTED: Router initialization complete\n * - NAVIGATE: Begin navigation\n * - COMPLETE: Navigation completed successfully\n * - FAIL: Navigation or initialization failed\n * - CANCEL: Navigation cancelled\n * - STOP: Stop router\n * - DISPOSE: Dispose router (R2+)\n */\nexport const routerEvents = {\n START: \"START\",\n STARTED: \"STARTED\",\n NAVIGATE: \"NAVIGATE\",\n COMPLETE: \"COMPLETE\",\n FAIL: \"FAIL\",\n CANCEL: \"CANCEL\",\n STOP: \"STOP\",\n DISPOSE: \"DISPOSE\",\n} as const;\n\nexport type RouterEvent = (typeof routerEvents)[keyof typeof routerEvents];\n\n/**\n * Typed payloads for router FSM events.\n *\n * Events without entries have no payload.\n */\nexport interface RouterPayloads {\n NAVIGATE: {\n toState: State;\n fromState: State | undefined;\n };\n COMPLETE: {\n state: State;\n fromState: State | undefined;\n opts: NavigationOptions;\n };\n FAIL: {\n toState?: State | undefined;\n fromState?: State | undefined;\n error?: unknown;\n };\n CANCEL: {\n toState: State;\n fromState: State | undefined;\n };\n}\n\n/**\n * Router FSM configuration.\n *\n * Transitions:\n * - IDLE → STARTING (START), DISPOSED (DISPOSE)\n * - STARTING → READY (STARTED), IDLE (FAIL)\n * - READY → TRANSITIONING (NAVIGATE), READY (FAIL, self-loop for early validation errors), IDLE (STOP)\n * - TRANSITIONING → TRANSITIONING (NAVIGATE, self-loop for canSend), READY (COMPLETE, CANCEL, FAIL)\n * - DISPOSED → (no transitions)\n */\nconst routerFSMConfig: FSMConfig<RouterState, RouterEvent, null> = {\n initial: routerStates.IDLE,\n context: null,\n transitions: {\n [routerStates.IDLE]: {\n [routerEvents.START]: routerStates.STARTING,\n [routerEvents.DISPOSE]: routerStates.DISPOSED,\n },\n [routerStates.STARTING]: {\n [routerEvents.STARTED]: routerStates.READY,\n [routerEvents.FAIL]: routerStates.IDLE,\n },\n [routerStates.READY]: {\n [routerEvents.NAVIGATE]: routerStates.TRANSITIONING,\n [routerEvents.FAIL]: routerStates.READY,\n [routerEvents.STOP]: routerStates.IDLE,\n },\n [routerStates.TRANSITIONING]: {\n [routerEvents.NAVIGATE]: routerStates.TRANSITIONING,\n [routerEvents.COMPLETE]: routerStates.READY,\n [routerEvents.CANCEL]: routerStates.READY,\n [routerEvents.FAIL]: routerStates.READY,\n },\n [routerStates.DISPOSED]: {},\n },\n};\n\n/**\n * Factory function to create a router FSM instance.\n *\n * @returns FSM instance with initial state \"IDLE\"\n */\nexport function createRouterFSM(): FSM<\n RouterState,\n RouterEvent,\n null,\n RouterPayloads\n> {\n return new FSM<RouterState, RouterEvent, null, RouterPayloads>(\n routerFSMConfig,\n );\n}\n","// packages/real-router/modules/helpers.ts\n\nimport { DEFAULT_LIMITS } from \"./constants\";\n\nimport type { Limits } from \"./types\";\nimport type { State, LimitsConfig } from \"@real-router/types\";\n\nexport { getTypeDescription } from \"type-guards\";\n\n// =============================================================================\n// State Helpers\n// =============================================================================\n\n/**\n * Structural type guard for State object.\n * Only checks required fields exist with correct types.\n * Does NOT validate params serializability (allows circular refs).\n *\n * Use `isState` from type-guards for full validation (serializable params).\n * Use this for internal operations like deepFreezeState that handle any object structure.\n *\n * @param value - Value to check\n * @returns true if value has State structure\n * @internal\n */\nfunction isStateStructural(value: unknown): value is State {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n return (\n typeof obj.name === \"string\" &&\n typeof obj.path === \"string\" &&\n typeof obj.params === \"object\" &&\n obj.params !== null\n );\n}\n\n/**\n * Deep freezes State object to prevent mutations.\n * Creates a deep clone first, then recursively freezes the clone and all nested objects.\n * Uses simple recursive freezing after cloning (no need for WeakSet since clone has no circular refs).\n *\n * @param state - The State object to freeze\n * @returns A frozen deep clone of the state\n * @throws {TypeError} If state is not a valid State object\n *\n * @example\n * const state = { name: 'home', params: {}, path: '/' };\n * const frozen = deepFreezeState(state);\n * // frozen.params is now immutable\n * // original state is unchanged\n */\nexport function deepFreezeState<T extends State>(state: T): T {\n // Early return for null/undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!state) {\n return state;\n }\n\n // Validate State structure (structural check, allows circular refs)\n if (!isStateStructural(state)) {\n throw new TypeError(\n `[deepFreezeState] Expected valid State object, got: ${typeof state}`,\n );\n }\n\n // Create a deep clone to avoid mutating the original\n // structuredClone preserves circular references, so we need to track visited objects\n const clonedState = structuredClone(state);\n\n // WeakSet to track visited objects (prevent infinite recursion with circular refs)\n const visited = new WeakSet<object>();\n\n // Recursive freeze function with circular reference protection\n function freezeClonedRecursive(obj: unknown): void {\n // Skip primitives, null, undefined\n // Note: typeof undefined === \"undefined\" !== \"object\", so checking undefined is redundant\n if (obj === null || typeof obj !== \"object\") {\n return;\n }\n\n // Skip already visited objects (circular reference protection)\n if (visited.has(obj)) {\n return;\n }\n\n // Mark as visited\n visited.add(obj);\n\n // Freeze the object/array itself\n Object.freeze(obj);\n\n // Get all values to freeze recursively\n const values = Array.isArray(obj) ? obj : Object.values(obj);\n\n // Recursively freeze nested values\n for (const value of values) {\n freezeClonedRecursive(value);\n }\n }\n\n // Freeze the entire cloned state tree\n freezeClonedRecursive(clonedState);\n\n return clonedState;\n}\n\n// WeakSet to track already frozen root objects for O(1) re-freeze check\nconst frozenRoots = new WeakSet<object>();\n\n// Module-scope recursive freeze function - better JIT optimization, no allocation per call\nfunction freezeRecursive(obj: unknown): void {\n // Skip primitives, null\n if (obj === null || typeof obj !== \"object\") {\n return;\n }\n\n // Skip already frozen objects (handles potential shared refs)\n if (Object.isFrozen(obj)) {\n return;\n }\n\n // Freeze the object/array\n Object.freeze(obj);\n\n // Iterate without Object.values() allocation\n if (Array.isArray(obj)) {\n for (const item of obj) {\n freezeRecursive(item);\n }\n } else {\n for (const key in obj) {\n freezeRecursive((obj as Record<string, unknown>)[key]);\n }\n }\n}\n\n/**\n * Freezes State object in-place without cloning.\n * Optimized for hot paths where state is known to be a fresh object.\n *\n * IMPORTANT: Only use this when you know the state is a fresh object\n * that hasn't been exposed to external code yet (e.g., from makeState()).\n *\n * @param state - The State object to freeze (must be a fresh object)\n * @returns The same state object, now frozen\n * @internal\n */\nexport function freezeStateInPlace<T extends State>(state: T): T {\n // Early return for null/undefined - state from makeState() is never null\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!state) {\n return state;\n }\n\n // Fast path: already processed root object - O(1) check\n if (frozenRoots.has(state)) {\n return state;\n }\n\n // Freeze the entire state tree\n freezeRecursive(state);\n\n // Mark root as processed for future calls\n frozenRoots.add(state);\n\n return state;\n}\n\n/**\n * Computes warning and error thresholds for a given limit.\n * WARN threshold: 20% of limit\n * ERROR threshold: 50% of limit\n */\nexport function computeThresholds(limit: number): {\n warn: number;\n error: number;\n} {\n return {\n warn: Math.floor(limit * 0.2),\n error: Math.floor(limit * 0.5),\n };\n}\n\n/**\n * Merges user limits with defaults.\n * Returns frozen object for immutability.\n */\nexport function createLimits(userLimits: Partial<LimitsConfig> = {}): Limits {\n return { ...DEFAULT_LIMITS, ...userLimits };\n}\n","// packages/core/src/namespaces/DependenciesNamespace/validators.ts\n\n/**\n * Static validation functions for DependenciesNamespace.\n * Called by Router facade before instance methods.\n *\n * Extracted from DependenciesNamespace class for better separation of concerns.\n */\n\nimport { getTypeDescription } from \"type-guards\";\n\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\n/**\n * Validates that dependency name is a string.\n * Called by facade before get/remove/has operations.\n */\nexport function validateDependencyName(\n name: unknown,\n methodName: string,\n): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.${methodName}]: dependency name must be a string, got ${typeof name}`,\n );\n }\n}\n\n/**\n * Validates setDependency name argument.\n * Value is not validated - any value is valid.\n */\nexport function validateSetDependencyArgs(\n name: unknown,\n): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.setDependency]: dependency name must be a string, got ${typeof name}`,\n );\n }\n}\n\n/**\n * Validates that dependencies object is a plain object without getters.\n * Called by facade before setMultiple/constructor.\n */\nexport function validateDependenciesObject(\n deps: unknown,\n methodName: string,\n): asserts deps is Record<string, unknown> {\n // Reject non-plain objects (classes, Date, Map, Array)\n if (!(deps && typeof deps === \"object\" && deps.constructor === Object)) {\n throw new TypeError(\n `[router.${methodName}] Invalid argument: expected plain object, received ${getTypeDescription(deps)}`,\n );\n }\n\n // Getters can throw, return different values, or have side effects\n for (const key in deps) {\n if (Object.getOwnPropertyDescriptor(deps, key)?.get) {\n throw new TypeError(\n `[router.${methodName}] Getters not allowed: \"${key}\"`,\n );\n }\n }\n}\n\n/**\n * Validates that dependency exists (not undefined).\n * Throws ReferenceError if dependency is not found.\n */\nexport function validateDependencyExists(\n value: unknown,\n dependencyName: string,\n): asserts value is NonNullable<unknown> {\n if (value === undefined) {\n throw new ReferenceError(\n `[router.getDependency]: dependency \"${dependencyName}\" not found`,\n );\n }\n}\n\n/**\n * Validates that adding dependencies won't exceed the hard limit.\n * Called before bulk operations to ensure atomicity.\n */\nexport function validateDependencyLimit(\n currentCount: number,\n newCount: number,\n methodName: string,\n maxDependencies: number = DEFAULT_LIMITS.maxDependencies,\n): void {\n if (maxDependencies === 0) {\n return;\n }\n\n const totalCount = currentCount + newCount;\n\n if (totalCount >= maxDependencies) {\n throw new Error(\n `[router.${methodName}] Dependency limit exceeded (${maxDependencies}). ` +\n `Current: ${totalCount}. This is likely a bug in your code.`,\n );\n }\n}\n","// packages/core/src/namespaces/DependenciesNamespace/DependenciesNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport {\n validateDependencyExists,\n validateDependencyLimit,\n validateDependencyName,\n validateDependenciesObject,\n validateSetDependencyArgs,\n} from \"./validators\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\nimport { computeThresholds } from \"../../helpers\";\n\nimport type { Limits } from \"../../types\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\n/**\n * Independent namespace for managing router dependencies.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic (limits, warnings).\n */\nexport class DependenciesNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #dependencies: Partial<Dependencies> = Object.create(\n null,\n ) as Partial<Dependencies>;\n\n #limits: Limits = DEFAULT_LIMITS;\n\n constructor(initialDependencies: Partial<Dependencies> = {} as Dependencies) {\n this.setMultiple(initialDependencies);\n }\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateName(\n name: unknown,\n methodName: string,\n ): asserts name is string {\n validateDependencyName(name, methodName);\n }\n\n static validateSetDependencyArgs(name: unknown): asserts name is string {\n validateSetDependencyArgs(name);\n }\n\n static validateDependenciesObject(\n deps: unknown,\n methodName: string,\n ): asserts deps is Record<string, unknown> {\n validateDependenciesObject(deps, methodName);\n }\n\n static validateDependencyExists(\n value: unknown,\n dependencyName: string,\n ): asserts value is NonNullable<unknown> {\n validateDependencyExists(value, dependencyName);\n }\n\n static validateDependencyLimit(\n currentCount: number,\n newCount: number,\n methodName: string,\n maxDependencies?: number,\n ): void {\n validateDependencyLimit(\n currentCount,\n newCount,\n methodName,\n maxDependencies,\n );\n }\n\n setLimits(limits: Limits): void {\n this.#limits = limits;\n }\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Sets a single dependency.\n * Returns true if set, false if value was undefined (no-op).\n *\n * @param dependencyName - Already validated by facade\n * @param dependencyValue - Value to set\n */\n set<K extends keyof Dependencies & string>(\n dependencyName: K,\n dependencyValue: Dependencies[K],\n ): boolean {\n // undefined = \"don't set\" (feature for conditional setting)\n if (dependencyValue === undefined) {\n return false;\n }\n\n const isNewKey = !Object.hasOwn(this.#dependencies, dependencyName);\n\n if (isNewKey) {\n // Only check limit when adding new keys (overwrites don't increase count)\n this.#checkDependencyCount(\"setDependency\");\n } else {\n const oldValue = this.#dependencies[dependencyName];\n const isChanging = oldValue !== dependencyValue;\n // Special case for NaN idempotency (NaN !== NaN is always true)\n const bothAreNaN =\n Number.isNaN(oldValue) && Number.isNaN(dependencyValue);\n\n if (isChanging && !bothAreNaN) {\n logger.warn(\n \"router.setDependency\",\n \"Router dependency already exists and is being overwritten:\",\n dependencyName,\n );\n }\n }\n\n this.#dependencies[dependencyName] = dependencyValue;\n\n return true;\n }\n\n /**\n * Sets multiple dependencies at once.\n * Limit check should be done by facade before calling this method.\n *\n * @param deps - Already validated by facade\n */\n setMultiple(deps: Partial<Dependencies>): void {\n const overwrittenKeys: string[] = [];\n\n for (const key in deps) {\n if (deps[key] !== undefined) {\n if (Object.hasOwn(this.#dependencies, key)) {\n overwrittenKeys.push(key);\n }\n\n this.#dependencies[key] = deps[key];\n }\n }\n\n if (overwrittenKeys.length > 0) {\n logger.warn(\n \"router.setDependencies\",\n \"Overwritten:\",\n overwrittenKeys.join(\", \"),\n );\n }\n }\n\n /**\n * Gets a single dependency.\n * Throws if not found.\n *\n * @param dependencyName - Already validated by facade\n */\n get<K extends keyof Dependencies>(dependencyName: K): Dependencies[K] {\n return this.#dependencies[dependencyName] as Dependencies[K];\n }\n\n /**\n * Gets all dependencies as a shallow copy.\n */\n getAll(): Partial<Dependencies> {\n return { ...this.#dependencies };\n }\n\n /**\n * Gets the current number of dependencies.\n */\n count(): number {\n return Object.keys(this.#dependencies).length;\n }\n\n /**\n * Removes a dependency by name.\n * Logs warning if dependency doesn't exist.\n */\n remove(dependencyName: keyof Dependencies): void {\n if (!Object.hasOwn(this.#dependencies, dependencyName)) {\n logger.warn(\n `router.removeDependency`,\n `Attempted to remove non-existent dependency: \"${getTypeDescription(dependencyName)}\"`,\n );\n }\n\n delete this.#dependencies[dependencyName];\n }\n\n /**\n * Checks if a dependency exists.\n */\n has(dependencyName: keyof Dependencies): boolean {\n return Object.hasOwn(this.#dependencies, dependencyName);\n }\n\n /**\n * Removes all dependencies.\n */\n reset(): void {\n for (const key in this.#dependencies) {\n delete this.#dependencies[key];\n }\n }\n\n // =========================================================================\n // Private methods (business logic)\n // =========================================================================\n\n #checkDependencyCount(methodName: string): void {\n const maxDependencies = this.#limits.maxDependencies;\n\n if (maxDependencies === 0) {\n return;\n }\n\n const currentCount = Object.keys(this.#dependencies).length;\n\n const { warn, error } = computeThresholds(maxDependencies);\n\n if (currentCount === warn) {\n logger.warn(\n `router.${methodName}`,\n `${warn} dependencies registered. ` + `Consider if all are necessary.`,\n );\n } else if (currentCount === error) {\n logger.error(\n `router.${methodName}`,\n `${error} dependencies registered! ` +\n `This indicates architectural problems. ` +\n `Hard limit at ${maxDependencies}.`,\n );\n } else if (currentCount >= maxDependencies) {\n throw new Error(\n `[router.${methodName}] Dependency limit exceeded (${maxDependencies}). ` +\n `Current: ${currentCount}. This is likely a bug in your code. ` +\n `If you genuinely need more dependencies, your architecture needs refactoring.`,\n );\n }\n }\n}\n","// packages/core/src/namespaces/OptionsNamespace/constants.ts\n\nimport type { Options } from \"@real-router/types\";\n\n/**\n * Default options for the router.\n */\nexport const defaultOptions: Options = {\n defaultRoute: \"\",\n defaultParams: {},\n trailingSlash: \"preserve\",\n queryParamsMode: \"loose\",\n queryParams: {\n arrayFormat: \"none\",\n booleanFormat: \"none\",\n nullFormat: \"default\",\n },\n urlParamsEncoding: \"default\",\n allowNotFound: true,\n rewritePathOnMatch: true,\n noValidate: false,\n} satisfies Options;\n\n/**\n * Valid values for string enum options.\n * Used for runtime validation in constructor options.\n */\nexport const VALID_OPTION_VALUES = {\n trailingSlash: [\"strict\", \"never\", \"always\", \"preserve\"] as const,\n queryParamsMode: [\"default\", \"strict\", \"loose\"] as const,\n urlParamsEncoding: [\"default\", \"uri\", \"uriComponent\", \"none\"] as const,\n} as const;\n\n/**\n * Valid keys and values for queryParams option.\n */\nexport const VALID_QUERY_PARAMS = {\n arrayFormat: [\"none\", \"brackets\", \"index\", \"comma\"] as const,\n booleanFormat: [\"none\", \"string\", \"empty-true\"] as const,\n nullFormat: [\"default\", \"hidden\"] as const,\n} as const;\n","// packages/core/src/namespaces/OptionsNamespace/helpers.ts\n\nimport type { Options, Params } from \"@real-router/types\";\n\n/**\n * Recursively freezes an object and all nested objects.\n * Only freezes plain objects, not primitives or special objects.\n */\nexport function deepFreeze<T extends object>(obj: T): Readonly<T> {\n Object.freeze(obj);\n\n for (const key of Object.keys(obj)) {\n const value = (obj as Record<string, unknown>)[key];\n\n if (value && typeof value === \"object\" && value.constructor === Object) {\n deepFreeze(value);\n }\n }\n\n return obj;\n}\n\n/**\n * Resolves an option value that can be static or a callback.\n * If the value is a function, calls it with getDependency and returns the result.\n * Otherwise, returns the value as-is.\n */\nexport function resolveOption(\n value: Options[\"defaultRoute\"],\n getDependency: (name: string) => unknown,\n): string;\n\nexport function resolveOption(\n value: Options[\"defaultParams\"],\n getDependency: (name: string) => unknown,\n): Params;\n\n// eslint-disable-next-line sonarjs/function-return-type -- overloads: string for defaultRoute, Params for defaultParams\nexport function resolveOption(\n value: Options[\"defaultRoute\"] | Options[\"defaultParams\"],\n getDependency: (name: string) => unknown,\n): string | Params {\n if (typeof value === \"function\") {\n // Runtime getDependency is (name: string) => unknown, but DefaultRouteCallback<object>\n // expects <K extends keyof object>(name: K) => object[K] where keyof object = never.\n // Cast needed to bridge generic constraint mismatch.\n return value(getDependency as never);\n }\n\n return value;\n}\n","// packages/core/src/namespaces/OptionsNamespace/validators.ts\n\n/**\n * Static validation functions for OptionsNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { isObjKey, getTypeDescription } from \"type-guards\";\n\nimport {\n defaultOptions,\n VALID_OPTION_VALUES,\n VALID_QUERY_PARAMS,\n} from \"./constants\";\nimport { LIMIT_BOUNDS } from \"../../constants\";\n\nimport type { LimitsConfig, Options } from \"@real-router/types\";\n\n/**\n * Validates that value is a plain object without getters.\n */\nexport function validatePlainObject(\n value: unknown,\n optionName: string,\n methodName: string,\n): asserts value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || value.constructor !== Object) {\n throw new TypeError(\n `[router.${methodName}] Invalid type for \"${optionName}\": ` +\n `expected plain object, got ${getTypeDescription(value)}`,\n );\n }\n\n // Getters can throw, return different values, or have side effects\n for (const key in value) {\n if (Object.getOwnPropertyDescriptor(value, key)?.get) {\n throw new TypeError(\n `[router.${methodName}] Getters not allowed in \"${optionName}\": \"${key}\"`,\n );\n }\n }\n}\n\n/**\n * Validates queryParams keys and values against allowed enums.\n */\nexport function validateQueryParams(\n value: Record<string, unknown>,\n methodName: string,\n): void {\n for (const key in value) {\n if (!isObjKey(key, VALID_QUERY_PARAMS)) {\n const validKeys = Object.keys(VALID_QUERY_PARAMS)\n .map((k) => `\"${k}\"`)\n .join(\", \");\n\n throw new TypeError(\n `[router.${methodName}] Unknown queryParams key: \"${key}\". ` +\n `Valid keys: ${validKeys}`,\n );\n }\n\n const paramValue = value[key];\n const validValues = VALID_QUERY_PARAMS[key];\n const isValid = (validValues as readonly string[]).includes(\n paramValue as string,\n );\n\n if (!isValid) {\n const allowedValues = validValues.map((v) => `\"${v}\"`).join(\", \");\n\n throw new TypeError(\n `[router.${methodName}] Invalid value for queryParams.${key}: ` +\n `expected one of ${allowedValues}, got \"${String(paramValue)}\"`,\n );\n }\n }\n}\n\n/**\n * Validates string enum options against allowed values.\n */\nexport function validateEnumOption(\n optionName: keyof typeof VALID_OPTION_VALUES,\n value: unknown,\n methodName: string,\n): void {\n const validValues = VALID_OPTION_VALUES[optionName];\n const isValid = (validValues as readonly string[]).includes(value as string);\n\n if (!isValid) {\n const allowedValues = validValues.map((v) => `\"${v}\"`).join(\", \");\n\n throw new TypeError(\n `[router.${methodName}] Invalid value for \"${optionName}\": ` +\n `expected one of ${allowedValues}, got \"${String(value)}\"`,\n );\n }\n}\n\n/**\n * Validates a single option value against expected type and constraints.\n * Skips validation for unknown options - validateOptionExists handles that.\n */\nexport function validateOptionValue(\n optionName: keyof Options,\n value: unknown,\n methodName: string,\n): void {\n // Allow callback functions for dynamic default route/params options\n // MUST be first check — before object branch (L140) which would reject\n // functions via validatePlainObject for defaultParams (default = {})\n if (\n typeof value === \"function\" &&\n (optionName === \"defaultRoute\" || optionName === \"defaultParams\")\n ) {\n return; // Valid — callback resolved at runtime\n }\n\n const expectedValue = defaultOptions[optionName];\n\n // For object options - ensure plain objects only (not null, arrays, Date, etc)\n if (expectedValue && typeof expectedValue === \"object\") {\n validatePlainObject(value, optionName, methodName);\n\n if (optionName === \"queryParams\") {\n validateQueryParams(value, methodName);\n }\n\n return;\n }\n\n // For primitives - typeof check first\n if (typeof value !== typeof expectedValue) {\n throw new TypeError(\n `[router.${methodName}] Invalid type for \"${optionName}\": ` +\n `expected ${typeof expectedValue}, got ${typeof value}`,\n );\n }\n\n // For string enum options - validate against allowed values\n if (optionName in VALID_OPTION_VALUES) {\n validateEnumOption(\n optionName as keyof typeof VALID_OPTION_VALUES,\n value,\n methodName,\n );\n }\n}\n\n/**\n * Validates optional fields not in defaultOptions.\n * Note: logger is handled before validateOptions in Router constructor.\n */\nfunction validateOptionalField(\n key: string,\n value: unknown,\n methodName: string,\n): boolean {\n if (key === \"limits\") {\n if (value !== undefined) {\n validateLimits(value, methodName);\n }\n\n return true;\n }\n\n throw new TypeError(`[router.${methodName}] Unknown option: \"${key}\"`);\n}\n\n/**\n * Validates a partial options object.\n * Called by facade before constructor/withOptions.\n */\nexport function validateOptions(\n options: unknown,\n methodName: string,\n): asserts options is Partial<Options> {\n if (\n !options ||\n typeof options !== \"object\" ||\n options.constructor !== Object\n ) {\n throw new TypeError(\n `[router.${methodName}] Invalid options: expected plain object, got ${getTypeDescription(options)}`,\n );\n }\n\n for (const [key, value] of Object.entries(options)) {\n // Skip optional fields that aren't in defaultOptions (limits, logger, etc.)\n if (!isObjKey(key, defaultOptions)) {\n validateOptionalField(key, value, methodName);\n continue;\n }\n\n // Skip undefined values for conditional configuration\n if (value === undefined) {\n continue;\n }\n\n validateOptionValue(key, value, methodName);\n }\n}\n\n/**\n * Validates that a limit value is within bounds.\n */\nexport function validateLimitValue(\n limitName: keyof LimitsConfig,\n value: unknown,\n methodName: string,\n): void {\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n throw new TypeError(\n `[router.${methodName}]: limit \"${limitName}\" must be an integer, got ${String(value)}`,\n );\n }\n\n const bounds = LIMIT_BOUNDS[limitName];\n\n if (value < bounds.min || value > bounds.max) {\n throw new RangeError(\n `[router.${methodName}]: limit \"${limitName}\" must be between ${bounds.min} and ${bounds.max}, got ${value}`,\n );\n }\n}\n\n/**\n * Validates a partial limits object.\n */\nexport function validateLimits(\n limits: unknown,\n methodName: string,\n): asserts limits is Partial<LimitsConfig> {\n if (!limits || typeof limits !== \"object\" || limits.constructor !== Object) {\n throw new TypeError(\n `[router.${methodName}]: invalid limits: expected plain object, got ${typeof limits}`,\n );\n }\n\n for (const [key, value] of Object.entries(limits)) {\n if (!Object.hasOwn(LIMIT_BOUNDS, key)) {\n throw new TypeError(`[router.${methodName}]: unknown limit: \"${key}\"`);\n }\n\n if (value === undefined) {\n continue;\n }\n\n validateLimitValue(key as keyof LimitsConfig, value, methodName);\n }\n}\n","// packages/core/src/namespaces/OptionsNamespace/OptionsNamespace.ts\n\nimport { defaultOptions } from \"./constants\";\nimport { deepFreeze } from \"./helpers\";\nimport { validateOptions } from \"./validators\";\n\nimport type { Options } from \"@real-router/types\";\n\n/**\n * Independent namespace for managing router options.\n *\n * Options are immutable after construction.\n * Static methods handle validation (called by facade).\n * Instance methods provide read-only access.\n */\nexport class OptionsNamespace {\n readonly #options: Readonly<Options>;\n\n constructor(initialOptions: Partial<Options> = {}) {\n // Note: validation should be done by facade before calling constructor\n this.#options = deepFreeze({\n ...defaultOptions,\n ...initialOptions,\n });\n }\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateOptions(\n options: unknown,\n methodName: string,\n ): asserts options is Partial<Options> {\n validateOptions(options, methodName);\n }\n\n // =========================================================================\n // Instance methods (read-only access)\n // =========================================================================\n\n /**\n * Returns the frozen options object.\n * Safe to return directly - mutations will throw in strict mode.\n */\n get(): Readonly<Options> {\n return this.#options;\n }\n}\n","// packages/core/src/namespaces/StateNamespace/helpers.ts\n\nimport type { RouteTreeStateMeta } from \"route-tree\";\n\n/**\n * Extracts URL param names from RouteTreeStateMeta.\n * This is an O(segments × params) operation but avoids tree traversal.\n */\nexport function getUrlParamsFromMeta(meta: RouteTreeStateMeta): string[] {\n const urlParams: string[] = [];\n\n for (const segmentName in meta) {\n const paramMap = meta[segmentName];\n\n for (const param in paramMap) {\n if (paramMap[param] === \"url\") {\n urlParams.push(param);\n }\n }\n }\n\n return urlParams;\n}\n\n/**\n * Compares two parameter values for equality.\n * Supports deep equality for arrays (common in route params like tags, ids).\n */\nexport function areParamValuesEqual(val1: unknown, val2: unknown): boolean {\n if (val1 === val2) {\n return true;\n }\n\n if (Array.isArray(val1) && Array.isArray(val2)) {\n if (val1.length !== val2.length) {\n return false;\n }\n\n return val1.every((v, i) => areParamValuesEqual(v, val2[i]));\n }\n\n return false;\n}\n","// packages/core/src/namespaces/StateNamespace/StateNamespace.ts\n\nimport {\n getTypeDescription,\n isParams,\n isString,\n validateState,\n} from \"type-guards\";\n\nimport { areParamValuesEqual, getUrlParamsFromMeta } from \"./helpers\";\nimport { constants } from \"../../constants\";\nimport { freezeStateInPlace } from \"../../helpers\";\n\nimport type { StateNamespaceDependencies } from \"./types\";\nimport type {\n NavigationOptions,\n Params,\n State,\n StateMetaInput,\n} from \"@real-router/types\";\nimport type { RouteTreeStateMeta } from \"route-tree\";\n\n/**\n * Independent namespace for managing router state storage and creation.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle state storage, freezing, and creation.\n */\nexport class StateNamespace {\n /**\n * Auto-incrementing state ID for tracking navigation history.\n */\n #stateId = 0;\n\n /**\n * Cached frozen state - avoids structuredClone on every getState() call.\n */\n #frozenState: State | undefined = undefined;\n\n /**\n * Previous state before the last setState call.\n */\n #previousState: State | undefined = undefined;\n\n /**\n * Dependencies injected from Router.\n */\n #deps!: StateNamespaceDependencies;\n\n /**\n * Cache for URL params by route name.\n */\n readonly #urlParamsCache = new Map<string, string[]>();\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // =========================================================================\n\n /**\n * Validates makeState arguments.\n */\n static validateMakeStateArgs(\n name: unknown,\n params: unknown,\n path: unknown,\n forceId: unknown,\n ): void {\n // Validate name is a string\n if (!isString(name)) {\n throw new TypeError(\n `[router.makeState] Invalid name: ${getTypeDescription(name)}. Expected string.`,\n );\n }\n\n // Validate params if provided\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(\n `[router.makeState] Invalid params: ${getTypeDescription(params)}. Expected plain object.`,\n );\n }\n\n // Validate path if provided\n if (path !== undefined && !isString(path)) {\n throw new TypeError(\n `[router.makeState] Invalid path: ${getTypeDescription(path)}. Expected string.`,\n );\n }\n\n // Validate forceId if provided\n if (forceId !== undefined && typeof forceId !== \"number\") {\n throw new TypeError(\n `[router.makeState] Invalid forceId: ${getTypeDescription(forceId)}. Expected number.`,\n );\n }\n }\n\n /**\n * Validates areStatesEqual arguments.\n */\n static validateAreStatesEqualArgs(\n state1: unknown,\n state2: unknown,\n ignoreQueryParams: unknown,\n ): void {\n // null/undefined are valid (represent \"no state\")\n if (state1 != null) {\n validateState(state1, \"areStatesEqual\");\n }\n\n if (state2 != null) {\n validateState(state2, \"areStatesEqual\");\n }\n\n if (\n ignoreQueryParams !== undefined &&\n typeof ignoreQueryParams !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.areStatesEqual] Invalid ignoreQueryParams: ${getTypeDescription(ignoreQueryParams)}. Expected boolean.`,\n );\n }\n }\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Returns the current router state.\n *\n * The returned state is deeply frozen (immutable) for safety.\n * Returns `undefined` if the router has not been started or has been stopped.\n */\n get<P extends Params = Params, MP extends Params = Params>():\n | State<P, MP>\n | undefined {\n return this.#frozenState as State<P, MP> | undefined;\n }\n\n /**\n * Sets the current router state.\n *\n * The state is deeply frozen before storage to ensure immutability.\n * The previous state is preserved and accessible via `getPrevious()`.\n *\n * @param state - Already validated by facade, or undefined to clear\n */\n set(state: State | undefined): void {\n // Preserve current state as previous before updating\n this.#previousState = this.#frozenState;\n\n // If state is already frozen (from makeState()), use it directly.\n // For external states, freeze in place without cloning.\n this.#frozenState = state ? freezeStateInPlace(state) : undefined;\n }\n\n /**\n * Returns the previous router state (before the last navigation).\n */\n getPrevious<P extends Params = Params, MP extends Params = Params>():\n | State<P, MP>\n | undefined {\n return this.#previousState as State<P, MP> | undefined;\n }\n\n reset(): void {\n this.#frozenState = undefined;\n this.#previousState = undefined;\n this.#urlParamsCache.clear();\n this.#stateId = 0;\n }\n\n // =========================================================================\n // Dependency Injection\n // =========================================================================\n\n /**\n * Sets dependencies for state creation methods.\n * Must be called before using makeState, areStatesEqual, etc.\n */\n setDependencies(deps: StateNamespaceDependencies): void {\n this.#deps = deps;\n }\n\n // =========================================================================\n // State Creation Methods\n // =========================================================================\n\n /**\n * Creates a frozen state object for a route.\n */\n makeState<P extends Params = Params, MP extends Params = Params>(\n name: string,\n params?: P,\n path?: string,\n meta?: StateMetaInput<MP>,\n forceId?: number,\n ): State<P, MP> {\n const madeMeta = meta\n ? {\n ...meta,\n id: forceId ?? ++this.#stateId,\n params: meta.params,\n options: meta.options,\n }\n : undefined;\n\n // Optimization: O(1) lookup instead of O(depth) ancestor iteration\n const defaultParamsConfig = this.#deps.getDefaultParams();\n const hasDefaultParams = Object.hasOwn(defaultParamsConfig, name);\n\n // Conditional allocation: avoid spreading when no defaultParams exist\n let mergedParams: P;\n\n if (hasDefaultParams) {\n mergedParams = { ...defaultParamsConfig[name], ...params } as P;\n } else if (params) {\n mergedParams = { ...params };\n } else {\n mergedParams = {} as P;\n }\n\n const state: State<P, MP> = {\n name,\n params: mergedParams,\n path: path ?? this.#deps.buildPath(name, params),\n meta: madeMeta,\n };\n\n return freezeStateInPlace(state);\n }\n\n /**\n * Creates a frozen state object for the \"not found\" route.\n */\n makeNotFoundState(path: string, options: NavigationOptions): State {\n return this.makeState<{ path: string }>(\n constants.UNKNOWN_ROUTE,\n { path },\n path,\n {\n options,\n params: {},\n },\n );\n }\n\n // =========================================================================\n // State Comparison Methods\n // =========================================================================\n\n /**\n * Compares two states for equality.\n * By default, ignores query params (only compares URL params).\n */\n areStatesEqual(\n state1: State | undefined,\n state2: State | undefined,\n ignoreQueryParams = true,\n ): boolean {\n if (!state1 || !state2) {\n return !!state1 === !!state2;\n }\n\n if (state1.name !== state2.name) {\n return false;\n }\n\n if (ignoreQueryParams) {\n const stateMeta = (state1.meta?.params ?? state2.meta?.params) as\n | RouteTreeStateMeta\n | undefined;\n\n const urlParams = stateMeta\n ? getUrlParamsFromMeta(stateMeta)\n : this.#getUrlParams(state1.name);\n\n return urlParams.every((param) =>\n areParamValuesEqual(state1.params[param], state2.params[param]),\n );\n }\n\n const state1Keys = Object.keys(state1.params);\n const state2Keys = Object.keys(state2.params);\n\n if (state1Keys.length !== state2Keys.length) {\n return false;\n }\n\n return state1Keys.every(\n (param) =>\n param in state2.params &&\n areParamValuesEqual(state1.params[param], state2.params[param]),\n );\n }\n\n // =========================================================================\n // Private Helpers\n // =========================================================================\n\n /**\n * Gets URL params for a route name, using cache for performance.\n */\n #getUrlParams(name: string): string[] {\n const cached = this.#urlParamsCache.get(name);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const result = this.#deps.getUrlParams(name);\n\n this.#urlParamsCache.set(name, result);\n\n return result;\n }\n}\n","// packages/core/src/namespaces/MiddlewareNamespace/validators.ts\n\n/**\n * Static validation functions for MiddlewareNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { getTypeDescription } from \"type-guards\";\n\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\nimport type { MiddlewareFactory } from \"../../types\";\nimport type { DefaultDependencies, Middleware } from \"@real-router/types\";\n\n/**\n * Gets a displayable name for a factory function.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction getFactoryName(factory: Function): string {\n return factory.name || \"anonymous\";\n}\n\n/**\n * Validates useMiddleware arguments - each must be a function.\n */\nexport function validateUseMiddlewareArgs<D extends DefaultDependencies>(\n middlewares: unknown[],\n): asserts middlewares is MiddlewareFactory<D>[] {\n for (const [i, middleware] of middlewares.entries()) {\n if (typeof middleware !== \"function\") {\n throw new TypeError(\n `[router.useMiddleware] Expected middleware factory function at index ${i}, ` +\n `got ${getTypeDescription(middleware)}`,\n );\n }\n }\n}\n\n/**\n * Validates that a middleware factory returned a valid middleware function.\n */\nexport function validateMiddleware<D extends DefaultDependencies>(\n middleware: unknown,\n factory: MiddlewareFactory<D>,\n): asserts middleware is Middleware {\n if (typeof middleware !== \"function\") {\n throw new TypeError(\n `[router.useMiddleware] Middleware factory must return a function, ` +\n `got ${getTypeDescription(middleware)}. ` +\n `Factory: ${getFactoryName(factory)}`,\n );\n }\n}\n\n/**\n * Validates that no duplicate factories are being registered.\n */\nexport function validateNoDuplicates<D extends DefaultDependencies>(\n newFactories: MiddlewareFactory<D>[],\n existingFactories: MiddlewareFactory<D>[],\n): void {\n const existingSet = new Set(existingFactories);\n\n for (const factory of newFactories) {\n if (existingSet.has(factory)) {\n throw new Error(\n `[router.useMiddleware] Middleware factory already registered. ` +\n `To re-register, first unsubscribe the existing middleware. ` +\n `Factory: ${getFactoryName(factory)}`,\n );\n }\n }\n}\n\n/**\n * Validates that adding middleware won't exceed the hard limit.\n */\nexport function validateMiddlewareLimit(\n currentCount: number,\n newCount: number,\n maxMiddleware: number = DEFAULT_LIMITS.maxMiddleware,\n): void {\n if (maxMiddleware === 0) {\n return;\n }\n\n const totalSize = currentCount + newCount;\n\n if (totalSize > maxMiddleware) {\n throw new Error(\n `[router.useMiddleware] Middleware limit exceeded (${maxMiddleware}). ` +\n `Current: ${currentCount}, Attempting to add: ${newCount}. ` +\n `This indicates an architectural problem. Consider consolidating middleware.`,\n );\n }\n}\n","// packages/core/src/namespaces/MiddlewareNamespace/MiddlewareNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\n\nimport {\n validateMiddleware,\n validateMiddlewareLimit,\n validateNoDuplicates,\n validateUseMiddlewareArgs,\n} from \"./validators\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\nimport { computeThresholds } from \"../../helpers\";\n\nimport type { InitializedMiddleware, MiddlewareDependencies } from \"./types\";\nimport type { Router } from \"../../Router\";\nimport type { Limits, MiddlewareFactory } from \"../../types\";\nimport type {\n DefaultDependencies,\n Middleware,\n Unsubscribe,\n} from \"@real-router/types\";\n\n/**\n * Independent namespace for managing middleware.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic.\n */\nexport class MiddlewareNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #factories = new Set<MiddlewareFactory<Dependencies>>();\n readonly #factoryToMiddleware = new Map<\n MiddlewareFactory<Dependencies>,\n Middleware\n >();\n\n #router!: Router<Dependencies>;\n #deps!: MiddlewareDependencies<Dependencies>;\n #limits: Limits = DEFAULT_LIMITS;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateUseMiddlewareArgs<D extends DefaultDependencies>(\n middlewares: unknown[],\n ): asserts middlewares is MiddlewareFactory<D>[] {\n validateUseMiddlewareArgs<D>(middlewares);\n }\n\n static validateMiddleware<D extends DefaultDependencies>(\n middleware: unknown,\n factory: MiddlewareFactory<D>,\n ): asserts middleware is Middleware {\n validateMiddleware<D>(middleware, factory);\n }\n\n static validateNoDuplicates<D extends DefaultDependencies>(\n newFactories: MiddlewareFactory<D>[],\n existingFactories: MiddlewareFactory<D>[],\n ): void {\n validateNoDuplicates<D>(newFactories, existingFactories);\n }\n\n static validateMiddlewareLimit(\n currentCount: number,\n newCount: number,\n maxMiddleware?: number,\n ): void {\n validateMiddlewareLimit(currentCount, newCount, maxMiddleware);\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n setRouter(router: Router<Dependencies>): void {\n this.#router = router;\n }\n\n setDependencies(deps: MiddlewareDependencies<Dependencies>): void {\n this.#deps = deps;\n }\n\n setLimits(limits: Limits): void {\n this.#limits = limits;\n }\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Returns the current number of registered middleware.\n */\n count(): number {\n return this.#factories.size;\n }\n\n /**\n * Initializes middleware factories without committing to storage.\n * Returns array of initialized middleware for validation by facade.\n *\n * @param factories - Already validated by facade\n */\n initialize(\n ...factories: MiddlewareFactory<Dependencies>[]\n ): InitializedMiddleware<Dependencies>[] {\n const initialized: InitializedMiddleware<Dependencies>[] = [];\n\n for (const factory of factories) {\n // Middleware factories receive full router as part of their public API\n const middleware = factory(this.#router, this.#deps.getDependency);\n\n initialized.push({ factory, middleware });\n }\n\n return initialized;\n }\n\n /**\n * Commits initialized middleware to storage.\n * Returns unsubscribe function to remove all added middleware.\n *\n * @param initialized - Already validated by facade\n */\n commit(initialized: InitializedMiddleware<Dependencies>[]): Unsubscribe {\n // Check count thresholds and log warnings if needed\n this.#checkCountThresholds(initialized.length);\n\n // Add to storage\n for (const { factory, middleware } of initialized) {\n this.#factories.add(factory);\n this.#factoryToMiddleware.set(factory, middleware);\n }\n\n // Return unsubscribe function specific to THIS call's middleware\n let unsubscribed = false;\n\n return (): void => {\n if (unsubscribed) {\n return;\n }\n\n unsubscribed = true;\n\n for (const { factory } of initialized) {\n this.#factories.delete(factory);\n this.#factoryToMiddleware.delete(factory);\n }\n };\n }\n\n /**\n * Returns a copy of registered middleware factories.\n * Preserves insertion order.\n */\n getFactories(): MiddlewareFactory<Dependencies>[] {\n return [...this.#factories];\n }\n\n /**\n * Returns the actual middleware functions in execution order.\n */\n getFunctions(): Middleware[] {\n return [...this.#factoryToMiddleware.values()];\n }\n\n clearAll(): void {\n this.#factories.clear();\n this.#factoryToMiddleware.clear();\n }\n\n // =========================================================================\n // Private methods\n // =========================================================================\n\n #checkCountThresholds(newCount: number): void {\n const maxMiddleware = this.#limits.maxMiddleware;\n\n if (maxMiddleware === 0) {\n return;\n }\n\n const totalSize = newCount + this.#factories.size;\n\n const { warn, error } = computeThresholds(maxMiddleware);\n\n if (totalSize >= error) {\n logger.error(\n \"router.useMiddleware\",\n `${totalSize} middleware registered! ` +\n `This is excessive and will impact performance. ` +\n `Hard limit at ${maxMiddleware}.`,\n );\n } else if (totalSize >= warn) {\n logger.warn(\n \"router.useMiddleware\",\n `${totalSize} middleware registered. ` +\n `Consider if all are necessary.`,\n );\n }\n }\n}\n","// packages/core/src/namespaces/PluginsNamespace/constants.ts\n\nimport { isObjKey } from \"type-guards\";\n\nimport {\n events as EVENTS_CONST,\n plugins as PLUGINS_CONST,\n} from \"../../constants\";\n\nimport type { EventName } from \"@real-router/types\";\n\n/**\n * Maps plugin method names to router event names.\n */\nexport const EVENTS_MAP = {\n [PLUGINS_CONST.ROUTER_START]: EVENTS_CONST.ROUTER_START,\n [PLUGINS_CONST.ROUTER_STOP]: EVENTS_CONST.ROUTER_STOP,\n [PLUGINS_CONST.TRANSITION_SUCCESS]: EVENTS_CONST.TRANSITION_SUCCESS,\n [PLUGINS_CONST.TRANSITION_START]: EVENTS_CONST.TRANSITION_START,\n [PLUGINS_CONST.TRANSITION_ERROR]: EVENTS_CONST.TRANSITION_ERROR,\n [PLUGINS_CONST.TRANSITION_CANCEL]: EVENTS_CONST.TRANSITION_CANCEL,\n} as const satisfies Record<\n (typeof PLUGINS_CONST)[keyof typeof PLUGINS_CONST],\n EventName\n>;\n\n/**\n * Plugin method names that correspond to router events.\n */\nexport const EVENT_METHOD_NAMES = Object.keys(EVENTS_MAP).filter(\n (eventName): eventName is keyof typeof EVENTS_MAP =>\n isObjKey<typeof EVENTS_MAP>(eventName, EVENTS_MAP),\n);\n\nexport const LOGGER_CONTEXT = \"router.usePlugin\";\n","// packages/core/src/namespaces/PluginsNamespace/validators.ts\n\n/**\n * Static validation functions for PluginsNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { getTypeDescription, isObjKey } from \"type-guards\";\n\nimport { EVENTS_MAP } from \"./constants\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\nimport type { PluginFactory } from \"../../types\";\nimport type { DefaultDependencies, Plugin } from \"@real-router/types\";\n\n/**\n * Validates usePlugin arguments - all must be functions.\n */\nexport function validateUsePluginArgs<D extends DefaultDependencies>(\n plugins: unknown[],\n): asserts plugins is PluginFactory<D>[] {\n for (const plugin of plugins) {\n if (typeof plugin !== \"function\") {\n throw new TypeError(\n `[router.usePlugin] Expected plugin factory function, got ${typeof plugin}`,\n );\n }\n }\n}\n\n/**\n * Validates that a plugin factory returned a valid plugin object.\n */\nexport function validatePlugin(plugin: Plugin): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!(plugin && typeof plugin === \"object\") || Array.isArray(plugin)) {\n throw new TypeError(\n `[router.usePlugin] Plugin factory must return an object, got ${getTypeDescription(\n plugin,\n )}`,\n );\n }\n\n // Detect async factory (returns Promise)\n if (typeof (plugin as unknown as { then?: unknown }).then === \"function\") {\n throw new TypeError(\n `[router.usePlugin] Async plugin factories are not supported. ` +\n `Factory returned a Promise instead of a plugin object.`,\n );\n }\n\n for (const key in plugin) {\n if (!(key === \"teardown\" || isObjKey<typeof EVENTS_MAP>(key, EVENTS_MAP))) {\n throw new TypeError(\n `[router.usePlugin] Unknown property '${key}'. ` +\n `Plugin must only contain event handlers and optional teardown.`,\n );\n }\n }\n}\n\n/**\n * Validates that adding new plugins won't exceed the hard limit.\n */\nexport function validatePluginLimit(\n currentCount: number,\n newCount: number,\n maxPlugins: number = DEFAULT_LIMITS.maxPlugins,\n): void {\n if (maxPlugins === 0) {\n return;\n }\n\n const totalCount = currentCount + newCount;\n\n if (totalCount > maxPlugins) {\n throw new Error(`[router.usePlugin] Plugin limit exceeded (${maxPlugins})`);\n }\n}\n","// packages/core/src/namespaces/PluginsNamespace/PluginsNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\n\nimport { EVENTS_MAP, EVENT_METHOD_NAMES, LOGGER_CONTEXT } from \"./constants\";\nimport {\n validatePlugin,\n validatePluginLimit,\n validateUsePluginArgs,\n} from \"./validators\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\nimport { computeThresholds } from \"../../helpers\";\n\nimport type { PluginsDependencies } from \"./types\";\nimport type { Router } from \"../../Router\";\nimport type { Limits, PluginFactory } from \"../../types\";\nimport type {\n DefaultDependencies,\n Plugin,\n Unsubscribe,\n} from \"@real-router/types\";\n\n/**\n * Independent namespace for managing plugins.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic.\n */\nexport class PluginsNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #plugins = new Set<PluginFactory<Dependencies>>();\n readonly #unsubscribes = new Set<Unsubscribe>();\n\n #router!: Router<Dependencies>;\n #deps!: PluginsDependencies<Dependencies>;\n #limits: Limits = DEFAULT_LIMITS;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateUsePluginArgs<D extends DefaultDependencies>(\n plugins: unknown[],\n ): asserts plugins is PluginFactory<D>[] {\n validateUsePluginArgs<D>(plugins);\n }\n\n static validatePlugin(plugin: Plugin): void {\n validatePlugin(plugin);\n }\n\n static validatePluginLimit(\n currentCount: number,\n newCount: number,\n maxPlugins?: number,\n ): void {\n validatePluginLimit(currentCount, newCount, maxPlugins);\n }\n\n static validateNoDuplicatePlugins<D extends DefaultDependencies>(\n newFactories: PluginFactory<D>[],\n hasPlugin: (factory: PluginFactory<D>) => boolean,\n ): void {\n for (const factory of newFactories) {\n if (hasPlugin(factory)) {\n throw new Error(\n `[router.usePlugin] Plugin factory already registered. ` +\n `To re-register, first unsubscribe the existing plugin.`,\n );\n }\n }\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n setRouter(router: Router<Dependencies>): void {\n this.#router = router;\n }\n\n setDependencies(deps: PluginsDependencies<Dependencies>): void {\n this.#deps = deps;\n }\n\n setLimits(limits: Limits): void {\n this.#limits = limits;\n }\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Returns the number of registered plugins.\n * Used by facade for limit validation.\n */\n count(): number {\n return this.#plugins.size;\n }\n\n /**\n * Registers one or more plugin factories.\n * Returns unsubscribe function to remove all added plugins.\n * Input already validated by facade (limit, duplicates).\n *\n * @param factories - Already validated by facade\n */\n use(...factories: PluginFactory<Dependencies>[]): Unsubscribe {\n // Emit warnings for count thresholds (not validation, just warnings)\n this.#checkCountThresholds(factories.length);\n\n // Fast path for single plugin (common case)\n if (factories.length === 1) {\n const factory = factories[0];\n const cleanup = this.#startPlugin(factory);\n\n this.#plugins.add(factory);\n\n let unsubscribed = false;\n\n const unsubscribe: Unsubscribe = () => {\n if (unsubscribed) {\n return;\n }\n\n unsubscribed = true;\n this.#plugins.delete(factory);\n this.#unsubscribes.delete(unsubscribe);\n try {\n cleanup();\n } catch (error) {\n logger.error(LOGGER_CONTEXT, \"Error during cleanup:\", error);\n }\n };\n\n this.#unsubscribes.add(unsubscribe);\n\n return unsubscribe;\n }\n\n // Deduplicate batch with warning (validation already done by facade)\n const seenInBatch = this.#deduplicateBatch(factories);\n\n // Track successfully initialized plugins for cleanup\n const initializedPlugins: {\n factory: PluginFactory<Dependencies>;\n cleanup: Unsubscribe;\n }[] = [];\n\n // Initialize deduplicated plugins sequentially\n try {\n for (const plugin of seenInBatch) {\n const cleanup = this.#startPlugin(plugin);\n\n initializedPlugins.push({ factory: plugin, cleanup });\n }\n } catch (error) {\n // Rollback on failure - cleanup all initialized plugins\n for (const { cleanup } of initializedPlugins) {\n try {\n cleanup();\n } catch (cleanupError) {\n logger.error(LOGGER_CONTEXT, \"Cleanup error:\", cleanupError);\n }\n }\n\n throw error;\n }\n\n // Commit phase - add to registry\n for (const { factory } of initializedPlugins) {\n this.#plugins.add(factory);\n }\n\n // Return unsubscribe function\n let unsubscribed = false;\n\n const unsubscribe: Unsubscribe = () => {\n if (unsubscribed) {\n return;\n }\n\n unsubscribed = true;\n this.#unsubscribes.delete(unsubscribe);\n\n for (const { factory } of initializedPlugins) {\n this.#plugins.delete(factory);\n }\n\n for (const { cleanup } of initializedPlugins) {\n try {\n cleanup();\n } catch (error) {\n logger.error(LOGGER_CONTEXT, \"Error during cleanup:\", error);\n }\n }\n };\n\n this.#unsubscribes.add(unsubscribe);\n\n return unsubscribe;\n }\n\n /**\n * Returns registered plugin factories.\n */\n getAll(): PluginFactory<Dependencies>[] {\n return [...this.#plugins];\n }\n\n /**\n * Checks if a plugin factory is registered.\n * Used internally by validation to avoid array allocation.\n */\n has(factory: PluginFactory<Dependencies>): boolean {\n return this.#plugins.has(factory);\n }\n\n disposeAll(): void {\n for (const unsubscribe of this.#unsubscribes) {\n unsubscribe();\n }\n\n this.#plugins.clear();\n this.#unsubscribes.clear();\n }\n\n // =========================================================================\n // Private methods\n // =========================================================================\n\n #checkCountThresholds(newCount: number): void {\n const maxPlugins = this.#limits.maxPlugins;\n\n if (maxPlugins === 0) {\n return;\n }\n\n const totalCount = newCount + this.#plugins.size;\n\n const { warn, error } = computeThresholds(maxPlugins);\n\n if (totalCount >= error) {\n logger.error(LOGGER_CONTEXT, `${totalCount} plugins registered!`);\n } else if (totalCount >= warn) {\n logger.warn(LOGGER_CONTEXT, `${totalCount} plugins registered`);\n }\n }\n\n /**\n * Deduplicates batch with warning for duplicates within batch.\n * Validation (existing duplicates) is done by facade.\n */\n #deduplicateBatch(\n plugins: PluginFactory<Dependencies>[],\n ): Set<PluginFactory<Dependencies>> {\n const seenInBatch = new Set<PluginFactory<Dependencies>>();\n\n for (const plugin of plugins) {\n if (seenInBatch.has(plugin)) {\n logger.warn(\n LOGGER_CONTEXT,\n \"Duplicate factory in batch, will be registered once\",\n );\n } else {\n seenInBatch.add(plugin);\n }\n }\n\n return seenInBatch;\n }\n\n #startPlugin(pluginFactory: PluginFactory<Dependencies>): Unsubscribe {\n // Bind getDependency to preserve 'this' context when called from factory\n // Plugin factories receive full router as part of their public API\n const appliedPlugin = pluginFactory(this.#router, this.#deps.getDependency);\n\n PluginsNamespace.validatePlugin(appliedPlugin);\n\n Object.freeze(appliedPlugin);\n\n // Collect all unsubscribe functions\n const removeEventListeners: Unsubscribe[] = [];\n\n // Subscribe plugin methods to corresponding router events\n for (const methodName of EVENT_METHOD_NAMES) {\n if (methodName in appliedPlugin) {\n if (typeof appliedPlugin[methodName] === \"function\") {\n removeEventListeners.push(\n this.#deps.addEventListener(\n EVENTS_MAP[methodName],\n appliedPlugin[methodName],\n ),\n );\n\n if (methodName === \"onStart\" && this.#deps.canNavigate()) {\n logger.warn(\n LOGGER_CONTEXT,\n \"Router already started, onStart will not be called\",\n );\n }\n } else {\n logger.warn(\n LOGGER_CONTEXT,\n `Property '${methodName}' is not a function, skipping`,\n );\n }\n }\n }\n\n // Return composite cleanup function\n return () => {\n for (const removeListener of removeEventListeners) {\n removeListener();\n }\n\n if (typeof appliedPlugin.teardown === \"function\") {\n appliedPlugin.teardown();\n }\n };\n }\n}\n","// packages/core/src/namespaces/RouteLifecycleNamespace/validators.ts\n\n/**\n * Static validation functions for RouteLifecycleNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { isBoolean, getTypeDescription } from \"type-guards\";\n\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\nimport type { ActivationFnFactory } from \"../../types\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\n/**\n * Validates that a handler is either a boolean or a factory function.\n */\nexport function validateHandler<D extends DefaultDependencies>(\n handler: unknown,\n methodName: string,\n): asserts handler is ActivationFnFactory<D> | boolean {\n if (!isBoolean(handler) && typeof handler !== \"function\") {\n throw new TypeError(\n `[router.${methodName}] Handler must be a boolean or factory function, ` +\n `got ${getTypeDescription(handler)}`,\n );\n }\n}\n\n/**\n * Validates that a route is not currently being registered.\n * Prevents self-modification during factory compilation.\n */\nexport function validateNotRegistering(\n isRegistering: boolean,\n name: string,\n methodName: string,\n): void {\n if (isRegistering) {\n throw new Error(\n `[router.${methodName}] Cannot modify route \"${name}\" during its own registration`,\n );\n }\n}\n\n/**\n * Validates that adding a new handler won't exceed the hard limit.\n */\nexport function validateHandlerLimit(\n currentCount: number,\n methodName: string,\n maxLifecycleHandlers: number = DEFAULT_LIMITS.maxLifecycleHandlers,\n): void {\n if (maxLifecycleHandlers === 0) {\n return;\n }\n\n if (currentCount >= maxLifecycleHandlers) {\n throw new Error(\n `[router.${methodName}] Lifecycle handler limit exceeded (${maxLifecycleHandlers}). ` +\n `This indicates too many routes with individual handlers. ` +\n `Consider using middleware for cross-cutting concerns.`,\n );\n }\n}\n","// packages/core/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { isBoolean, isPromise, getTypeDescription } from \"type-guards\";\n\nimport {\n validateHandler,\n validateHandlerLimit,\n validateNotRegistering,\n} from \"./validators\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\nimport { computeThresholds } from \"../../helpers\";\n\nimport type { RouteLifecycleDependencies } from \"./types\";\nimport type { Router } from \"../../Router\";\nimport type { ActivationFnFactory, Limits } from \"../../types\";\nimport type {\n ActivationFn,\n DefaultDependencies,\n State,\n} from \"@real-router/types\";\n\n/**\n * Converts a boolean value to an activation function factory.\n * Used for the shorthand syntax where true/false is passed instead of a function.\n */\nfunction booleanToFactory<Dependencies extends DefaultDependencies>(\n value: boolean,\n): ActivationFnFactory<Dependencies> {\n const activationFn: ActivationFn = () => value;\n\n return () => activationFn;\n}\n\n/**\n * Independent namespace for managing route lifecycle handlers.\n *\n * Static methods handle input validation (called by facade).\n * Instance methods handle state-dependent validation, storage and business logic.\n */\nexport class RouteLifecycleNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #canDeactivateFactories = new Map<\n string,\n ActivationFnFactory<Dependencies>\n >();\n readonly #canActivateFactories = new Map<\n string,\n ActivationFnFactory<Dependencies>\n >();\n readonly #canDeactivateFunctions = new Map<string, ActivationFn>();\n readonly #canActivateFunctions = new Map<string, ActivationFn>();\n\n readonly #registering = new Set<string>();\n\n #router!: Router<Dependencies>;\n #deps!: RouteLifecycleDependencies<Dependencies>;\n #limits: Limits = DEFAULT_LIMITS;\n\n // =========================================================================\n // Static validation methods (called by facade for input validation)\n // =========================================================================\n\n static validateHandler<D extends DefaultDependencies>(\n handler: unknown,\n methodName: string,\n ): asserts handler is ActivationFnFactory<D> | boolean {\n validateHandler<D>(handler, methodName);\n }\n\n setRouter(router: Router<Dependencies>): void {\n this.#router = router;\n }\n\n setDependencies(deps: RouteLifecycleDependencies<Dependencies>): void {\n this.#deps = deps;\n }\n\n setLimits(limits: Limits): void {\n this.#limits = limits;\n }\n\n // =========================================================================\n // Instance methods\n // =========================================================================\n\n /**\n * Adds a canActivate guard for a route.\n * Handles state-dependent validation, overwrite detection, and registration.\n *\n * @param name - Route name (input-validated by facade)\n * @param handler - Guard function or boolean (input-validated by facade)\n * @param skipValidation - True when called during route config building (#noValidate)\n */\n addCanActivate(\n name: string,\n handler: ActivationFnFactory<Dependencies> | boolean,\n skipValidation: boolean,\n ): void {\n if (!skipValidation) {\n validateNotRegistering(\n this.#registering.has(name),\n name,\n \"addActivateGuard\",\n );\n }\n\n const isOverwrite = this.#canActivateFactories.has(name);\n\n if (!isOverwrite && !skipValidation) {\n validateHandlerLimit(\n this.#canActivateFactories.size + 1,\n \"addActivateGuard\",\n this.#limits.maxLifecycleHandlers,\n );\n }\n\n this.#registerHandler(\n \"activate\",\n name,\n handler,\n this.#canActivateFactories,\n this.#canActivateFunctions,\n \"canActivate\",\n isOverwrite,\n );\n }\n\n /**\n * Adds a canDeactivate guard for a route.\n * Handles state-dependent validation, overwrite detection, and registration.\n *\n * @param name - Route name (input-validated by facade)\n * @param handler - Guard function or boolean (input-validated by facade)\n * @param skipValidation - True when called during route config building (#noValidate)\n */\n addCanDeactivate(\n name: string,\n handler: ActivationFnFactory<Dependencies> | boolean,\n skipValidation: boolean,\n ): void {\n if (!skipValidation) {\n validateNotRegistering(\n this.#registering.has(name),\n name,\n \"addDeactivateGuard\",\n );\n }\n\n const isOverwrite = this.#canDeactivateFactories.has(name);\n\n if (!isOverwrite && !skipValidation) {\n validateHandlerLimit(\n this.#canDeactivateFactories.size + 1,\n \"addDeactivateGuard\",\n this.#limits.maxLifecycleHandlers,\n );\n }\n\n this.#registerHandler(\n \"deactivate\",\n name,\n handler,\n this.#canDeactivateFactories,\n this.#canDeactivateFunctions,\n \"canDeactivate\",\n isOverwrite,\n );\n }\n\n /**\n * Removes a canActivate guard for a route.\n * Input already validated by facade (not registering).\n *\n * @param name - Route name (already validated by facade)\n */\n clearCanActivate(name: string): void {\n this.#canActivateFactories.delete(name);\n this.#canActivateFunctions.delete(name);\n }\n\n /**\n * Removes a canDeactivate guard for a route.\n * Input already validated by facade (not registering).\n *\n * @param name - Route name (already validated by facade)\n */\n clearCanDeactivate(name: string): void {\n this.#canDeactivateFactories.delete(name);\n this.#canDeactivateFunctions.delete(name);\n }\n\n /**\n * Clears all lifecycle handlers (canActivate and canDeactivate).\n * Used by clearRoutes to reset all lifecycle state.\n */\n clearAll(): void {\n this.#canActivateFactories.clear();\n this.#canActivateFunctions.clear();\n this.#canDeactivateFactories.clear();\n this.#canDeactivateFunctions.clear();\n }\n\n /**\n * Returns lifecycle factories as records for cloning.\n *\n * @returns Tuple of [canDeactivateFactories, canActivateFactories]\n */\n getFactories(): [\n Record<string, ActivationFnFactory<Dependencies>>,\n Record<string, ActivationFnFactory<Dependencies>>,\n ] {\n const deactivateRecord: Record<\n string,\n ActivationFnFactory<Dependencies>\n > = {};\n const activateRecord: Record<\n string,\n ActivationFnFactory<Dependencies>\n > = {};\n\n for (const [name, factory] of this.#canDeactivateFactories) {\n deactivateRecord[name] = factory;\n }\n\n for (const [name, factory] of this.#canActivateFactories) {\n activateRecord[name] = factory;\n }\n\n return [deactivateRecord, activateRecord];\n }\n\n /**\n * Returns compiled lifecycle functions for transition execution.\n *\n * @returns Tuple of [canDeactivateFunctions, canActivateFunctions] as Maps\n */\n getFunctions(): [Map<string, ActivationFn>, Map<string, ActivationFn>] {\n return [this.#canDeactivateFunctions, this.#canActivateFunctions];\n }\n\n checkActivateGuardSync(\n name: string,\n toState: State,\n fromState: State | undefined,\n ): boolean {\n return this.#checkGuardSync(\n this.#canActivateFunctions,\n name,\n toState,\n fromState,\n \"checkActivateGuardSync\",\n );\n }\n\n checkDeactivateGuardSync(\n name: string,\n toState: State,\n fromState: State | undefined,\n ): boolean {\n return this.#checkGuardSync(\n this.#canDeactivateFunctions,\n name,\n toState,\n fromState,\n \"checkDeactivateGuardSync\",\n );\n }\n\n // =========================================================================\n // Private methods (business logic)\n // =========================================================================\n\n /**\n * Registers a handler.\n * Handles overwrite warning, count threshold warnings, and factory compilation.\n */\n #registerHandler(\n type: \"activate\" | \"deactivate\",\n name: string,\n handler: ActivationFnFactory<Dependencies> | boolean,\n factories: Map<string, ActivationFnFactory<Dependencies>>,\n functions: Map<string, ActivationFn>,\n methodName: string,\n isOverwrite: boolean,\n ): void {\n // Emit warnings\n if (isOverwrite) {\n logger.warn(\n `router.${methodName}`,\n `Overwriting existing ${type} handler for route \"${name}\"`,\n );\n } else {\n this.#checkCountThresholds(factories.size + 1, methodName);\n }\n\n // Convert boolean to factory if needed\n const factory = isBoolean(handler)\n ? booleanToFactory<Dependencies>(handler)\n : handler;\n\n // Store factory\n factories.set(name, factory);\n\n // Mark route as being registered before calling user factory\n this.#registering.add(name);\n\n try {\n // Lifecycle factories receive full router as part of their public API\n const fn = factory(this.#router, this.#deps.getDependency);\n\n if (typeof fn !== \"function\") {\n throw new TypeError(\n `[router.${methodName}] Factory must return a function, got ${getTypeDescription(fn)}`,\n );\n }\n\n functions.set(name, fn);\n } catch (error) {\n // Rollback on failure to maintain consistency\n factories.delete(name);\n\n throw error;\n } finally {\n this.#registering.delete(name);\n }\n }\n\n #checkGuardSync(\n functions: Map<string, ActivationFn>,\n name: string,\n toState: State,\n fromState: State | undefined,\n methodName: string,\n ): boolean {\n const guardFn = functions.get(name);\n\n if (!guardFn) {\n return true;\n }\n\n try {\n const result = guardFn(toState, fromState);\n\n if (typeof result === \"boolean\") {\n return result;\n }\n\n if (isPromise(result)) {\n logger.warn(\n `router.${methodName}`,\n `Guard for \"${name}\" returned a Promise. Sync check cannot resolve async guards — returning false.`,\n );\n\n return false;\n }\n\n // Guard returned void/State — permissive default\n return true;\n } catch {\n return false;\n }\n }\n\n #checkCountThresholds(currentSize: number, methodName: string): void {\n const maxLifecycleHandlers = this.#limits.maxLifecycleHandlers;\n\n if (maxLifecycleHandlers === 0) {\n return;\n }\n\n const { warn, error } = computeThresholds(maxLifecycleHandlers);\n\n if (currentSize >= error) {\n logger.error(\n `router.${methodName}`,\n `${currentSize} lifecycle handlers registered! ` +\n `This is excessive. Hard limit at ${maxLifecycleHandlers}.`,\n );\n } else if (currentSize >= warn) {\n logger.warn(\n `router.${methodName}`,\n `${currentSize} lifecycle handlers registered. ` +\n `Consider consolidating logic.`,\n );\n }\n }\n}\n","// packages/core/src/namespaces/RoutesNamespace/constants.ts\n\n/**\n * Default route name for the root node.\n */\nexport const DEFAULT_ROUTE_NAME = \"\";\n\n/**\n * Cache for validated route names to skip regex validation on repeated calls.\n * Key insight: validateRouteName() regex takes ~40ns, but cache lookup is ~1ns.\n * This cache is module-level (shared across all router instances) since route name\n * validity is independent of router instance.\n */\nexport const validatedRouteNames = new Set<string>();\n","// packages/core/src/namespaces/RoutesNamespace/helpers.ts\n\nimport { getSegmentsByName } from \"route-tree\";\nimport { getTypeDescription } from \"type-guards\";\n\nimport type { RouteConfig } from \"./types\";\nimport type { Route } from \"../../types\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Params,\n} from \"@real-router/types\";\nimport type { RouteDefinition, RouteTree } from \"route-tree\";\n\n/**\n * Creates an empty RouteConfig.\n */\nexport function createEmptyConfig(): RouteConfig {\n return {\n decoders: Object.create(null) as Record<string, (params: Params) => Params>,\n encoders: Object.create(null) as Record<string, (params: Params) => Params>,\n defaultParams: Object.create(null) as Record<string, Params>,\n forwardMap: Object.create(null) as Record<string, string>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n forwardFnMap: Object.create(null) as Record<string, ForwardToCallback<any>>,\n };\n}\n\n// ============================================================================\n// Route Tree Helpers\n// ============================================================================\n\n/**\n * Checks if all params from source exist with same values in target.\n * Small function body allows V8 inlining.\n */\nexport function paramsMatch(source: Params, target: Params): boolean {\n for (const key in source) {\n if (source[key] !== target[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks params match, skipping keys present in skipKeys.\n */\nexport function paramsMatchExcluding(\n source: Params,\n target: Params,\n skipKeys: Params,\n): boolean {\n for (const key in source) {\n if (key in skipKeys) {\n continue;\n }\n if (source[key] !== target[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Sanitizes a route by keeping only essential properties.\n */\nexport function sanitizeRoute<Dependencies extends DefaultDependencies>(\n route: Route<Dependencies>,\n): RouteDefinition {\n const sanitized: RouteDefinition = {\n name: route.name,\n path: route.path,\n };\n\n if (route.children) {\n sanitized.children = route.children.map((child) => sanitizeRoute(child));\n }\n\n return sanitized;\n}\n\n/**\n * Recursively removes a route from definitions array.\n */\nexport function removeFromDefinitions(\n definitions: RouteDefinition[],\n routeName: string,\n parentPrefix = \"\",\n): boolean {\n for (let i = 0; i < definitions.length; i++) {\n const route = definitions[i];\n const fullName = parentPrefix\n ? `${parentPrefix}.${route.name}`\n : route.name;\n\n if (fullName === routeName) {\n definitions.splice(i, 1);\n\n return true;\n }\n\n if (\n route.children &&\n routeName.startsWith(`${fullName}.`) &&\n removeFromDefinitions(route.children, routeName, fullName)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Clears configuration entries that match the predicate.\n */\nexport function clearConfigEntries<T>(\n config: Record<string, T>,\n matcher: (key: string) => boolean,\n): void {\n for (const key of Object.keys(config)) {\n if (matcher(key)) {\n delete config[key];\n }\n }\n}\n\n// ============================================================================\n// Route Property Validation\n// ============================================================================\n\n/**\n * Validates forwardTo property type and async status.\n */\nfunction validateForwardToProperty(forwardTo: unknown, fullName: string): void {\n if (forwardTo === undefined) {\n return;\n }\n\n if (typeof forwardTo === \"function\") {\n const isNativeAsync =\n (forwardTo as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\";\n const isTranspiledAsync = forwardTo.toString().includes(\"__awaiter\");\n\n if (isNativeAsync || isTranspiledAsync) {\n throw new TypeError(\n `[router.addRoute] forwardTo callback cannot be async for route \"${fullName}\". ` +\n `Async functions break matchPath/buildPath.`,\n );\n }\n }\n}\n\n/**\n * Validates route properties for addRoute.\n * Throws TypeError if any property is invalid.\n *\n * @param route - Route to validate\n * @param fullName - Full route name (with parent prefix)\n * @throws {TypeError} If canActivate/canDeactivate is not a function\n * @throws {TypeError} If defaultParams is not a plain object\n * @throws {TypeError} If decodeParams/encodeParams is async\n */\nexport function validateRouteProperties<\n Dependencies extends DefaultDependencies,\n>(route: Route<Dependencies>, fullName: string): void {\n // Validate canActivate is a function\n if (\n route.canActivate !== undefined &&\n typeof route.canActivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canActivate must be a function for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.canActivate)}`,\n );\n }\n\n // Validate canDeactivate is a function\n if (\n route.canDeactivate !== undefined &&\n typeof route.canDeactivate !== \"function\"\n ) {\n throw new TypeError(\n `[router.addRoute] canDeactivate must be a function for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.canDeactivate)}`,\n );\n }\n\n // Validate defaultParams is a plain object\n // Runtime check for invalid types passed via `as any`\n if (route.defaultParams !== undefined) {\n const params: unknown = route.defaultParams;\n\n if (\n params === null ||\n typeof params !== \"object\" ||\n Array.isArray(params)\n ) {\n throw new TypeError(\n `[router.addRoute] defaultParams must be an object for route \"${fullName}\", ` +\n `got ${getTypeDescription(route.defaultParams)}`,\n );\n }\n }\n\n // Validate decodeParams is not async (sync required for matchPath/buildPath)\n if (route.decodeParams?.constructor.name === \"AsyncFunction\") {\n throw new TypeError(\n `[router.addRoute] decodeParams cannot be async for route \"${fullName}\". Async functions break matchPath/buildPath.`,\n );\n }\n\n // Validate encodeParams is not async (sync required for matchPath/buildPath)\n if (route.encodeParams?.constructor.name === \"AsyncFunction\") {\n throw new TypeError(\n `[router.addRoute] encodeParams cannot be async for route \"${fullName}\". Async functions break matchPath/buildPath.`,\n );\n }\n\n // Validate forwardTo type and async\n validateForwardToProperty(route.forwardTo, fullName);\n\n // Recursively validate children\n if (route.children) {\n for (const child of route.children) {\n const childFullName = `${fullName}.${child.name}`;\n\n validateRouteProperties(child, childFullName);\n }\n }\n}\n\n// ============================================================================\n// ForwardTo Validation\n// ============================================================================\n\n/**\n * Extracts parameter names from a path string.\n * Matches :param and *splat patterns.\n */\nfunction extractParamsFromPath(path: string): Set<string> {\n const params = new Set<string>();\n const paramRegex = /[*:]([A-Z_a-z]\\w*)/g;\n let match;\n\n while ((match = paramRegex.exec(path)) !== null) {\n params.add(match[1]);\n }\n\n return params;\n}\n\n/**\n * Extracts all parameters from multiple path segments.\n */\nfunction extractParamsFromPaths(paths: readonly string[]): Set<string> {\n const params = new Set<string>();\n\n for (const path of paths) {\n for (const param of extractParamsFromPath(path)) {\n params.add(param);\n }\n }\n\n return params;\n}\n\n/**\n * Collects all path segments for a route from batch definitions.\n * Traverses parent routes to include inherited path segments.\n */\nfunction collectPathsToRoute<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n routeName: string,\n parentName = \"\",\n paths: string[] = [],\n): string[] {\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n const currentPaths = [...paths, route.path];\n\n if (fullName === routeName) {\n return currentPaths;\n }\n\n if (route.children && routeName.startsWith(`${fullName}.`)) {\n return collectPathsToRoute(\n route.children,\n routeName,\n fullName,\n currentPaths,\n );\n }\n }\n\n /* v8 ignore next -- @preserve unreachable: callers validate existence */\n throw new Error(\n `[internal] collectPathsToRoute: route \"${routeName}\" not found`,\n );\n}\n\n/**\n * Collects all route names from a batch of routes (including children).\n */\nfunction collectRouteNames<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n): Set<string> {\n const names = new Set<string>();\n\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n names.add(fullName);\n\n if (route.children) {\n for (const childName of collectRouteNames(route.children, fullName)) {\n names.add(childName);\n }\n }\n }\n\n return names;\n}\n\n/**\n * Collects all forwardTo mappings from a batch of routes (including children).\n * Only collects string forwardTo values; callbacks are handled separately.\n */\nfunction collectForwardMappings<Dependencies extends DefaultDependencies>(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n): Map<string, string> {\n const mappings = new Map<string, string>();\n\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n if (route.forwardTo && typeof route.forwardTo === \"string\") {\n mappings.set(fullName, route.forwardTo);\n }\n\n if (route.children) {\n for (const [key, value] of collectForwardMappings(\n route.children,\n fullName,\n )) {\n mappings.set(key, value);\n }\n }\n }\n\n return mappings;\n}\n\n/**\n * Extracts required path parameters from route segments.\n */\nfunction getRequiredParams(segments: readonly RouteTree[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n // Named routes always have parsers (null only for root without path)\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n\n for (const param of segment.paramMeta.spatParams) {\n params.add(param);\n }\n }\n\n return params;\n}\n\n/**\n * Checks if a route exists in the tree by navigating through children Map.\n */\nfunction routeExistsInTree(tree: RouteTree, routeName: string): boolean {\n const segments = routeName.split(\".\");\n let current: RouteTree | undefined = tree;\n\n for (const segment of segments) {\n current = current.children.get(segment);\n\n if (!current) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Gets the target route parameters for validation.\n */\nfunction getTargetParams<Dependencies extends DefaultDependencies>(\n targetRoute: string,\n existsInTree: boolean,\n tree: RouteTree,\n routes: readonly Route<Dependencies>[],\n): Set<string> {\n if (existsInTree) {\n const toSegments = getSegmentsByName(tree, targetRoute);\n\n // toSegments won't be null since we checked existsInTree\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return getRequiredParams(toSegments!);\n }\n\n // Target is in batch\n return extractParamsFromPaths(collectPathsToRoute(routes, targetRoute));\n}\n\n/**\n * Validates a single forward mapping for target existence and param compatibility.\n */\nfunction validateSingleForward<Dependencies extends DefaultDependencies>(\n fromRoute: string,\n targetRoute: string,\n routes: readonly Route<Dependencies>[],\n batchNames: Set<string>,\n tree: RouteTree,\n): void {\n const existsInTree = routeExistsInTree(tree, targetRoute);\n const existsInBatch = batchNames.has(targetRoute);\n\n if (!existsInTree && !existsInBatch) {\n throw new Error(\n `[router.addRoute] forwardTo target \"${targetRoute}\" does not exist ` +\n `for route \"${fromRoute}\"`,\n );\n }\n\n // Get source params\n const fromParams = extractParamsFromPaths(\n collectPathsToRoute(routes, fromRoute),\n );\n\n // Get target params\n const toParams = getTargetParams(targetRoute, existsInTree, tree, routes);\n\n // Check for missing params\n const missingParams = [...toParams].filter((p) => !fromParams.has(p));\n\n if (missingParams.length > 0) {\n throw new Error(\n `[router.addRoute] forwardTo target \"${targetRoute}\" requires params ` +\n `[${missingParams.join(\", \")}] that are not available in source route \"${fromRoute}\"`,\n );\n }\n}\n\n/**\n * Resolves a forwardTo chain to its final destination.\n * Detects cycles and enforces max depth.\n */\nexport function resolveForwardChain(\n startRoute: string,\n forwardMap: Record<string, string>,\n maxDepth = 100,\n): string {\n const visited = new Set<string>();\n const chain: string[] = [startRoute];\n let current = startRoute;\n\n while (forwardMap[current]) {\n const next = forwardMap[current];\n\n if (visited.has(next)) {\n const cycleStart = chain.indexOf(next);\n const cycle = [...chain.slice(cycleStart), next];\n\n throw new Error(`Circular forwardTo: ${cycle.join(\" → \")}`);\n }\n\n visited.add(current);\n chain.push(next);\n current = next;\n\n if (chain.length > maxDepth) {\n throw new Error(\n `forwardTo chain exceeds maximum depth (${maxDepth}): ${chain.join(\" → \")}`,\n );\n }\n }\n\n return current;\n}\n\n/**\n * Validates forwardTo targets and cycles BEFORE any modifications.\n * This ensures atomicity - if validation fails, no routes are added.\n *\n * @param routes - Routes to validate\n * @param existingForwardMap - Current forwardMap from router.config\n * @param tree - Current route tree\n *\n * @throws {Error} If forwardTo target doesn't exist\n * @throws {Error} If circular forwardTo is detected\n */\nexport function validateForwardToTargets<\n Dependencies extends DefaultDependencies,\n>(\n routes: readonly Route<Dependencies>[],\n existingForwardMap: Record<string, string>,\n tree: RouteTree,\n): void {\n const batchNames = collectRouteNames(routes);\n const batchForwards = collectForwardMappings(routes);\n\n // Merge with existing forwardMap for cycle detection\n const combinedForwardMap: Record<string, string> = { ...existingForwardMap };\n\n for (const [from, to] of batchForwards) {\n combinedForwardMap[from] = to;\n }\n\n // Validate each forwardTo target exists and params are compatible\n for (const [fromRoute, targetRoute] of batchForwards) {\n validateSingleForward(fromRoute, targetRoute, routes, batchNames, tree);\n }\n\n // Check for cycles in the combined forwardMap\n for (const fromRoute of Object.keys(combinedForwardMap)) {\n resolveForwardChain(fromRoute, combinedForwardMap);\n }\n}\n","// packages/real-router/modules/core/stateBuilder.ts\n\n/**\n * State Builder Utilities.\n *\n * Functions for building RouteTreeState from raw route segments.\n * This module handles the conversion from low-level route-node data\n * to the higher-level state representation used by real-router.\n *\n * @module core/stateBuilder\n */\n\nimport type { RouteParams, RouteTreeState } from \"route-tree\";\n\n/**\n * Builds a dot-separated route name from segments.\n *\n * @param segments - Array of route segments with names\n * @returns Dot-separated route name (e.g., \"users.profile\")\n *\n * @example\n * ```typescript\n * const segments = [{ name: \"users\" }, { name: \"profile\" }];\n * buildNameFromSegments(segments); // \"users.profile\"\n * ```\n */\nexport function buildNameFromSegments(\n segments: readonly { fullName: string }[],\n): string {\n return segments.at(-1)?.fullName ?? \"\";\n}\n\n/**\n * Creates a RouteTreeState from a match result.\n *\n * This function is the primary way to build a RouteTreeState when\n * you have a result from matcher.match().\n *\n * @param matchResult - Result from matcher.match() containing segments and params\n * @param matchResult.segments - Matched route segments\n * @param matchResult.params - Matched route params\n * @param matchResult.meta - Matched route meta\n * @param name - Optional explicit name (if not provided, built from segments)\n * @returns RouteTreeState with name, params, and meta\n *\n * @example\n * ```typescript\n * const matchResult = matcher.match(\"/users/123\");\n * if (matchResult) {\n * const state = createRouteState(matchResult);\n * // { name: \"users.profile\", params: { id: \"123\" }, meta: {...} }\n * }\n * ```\n */\nexport function createRouteState<P extends RouteParams = RouteParams>(\n matchResult: {\n readonly segments: readonly { fullName: string }[];\n readonly params: Readonly<Record<string, unknown>>;\n readonly meta: Readonly<Record<string, Record<string, \"url\" | \"query\">>>;\n },\n name?: string,\n): RouteTreeState<P> {\n const resolvedName = name ?? buildNameFromSegments(matchResult.segments);\n\n return {\n name: resolvedName,\n params: matchResult.params as P,\n meta: matchResult.meta as Record<string, Record<string, \"url\" | \"query\">>,\n };\n}\n","// packages/core/src/namespaces/RoutesNamespace/validators.ts\n\n/**\n * Static validation functions for RoutesNamespace.\n * Called by Router facade before instance methods.\n *\n * Extracted from RoutesNamespace class for better separation of concerns.\n */\n\nimport { validateRoute } from \"route-tree\";\nimport {\n isString,\n validateRouteName,\n isParams,\n getTypeDescription,\n} from \"type-guards\";\n\nimport { validateRouteProperties, validateForwardToTargets } from \"./helpers\";\n\nimport type { Route, RouteConfigUpdate } from \"../../types\";\nimport type { DefaultDependencies } from \"@real-router/types\";\nimport type { RouteTree } from \"route-tree\";\n\n/**\n * Validates removeRoute arguments.\n */\nexport function validateRemoveRouteArgs(name: unknown): asserts name is string {\n validateRouteName(name, \"removeRoute\");\n}\n\n/**\n * Validates setRootPath arguments.\n */\nexport function validateSetRootPathArgs(\n rootPath: unknown,\n): asserts rootPath is string {\n if (typeof rootPath !== \"string\") {\n throw new TypeError(\n `[router.setRootPath] rootPath must be a string, got ${getTypeDescription(rootPath)}`,\n );\n }\n}\n\n/**\n * Validates addRoute arguments (route structure and properties).\n * State-dependent validation (duplicates, tree) happens in instance method.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Route type\nexport function validateAddRouteArgs(routes: readonly Route<any>[]): void {\n for (const route of routes) {\n // First check if route is an object (before accessing route.name)\n // Runtime check for invalid types passed via `as any`\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime check\n if (route === null || typeof route !== \"object\" || Array.isArray(route)) {\n throw new TypeError(\n `[router.addRoute] Route must be an object, got ${getTypeDescription(route)}`,\n );\n }\n\n // Validate route properties (canActivate, canDeactivate, defaultParams, async checks)\n // Note: validateRouteProperties handles children recursively\n validateRouteProperties(route, route.name);\n }\n}\n\n/**\n * Validates parent option for addRoute.\n */\nexport function validateParentOption(\n parent: unknown,\n): asserts parent is string {\n if (typeof parent !== \"string\" || parent === \"\") {\n throw new TypeError(\n `[router.addRoute] parent option must be a non-empty string, got ${getTypeDescription(parent)}`,\n );\n }\n\n // Validate parent is a valid route name format (can contain dots — it's a fullName reference)\n validateRouteName(parent, \"addRoute\");\n}\n\n/**\n * Validates isActiveRoute arguments.\n */\nexport function validateIsActiveRouteArgs(\n name: unknown,\n params: unknown,\n strictEquality: unknown,\n ignoreQueryParams: unknown,\n): void {\n // Validate name - non-string throws\n if (!isString(name)) {\n throw new TypeError(`Route name must be a string`);\n }\n\n // Validate params if provided\n if (params !== undefined && !isParams(params)) {\n throw new TypeError(`[router.isActiveRoute] Invalid params structure`);\n }\n\n // Validate strictEquality if provided\n if (strictEquality !== undefined && typeof strictEquality !== \"boolean\") {\n throw new TypeError(\n `[router.isActiveRoute] strictEquality must be a boolean, got ${typeof strictEquality}`,\n );\n }\n\n // Validate ignoreQueryParams if provided\n if (\n ignoreQueryParams !== undefined &&\n typeof ignoreQueryParams !== \"boolean\"\n ) {\n throw new TypeError(\n `[router.isActiveRoute] ignoreQueryParams must be a boolean, got ${typeof ignoreQueryParams}`,\n );\n }\n}\n\n/**\n * Validates forwardState/buildState arguments.\n */\nexport function validateStateBuilderArgs(\n routeName: unknown,\n routeParams: unknown,\n methodName: string,\n): void {\n if (!isString(routeName)) {\n throw new TypeError(\n `[router.${methodName}] Invalid routeName: ${getTypeDescription(routeName)}. Expected string.`,\n );\n }\n\n if (!isParams(routeParams)) {\n throw new TypeError(\n `[router.${methodName}] Invalid routeParams: ${getTypeDescription(routeParams)}. Expected plain object.`,\n );\n }\n}\n\n/**\n * Validates updateRoute basic arguments (name and updates object structure).\n * Does NOT read property values to allow caller to cache them first.\n */\nexport function validateUpdateRouteBasicArgs<\n Dependencies extends DefaultDependencies,\n>(\n name: unknown,\n updates: unknown,\n): asserts updates is RouteConfigUpdate<Dependencies> {\n // Validate name\n validateRouteName(name, \"updateRoute\");\n\n if (name === \"\") {\n throw new ReferenceError(\n `[router.updateRoute] Invalid name: empty string. Cannot update root node.`,\n );\n }\n\n // Validate updates is not null\n\n if (updates === null) {\n throw new TypeError(\n `[real-router] updateRoute: updates must be an object, got null`,\n );\n }\n\n // Validate updates is an object (not array)\n if (typeof updates !== \"object\" || Array.isArray(updates)) {\n throw new TypeError(\n `[real-router] updateRoute: updates must be an object, got ${getTypeDescription(updates)}`,\n );\n }\n}\n\n/**\n * Asserts that a function is not async (native or transpiled).\n * Checks both constructor name and toString() for __awaiter pattern.\n */\n/* v8 ignore next 12 -- @preserve: transpiled async (__awaiter) branch tested in addRoute */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type -- needs constructor.name access\nfunction assertNotAsync(value: Function, paramName: string): void {\n if (\n (value as { constructor: { name: string } }).constructor.name ===\n \"AsyncFunction\" ||\n (value as { toString: () => string }).toString().includes(\"__awaiter\")\n ) {\n throw new TypeError(\n `[real-router] updateRoute: ${paramName} cannot be an async function`,\n );\n }\n}\n\n/**\n * Validates that a value is a non-async function, if provided.\n */\nfunction validateFunctionParam(value: unknown, paramName: string): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (typeof value !== \"function\") {\n throw new TypeError(\n `[real-router] updateRoute: ${paramName} must be a function or null, got ${typeof value}`,\n );\n }\n\n assertNotAsync(value, paramName);\n}\n\n/**\n * Validates updateRoute property types using pre-cached values.\n * Called AFTER properties are cached to ensure getters are called only once.\n */\nexport function validateUpdateRoutePropertyTypes(\n forwardTo: unknown,\n defaultParams: unknown,\n decodeParams: unknown,\n encodeParams: unknown,\n): void {\n // Validate forwardTo type (existence check is done by instance method)\n if (forwardTo !== undefined && forwardTo !== null) {\n if (typeof forwardTo !== \"string\" && typeof forwardTo !== \"function\") {\n throw new TypeError(\n `[real-router] updateRoute: forwardTo must be a string, function, or null, got ${getTypeDescription(forwardTo)}`,\n );\n }\n\n if (typeof forwardTo === \"function\") {\n assertNotAsync(forwardTo, \"forwardTo callback\");\n }\n }\n\n // Validate defaultParams\n if (\n defaultParams !== undefined &&\n defaultParams !== null &&\n (typeof defaultParams !== \"object\" || Array.isArray(defaultParams))\n ) {\n throw new TypeError(\n `[real-router] updateRoute: defaultParams must be an object or null, got ${getTypeDescription(defaultParams)}`,\n );\n }\n\n validateFunctionParam(decodeParams, \"decodeParams\");\n validateFunctionParam(encodeParams, \"encodeParams\");\n}\n\n/**\n * Validates buildPath arguments.\n */\nexport function validateBuildPathArgs(route: unknown): asserts route is string {\n if (!isString(route) || route === \"\") {\n throw new TypeError(\n `[real-router] buildPath: route must be a non-empty string, got ${typeof route === \"string\" ? '\"\"' : typeof route}`,\n );\n }\n}\n\n/**\n * Validates matchPath arguments.\n */\nexport function validateMatchPathArgs(path: unknown): asserts path is string {\n if (!isString(path)) {\n throw new TypeError(\n `[real-router] matchPath: path must be a string, got ${typeof path}`,\n );\n }\n}\n\n/**\n * Validates shouldUpdateNode arguments.\n */\nexport function validateShouldUpdateNodeArgs(\n nodeName: unknown,\n): asserts nodeName is string {\n if (!isString(nodeName)) {\n throw new TypeError(\n `[router.shouldUpdateNode] nodeName must be a string, got ${typeof nodeName}`,\n );\n }\n}\n\n/**\n * Validates routes for addition to the router.\n * Checks parent existence, duplicates, and forwardTo targets/cycles.\n *\n * @param routes - Routes to validate\n * @param tree - Current route tree (optional for initial validation)\n * @param forwardMap - Current forward map for cycle detection\n * @param parentName - Optional parent route fullName for nesting via addRoute({ parent })\n */\nexport function validateRoutes<Dependencies extends DefaultDependencies>(\n routes: Route<Dependencies>[],\n tree?: RouteTree,\n forwardMap?: Record<string, string>,\n parentName?: string,\n): void {\n // Validate parent route exists in tree\n if (parentName && tree) {\n let node: RouteTree | undefined = tree;\n\n for (const segment of parentName.split(\".\")) {\n node = node.children.get(segment);\n\n if (!node) {\n throw new Error(\n `[router.addRoute] Parent route \"${parentName}\" does not exist`,\n );\n }\n }\n }\n\n // Tracking sets for duplicate detection\n const seenNames = new Set<string>();\n const seenPathsByParent = new Map<string, Set<string>>();\n\n for (const route of routes) {\n validateRoute(\n route,\n \"addRoute\",\n tree,\n parentName ?? \"\",\n seenNames,\n seenPathsByParent,\n );\n }\n\n if (tree && forwardMap) {\n validateForwardToTargets(routes, forwardMap, tree);\n }\n}\n","// packages/real-router/modules/transitionPath.ts\n\nimport type { Params, State } from \"@real-router/types\";\n\n/**\n * Parameters extracted from a route segment.\n * Maps parameter names to their string values.\n */\ntype SegmentParams = Record<string, string>;\n\n/**\n * Represents a transition path between two router states.\n * Contains information about which route segments need to be activated/deactivated.\n */\ninterface TransitionPath {\n /** The common ancestor route segment where paths diverge */\n intersection: string;\n /** Route segments that need to be deactivated (in reverse order) */\n toDeactivate: string[];\n /** Route segments that need to be activated (in order) */\n toActivate: string[];\n}\n\n// Constants for better maintainability\nconst ROUTE_SEGMENT_SEPARATOR = \".\";\nconst EMPTY_INTERSECTION = \"\";\nconst DEFAULT_ROUTE_NAME = \"\";\n\n/**\n * Builds a reversed copy of a string array.\n * Optimization: single pass instead of creating intermediate array with .toReversed().\n *\n * @param arr - Source array\n * @returns New array with elements in reverse order\n * @internal\n */\nfunction reverseArray(arr: string[]): string[] {\n const len = arr.length;\n const result: string[] = [];\n\n for (let i = len - 1; i >= 0; i--) {\n result.push(arr[i]);\n }\n\n return result;\n}\n\n/**\n * Handles conversion of route names with many segments (5+).\n * Internal helper for nameToIDs function.\n *\n * Uses optimized hybrid approach: split to get segments, then slice original\n * string to build cumulative paths. This approach is 65-81% faster than\n * string concatenation for typical cases (5-10 segments).\n *\n * @param name - Route name with 5 or more segments\n * @returns Array of cumulative segment IDs\n * @throws {Error} If route depth exceeds maximum allowed\n * @internal\n */\nfunction nameToIDsGeneral(name: string): string[] {\n // We know there are at least 5 segments at this point (after fast paths)\n const segments = name.split(ROUTE_SEGMENT_SEPARATOR);\n const segmentCount = segments.length;\n\n // First segment is always just itself\n const ids: string[] = [segments[0]];\n\n // Calculate cumulative lengths and slice from original string\n // This avoids repeated string concatenation (O(k²) → O(k))\n let cumulativeLen = segments[0].length;\n\n for (let i = 1; i < segmentCount - 1; i++) {\n cumulativeLen += 1 + segments[i].length; // +1 for dot separator\n ids.push(name.slice(0, cumulativeLen));\n }\n\n // Last segment is always the full route name\n ids.push(name);\n\n return ids;\n}\n\n/**\n * Extracts segment-specific parameters from a state object.\n * Only includes parameters that are valid for serialization (primitives).\n *\n * @param name - Segment name to extract parameters for\n * @param state - State containing the parameters\n * @returns Object with extracted segment parameters\n */\nfunction extractSegmentParams(name: string, state: State): SegmentParams {\n const keys = state.meta?.params[name];\n\n // No parameters defined for this segment\n if (!keys || typeof keys !== \"object\") {\n return {};\n }\n\n const result: SegmentParams = {};\n\n for (const key in keys as Params) {\n // Skip inherited properties\n if (!Object.hasOwn(keys, key)) {\n continue;\n }\n\n // Skip undefined values for consistent behavior (treat { key: undefined } same as missing key)\n // Edge case: can appear from manual State creation or object merging\n // @ts-expect-error Params type doesn't allow undefined, but it can appear at runtime\n if (keys[key] === undefined) {\n continue;\n }\n\n const value = state.params[key];\n\n // Skip null/undefined values\n if (value == null) {\n continue;\n }\n\n // Only include primitives in segment params comparison.\n // Complex types (arrays, nested objects) are handled by query param serialization.\n // Note: symbol/function/bigint are rejected by isParams validation before reaching this code.\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n result[key] = String(value);\n }\n // Complex types silently skipped - they're serialized as query params elsewhere\n }\n\n return result;\n}\n\n/**\n * Finds the point where two state paths diverge based on segments and parameters.\n * Compares both segment names and their parameters to find the first difference.\n *\n * @param toState - Target state\n * @param fromState - Source state\n * @param toStateIds - Segment IDs for target state\n * @param fromStateIds - Segment IDs for source state\n * @param maxI - Maximum index to check (minimum of both arrays)\n * @returns Index of first difference, or maxI if all checked segments match\n */\nfunction pointOfDifference(\n toState: State,\n fromState: State,\n toStateIds: string[],\n fromStateIds: string[],\n maxI: number,\n): number {\n for (let i = 0; i < maxI; i++) {\n const toSegment = toStateIds[i];\n const fromSegment = fromStateIds[i];\n\n // Different segment names - immediate difference\n if (toSegment !== fromSegment) {\n return i;\n }\n\n // Same segment name - check parameters\n const toParams = extractSegmentParams(toSegment, toState);\n const fromParams = extractSegmentParams(fromSegment, fromState);\n\n // Fast check: different number of parameters\n const toKeys = Object.keys(toParams);\n const fromKeys = Object.keys(fromParams);\n\n if (toKeys.length !== fromKeys.length) {\n return i;\n }\n\n // Detailed check: compare parameter values\n for (const key of toKeys) {\n if (toParams[key] !== fromParams[key]) {\n return i;\n }\n }\n }\n\n return maxI;\n}\n\n/**\n * Converts a route name to an array of hierarchical segment identifiers.\n * Each segment ID includes all parent segments in the path.\n *\n * @param name - Route name in dot notation (e.g., 'users.profile.edit')\n * @returns Array of cumulative segment IDs\n * @throws {Error} If route depth exceeds maximum allowed depth\n *\n * @example\n * // Simple route\n * nameToIDs('users');\n * // Returns: ['users']\n *\n * @example\n * // Nested route\n * nameToIDs('users.profile.edit');\n * // Returns: ['users', 'users.profile', 'users.profile.edit']\n *\n * @example\n * // Empty string (root route)\n * nameToIDs('');\n * // Returns: ['']\n *\n * @remarks\n * Input parameter is NOT validated in this function for performance reasons.\n * Validation significantly slows down nameToIDs execution.\n * The input should be validated by the function/method that calls nameToIDs.\n */\nexport function nameToIDs(name: string): string[] {\n // ===== FAST PATH 1: Empty string (root route) =====\n // Most common in initial navigation\n if (!name) {\n return [DEFAULT_ROUTE_NAME];\n }\n\n // ===== FAST PATH 2: Single segment (no dots) =====\n // Very common: 'home', 'users', 'settings', etc.\n const firstDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR);\n\n if (firstDot === -1) {\n return [name];\n }\n\n // ===== FAST PATH 3: Two segments =====\n // Common: 'users.list', 'admin.dashboard', etc.\n const secondDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR, firstDot + 1);\n\n if (secondDot === -1) {\n return [\n name.slice(0, firstDot), // 'users'\n name, // 'users.list'\n ];\n }\n\n // ===== FAST PATH 4: Three segments =====\n // Common: 'users.profile.edit', 'app.settings.general', etc.\n const thirdDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR, secondDot + 1);\n\n if (thirdDot === -1) {\n return [\n name.slice(0, firstDot), // 'users'\n name.slice(0, secondDot), // 'users.profile'\n name, // 'users.profile.edit'\n ];\n }\n\n // ===== FAST PATH 5: Four segments =====\n const fourthDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR, thirdDot + 1);\n\n if (fourthDot === -1) {\n return [\n name.slice(0, firstDot),\n name.slice(0, secondDot),\n name.slice(0, thirdDot),\n name,\n ];\n }\n\n // ===== STANDARD PATH: 5+ segments =====\n // Less common, use general algorithm with optimizations\n return nameToIDsGeneral(name);\n}\n\n/**\n * Calculates the transition path between two router states.\n * Determines which route segments need to be deactivated and activated\n * to transition from one state to another.\n *\n * @param toState - Target state to transition to\n * @param fromState - Current state to transition from (optional)\n * @returns Transition path with intersection and segments to activate/deactivate\n *\n * @throws {TypeError} When toState is null or undefined\n * @throws {TypeError} When toState is not an object\n * @throws {TypeError} When toState.name is missing or not a string\n * @throws {TypeError} When toState.params is missing or not an object\n * @throws {TypeError} When toState.path is missing or not a string\n * @throws {TypeError} When toState.name contains invalid route format:\n * - Contains only whitespace (e.g., \" \")\n * - Has consecutive dots (e.g., \"users..profile\")\n * - Has leading/trailing dots (e.g., \".users\" or \"users.\")\n * - Segments don't match pattern [a-zA-Z_][a-zA-Z0-9_-]* (e.g., \"users.123\")\n * - Contains spaces or special characters (e.g., \"users profile\")\n * - Exceeds maximum length (8192 characters)\n * @throws {TypeError} When fromState is provided and has any of the validation errors listed above for toState\n *\n * @example\n * // ✅ Valid calls\n * getTransitionPath({ name: 'users.profile', params: {}, path: '/users/profile' });\n * getTransitionPath(toState, fromState);\n * getTransitionPath({ name: '', params: {}, path: '/' }); // root route\n *\n * @example\n * // ❌ Invalid calls that throw TypeError\n * getTransitionPath(null); // toState is null\n * getTransitionPath(undefined); // toState is undefined\n * getTransitionPath({}); // missing required fields\n * getTransitionPath({ name: 123, params: {}, path: '/' }); // name not a string\n * getTransitionPath({ name: 'home', path: '/' }); // missing params\n * getTransitionPath({ name: 'users..profile', params: {}, path: '/' }); // consecutive dots\n * getTransitionPath({ name: '.users', params: {}, path: '/' }); // leading dot\n * getTransitionPath({ name: 'users.', params: {}, path: '/' }); // trailing dot\n * getTransitionPath({ name: 'users profile', params: {}, path: '/' }); // contains space\n * getTransitionPath({ name: 'users.123', params: {}, path: '/' }); // segment starts with number\n * getTransitionPath(validToState, { name: 'invalid..route', params: {}, path: '/' }); // fromState invalid\n *\n * @example\n * // Full activation (no fromState)\n * getTransitionPath(makeState('users.profile'));\n * // Returns: {\n * // intersection: '',\n * // toActivate: ['users', 'users.profile'],\n * // toDeactivate: []\n * // }\n *\n * @example\n * // Partial transition with common ancestor\n * getTransitionPath(\n * makeState('users.profile'),\n * makeState('users.list')\n * );\n * // Returns: {\n * // intersection: 'users',\n * // toActivate: ['users.profile'],\n * // toDeactivate: ['users.list']\n * // }\n *\n * @example\n * // Complete route change\n * getTransitionPath(\n * makeState('admin.dashboard'),\n * makeState('users.profile')\n * );\n * // Returns: {\n * // intersection: '',\n * // toActivate: ['admin', 'admin.dashboard'],\n * // toDeactivate: ['users.profile', 'users']\n * // }\n */\nexport function getTransitionPath(\n toState: State,\n fromState?: State,\n): TransitionPath {\n // ===== FAST PATH 1: Initial navigation (no fromState) =====\n // This is the best performing case in benchmarks (5M ops/sec)\n if (!fromState) {\n return {\n intersection: EMPTY_INTERSECTION,\n toActivate: nameToIDs(toState.name),\n toDeactivate: [],\n };\n }\n\n const toStateOptions = toState.meta?.options ?? {};\n\n // ===== FAST PATH 2: Force reload =====\n // Skip all optimization when reload is requested\n if (toStateOptions.reload) {\n return {\n intersection: EMPTY_INTERSECTION,\n toActivate: nameToIDs(toState.name),\n toDeactivate: reverseArray(nameToIDs(fromState.name)),\n };\n }\n\n // ===== FAST PATH 3: Missing meta or meta.params requires full reload =====\n // Check if meta or meta.params is actually missing (not just empty)\n const toHasMeta = toState.meta?.params !== undefined;\n const fromHasMeta = fromState.meta?.params !== undefined;\n\n if (!toHasMeta && !fromHasMeta) {\n // Both states missing meta.params - require full reload\n return {\n intersection: EMPTY_INTERSECTION,\n toActivate: nameToIDs(toState.name),\n toDeactivate: reverseArray(nameToIDs(fromState.name)),\n };\n }\n\n // ===== FAST PATH 4: Same routes with empty meta.params =====\n // If both have empty meta.params {}, no parameter checking needed\n if (toState.name === fromState.name && toHasMeta && fromHasMeta) {\n const toParamsEmpty =\n toState.meta && Object.keys(toState.meta.params).length === 0;\n const fromParamsEmpty =\n fromState.meta && Object.keys(fromState.meta.params).length === 0;\n\n if (toParamsEmpty && fromParamsEmpty) {\n // Both have empty params - no transition needed\n return {\n intersection: toState.name,\n toActivate: [],\n toDeactivate: [],\n };\n }\n }\n\n // ===== STANDARD PATH: Routes with parameters =====\n // Use original algorithm for complex cases with parameters\n const toStateIds = nameToIDs(toState.name);\n const fromStateIds = nameToIDs(fromState.name);\n const maxI = Math.min(fromStateIds.length, toStateIds.length);\n\n // Find where paths diverge based on segments and parameters\n // not obvious validate toState and fromState\n const i = pointOfDifference(\n toState,\n fromState,\n toStateIds,\n fromStateIds,\n maxI,\n );\n\n // Optimization: Build deactivation list in reverse order directly\n // instead of slice(i).toReversed() which creates 2 arrays\n const toDeactivate: string[] = [];\n\n for (let j = fromStateIds.length - 1; j >= i; j--) {\n toDeactivate.push(fromStateIds[j]);\n }\n\n // Build activation list (forward order for proper initialization)\n const toActivate = toStateIds.slice(i);\n\n // Determine intersection point (common ancestor)\n // Note: fromState is guaranteed to be defined here (early return on line 366)\n const intersection = i > 0 ? fromStateIds[i - 1] : EMPTY_INTERSECTION;\n\n return {\n intersection,\n toDeactivate,\n toActivate,\n };\n}\n","// packages/core/src/namespaces/RoutesNamespace/RoutesNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\nimport {\n createMatcher,\n createRouteTree,\n nodeToDefinition,\n routeTreeToDefinitions,\n} from \"route-tree\";\nimport { isString, validateRouteName } from \"type-guards\";\n\nimport { DEFAULT_ROUTE_NAME, validatedRouteNames } from \"./constants\";\nimport {\n clearConfigEntries,\n createEmptyConfig,\n paramsMatch,\n paramsMatchExcluding,\n removeFromDefinitions,\n resolveForwardChain,\n sanitizeRoute,\n} from \"./helpers\";\nimport { createRouteState } from \"./stateBuilder\";\nimport {\n validateRemoveRouteArgs,\n validateSetRootPathArgs,\n validateAddRouteArgs,\n validateParentOption,\n validateIsActiveRouteArgs,\n validateStateBuilderArgs,\n validateUpdateRouteBasicArgs,\n validateUpdateRoutePropertyTypes,\n validateBuildPathArgs,\n validateMatchPathArgs,\n validateShouldUpdateNodeArgs,\n validateRoutes,\n} from \"./validators\";\nimport { constants } from \"../../constants\";\nimport { getTransitionPath } from \"../../transitionPath\";\n\nimport type { RouteConfig, RoutesDependencies } from \"./types\";\nimport type {\n ActivationFnFactory,\n BuildStateResultWithSegments,\n Route,\n RouteConfigUpdate,\n} from \"../../types\";\nimport type { RouteLifecycleNamespace } from \"../RouteLifecycleNamespace\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Options,\n Params,\n State,\n} from \"@real-router/types\";\nimport type {\n CreateMatcherOptions,\n Matcher,\n RouteDefinition,\n RouteTree,\n RouteTreeState,\n} from \"route-tree\";\n\nconst EMPTY_OPTIONS = Object.freeze({});\n\n/**\n * Independent namespace for managing routes.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic.\n */\nexport class RoutesNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n // =========================================================================\n // Private instance fields\n // =========================================================================\n\n readonly #definitions: RouteDefinition[] = [];\n readonly #config: RouteConfig = createEmptyConfig();\n readonly #resolvedForwardMap: Record<string, string> = Object.create(\n null,\n ) as Record<string, string>;\n\n // Pending canActivate handlers that need to be registered after router is set\n // Key: route name, Value: canActivate factory\n readonly #pendingCanActivate = new Map<\n string,\n ActivationFnFactory<Dependencies>\n >();\n\n // Pending canDeactivate handlers that need to be registered after router is set\n // Key: route name, Value: canDeactivate factory\n readonly #pendingCanDeactivate = new Map<\n string,\n ActivationFnFactory<Dependencies>\n >();\n\n #rootPath = \"\";\n #tree: RouteTree;\n #matcher: Matcher;\n readonly #matcherOptions: CreateMatcherOptions | undefined;\n\n // Dependencies injected via setDependencies (for facade method calls)\n #depsStore: RoutesDependencies<Dependencies> | undefined;\n\n // Lifecycle handlers reference (set after construction)\n #lifecycleNamespace!: RouteLifecycleNamespace<Dependencies>;\n\n // When true, skips validation for production performance\n readonly #noValidate: boolean;\n\n /**\n * Gets dependencies or throws if not initialized.\n */\n get #deps(): RoutesDependencies<Dependencies> {\n /* v8 ignore next 3 -- @preserve: defensive guard, unreachable via public API (RouterWiringBuilder always calls setDependencies) */\n if (!this.#depsStore) {\n throw new Error(\n \"[real-router] RoutesNamespace: dependencies not initialized\",\n );\n }\n\n return this.#depsStore;\n }\n\n // =========================================================================\n // Constructor\n // =========================================================================\n\n constructor(\n routes: Route<Dependencies>[] = [],\n noValidate = false,\n matcherOptions?: CreateMatcherOptions,\n ) {\n this.#noValidate = noValidate;\n this.#matcherOptions = matcherOptions;\n\n // Sanitize routes to store only essential properties\n for (const route of routes) {\n this.#definitions.push(sanitizeRoute(route));\n }\n\n // Create initial tree\n this.#tree = createRouteTree(\n DEFAULT_ROUTE_NAME,\n this.#rootPath,\n this.#definitions,\n );\n\n // Initialize matcher with options and register tree\n this.#matcher = createMatcher(matcherOptions);\n this.#matcher.registerTree(this.#tree);\n\n // Register handlers for all routes (defaultParams, encoders, decoders, forwardTo)\n // Note: canActivate handlers are registered later when #lifecycleNamespace is set\n this.#registerAllRouteHandlers(routes);\n\n // Validate and cache forwardTo chains (detect cycles)\n // Skip validation in noValidate mode for production performance\n if (noValidate) {\n // Still need to cache resolved forwards, just skip validation\n this.#cacheForwardMap();\n } else {\n this.#validateAndCacheForwardMap();\n }\n }\n\n // =========================================================================\n // Static validation methods (delegated to validators.ts)\n // TypeScript requires explicit method declarations for assertion functions\n // =========================================================================\n\n static validateRemoveRouteArgs(name: unknown): asserts name is string {\n validateRemoveRouteArgs(name);\n }\n\n static validateSetRootPathArgs(\n rootPath: unknown,\n ): asserts rootPath is string {\n validateSetRootPathArgs(rootPath);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- accepts any Route type\n static validateAddRouteArgs(routes: readonly Route<any>[]): void {\n validateAddRouteArgs(routes);\n }\n\n static validateParentOption(parent: unknown): asserts parent is string {\n validateParentOption(parent);\n }\n\n static validateIsActiveRouteArgs(\n name: unknown,\n params: unknown,\n strictEquality: unknown,\n ignoreQueryParams: unknown,\n ): void {\n validateIsActiveRouteArgs(name, params, strictEquality, ignoreQueryParams);\n }\n\n static validateStateBuilderArgs(\n routeName: unknown,\n routeParams: unknown,\n methodName: string,\n ): void {\n validateStateBuilderArgs(routeName, routeParams, methodName);\n }\n\n static validateUpdateRouteBasicArgs<Deps extends DefaultDependencies>(\n name: unknown,\n updates: unknown,\n ): asserts updates is RouteConfigUpdate<Deps> {\n validateUpdateRouteBasicArgs<Deps>(name, updates);\n }\n\n static validateUpdateRoutePropertyTypes(\n forwardTo: unknown,\n defaultParams: unknown,\n decodeParams: unknown,\n encodeParams: unknown,\n ): void {\n validateUpdateRoutePropertyTypes(\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n );\n }\n\n static validateBuildPathArgs(route: unknown): asserts route is string {\n validateBuildPathArgs(route);\n }\n\n static validateMatchPathArgs(path: unknown): asserts path is string {\n validateMatchPathArgs(path);\n }\n\n static validateShouldUpdateNodeArgs(\n nodeName: unknown,\n ): asserts nodeName is string {\n validateShouldUpdateNodeArgs(nodeName);\n }\n\n static validateRoutes<Deps extends DefaultDependencies>(\n routes: Route<Deps>[],\n tree?: RouteTree,\n forwardMap?: Record<string, string>,\n parentName?: string,\n ): void {\n validateRoutes(routes, tree, forwardMap, parentName);\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n /**\n * Sets dependencies and registers pending canActivate handlers.\n * canActivate handlers from initial routes are deferred until deps are set.\n */\n setDependencies(deps: RoutesDependencies<Dependencies>): void {\n this.#depsStore = deps;\n\n // Register pending canActivate handlers that were deferred during construction\n for (const [routeName, handler] of this.#pendingCanActivate) {\n deps.addActivateGuard(routeName, handler);\n }\n\n // Clear pending handlers after registration\n this.#pendingCanActivate.clear();\n\n // Register pending canDeactivate handlers that were deferred during construction\n for (const [routeName, handler] of this.#pendingCanDeactivate) {\n deps.addDeactivateGuard(routeName, handler);\n }\n\n // Clear pending handlers after registration\n this.#pendingCanDeactivate.clear();\n }\n\n /**\n * Sets the lifecycle namespace reference.\n */\n setLifecycleNamespace(\n namespace: RouteLifecycleNamespace<Dependencies> | undefined,\n ): void {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#lifecycleNamespace = namespace!;\n }\n\n // =========================================================================\n // Route tree operations\n // =========================================================================\n\n /**\n * Returns the root path.\n */\n getRootPath(): string {\n return this.#rootPath;\n }\n\n /**\n * Returns the route tree.\n * Used by facade for state-dependent validation.\n */\n getTree(): RouteTree {\n return this.#tree;\n }\n\n /**\n * Returns the forward record (route name -> forward target).\n * Used by facade for state-dependent validation.\n */\n getForwardRecord(): Record<string, string> {\n return this.#config.forwardMap;\n }\n\n /**\n * Sets the root path and rebuilds the tree.\n */\n setRootPath(newRootPath: string): void {\n this.#rootPath = newRootPath;\n this.#rebuildTree();\n }\n\n /**\n * Checks if a route exists.\n */\n hasRoute(name: string): boolean {\n return this.#matcher.hasRoute(name);\n }\n\n /**\n * Gets a route by name with all its configuration.\n */\n getRoute(name: string): Route<Dependencies> | undefined {\n const segments = this.#matcher.getSegmentsByName(name);\n\n if (!segments) {\n return undefined;\n }\n\n const targetNode = this.#getLastSegment(segments as readonly RouteTree[]);\n const definition = nodeToDefinition(targetNode);\n\n return this.#enrichRoute(definition, name);\n }\n\n /**\n * Adds one or more routes to the router.\n * Input already validated by facade (properties and state-dependent checks).\n *\n * @param routes - Routes to add\n * @param parentName - Optional parent route fullName for nesting\n */\n addRoutes(routes: Route<Dependencies>[], parentName?: string): void {\n // Add to definitions\n if (parentName) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const parentDef = this.#findDefinition(this.#definitions, parentName)!;\n\n parentDef.children ??= [];\n for (const route of routes) {\n parentDef.children.push(sanitizeRoute(route));\n }\n } else {\n for (const route of routes) {\n this.#definitions.push(sanitizeRoute(route));\n }\n }\n\n // Register handlers\n this.#registerAllRouteHandlers(routes, parentName ?? \"\");\n\n // Rebuild tree\n this.#rebuildTree();\n\n // Validate and cache forwardTo chains\n this.#refreshForwardMap();\n }\n\n /**\n * Removes a route and all its children.\n *\n * @param name - Route name (already validated)\n * @returns true if removed, false if not found\n */\n removeRoute(name: string): boolean {\n const wasRemoved = removeFromDefinitions(this.#definitions, name);\n\n if (!wasRemoved) {\n return false;\n }\n\n // Clear configurations for removed route\n this.#clearRouteConfigurations(name);\n\n // Rebuild tree\n this.#rebuildTree();\n\n // Revalidate forward chains\n this.#refreshForwardMap();\n\n return true;\n }\n\n /**\n * Updates a route's configuration in place without rebuilding the tree.\n * This is used by Router.updateRoute to directly modify config entries\n * without destroying other routes' forwardMap references.\n *\n * @param name - Route name\n * @param updates - Config updates to apply\n * @param updates.forwardTo - Forward target route name (null to clear)\n * @param updates.defaultParams - Default parameters (null to clear)\n * @param updates.decodeParams - Params decoder function (null to clear)\n * @param updates.encodeParams - Params encoder function (null to clear)\n */\n\n updateRouteConfig(\n name: string,\n updates: {\n forwardTo?: string | ForwardToCallback<Dependencies> | null | undefined;\n defaultParams?: Params | null | undefined;\n decodeParams?: ((params: Params) => Params) | null | undefined;\n encodeParams?: ((params: Params) => Params) | null | undefined;\n },\n ): void {\n // Update forwardTo\n if (updates.forwardTo !== undefined) {\n this.#updateForwardTo(name, updates.forwardTo);\n }\n\n // Update defaultParams\n if (updates.defaultParams !== undefined) {\n if (updates.defaultParams === null) {\n delete this.#config.defaultParams[name];\n } else {\n this.#config.defaultParams[name] = updates.defaultParams;\n }\n }\n\n // Update decoders with fallback wrapper\n // Runtime guard: fallback to params if decoder returns undefined (bad user code)\n if (updates.decodeParams !== undefined) {\n if (updates.decodeParams === null) {\n delete this.#config.decoders[name];\n } else {\n const decoder = updates.decodeParams;\n\n this.#config.decoders[name] = (params: Params): Params =>\n (decoder(params) as Params | undefined) ?? params;\n }\n }\n\n // Update encoders with fallback wrapper\n // Runtime guard: fallback to params if encoder returns undefined (bad user code)\n if (updates.encodeParams !== undefined) {\n if (updates.encodeParams === null) {\n delete this.#config.encoders[name];\n } else {\n const encoder = updates.encodeParams;\n\n this.#config.encoders[name] = (params: Params): Params =>\n (encoder(params) as Params | undefined) ?? params;\n }\n }\n }\n\n /**\n * Clears all routes from the router.\n */\n clearRoutes(): void {\n this.#definitions.length = 0;\n\n // Clear all config entries\n for (const key in this.#config.decoders) {\n delete this.#config.decoders[key];\n }\n\n for (const key in this.#config.encoders) {\n delete this.#config.encoders[key];\n }\n\n for (const key in this.#config.defaultParams) {\n delete this.#config.defaultParams[key];\n }\n\n for (const key in this.#config.forwardMap) {\n delete this.#config.forwardMap[key];\n }\n\n for (const key in this.#config.forwardFnMap) {\n delete this.#config.forwardFnMap[key];\n }\n\n // Clear forward cache\n for (const key in this.#resolvedForwardMap) {\n delete this.#resolvedForwardMap[key];\n }\n\n // Rebuild empty tree\n this.#rebuildTree();\n }\n\n // =========================================================================\n // Path operations\n // =========================================================================\n\n /**\n * Builds a URL path for a route.\n * Note: Argument validation is done by facade (Router.ts) via validateBuildPathArgs.\n *\n * @param route - Route name\n * @param params - Route parameters\n * @param options - Router options\n */\n buildPath(route: string, params?: Params, options?: Options): string {\n if (route === constants.UNKNOWN_ROUTE) {\n return isString(params?.path) ? params.path : \"\";\n }\n\n // R2 optimization: avoid spread when no defaultParams\n const paramsWithDefault = Object.hasOwn(this.#config.defaultParams, route)\n ? { ...this.#config.defaultParams[route], ...params }\n : (params ?? {});\n\n // Apply custom encoder if defined\n const encodedParams =\n typeof this.#config.encoders[route] === \"function\"\n ? this.#config.encoders[route]({ ...paramsWithDefault })\n : paramsWithDefault;\n\n // Map core trailingSlash to matcher: \"preserve\"/\"strict\" → default (no change)\n const ts = options?.trailingSlash;\n const trailingSlash = ts === \"never\" || ts === \"always\" ? ts : undefined;\n\n return this.#matcher.buildPath(route, encodedParams, {\n trailingSlash,\n queryParamsMode: options?.queryParamsMode,\n });\n }\n\n /**\n * Matches a URL path to a route in the tree.\n * Note: Argument validation is done by facade (Router.ts) via validateMatchPathArgs.\n */\n matchPath<P extends Params = Params, MP extends Params = Params>(\n path: string,\n options?: Options,\n ): State<P, MP> | undefined {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Router.ts always passes options\n const opts = options!;\n\n const matchResult = this.#matcher.match(path);\n\n if (!matchResult) {\n return undefined;\n }\n\n const routeState = createRouteState(matchResult);\n const { name, params, meta } = routeState;\n\n const decodedParams =\n typeof this.#config.decoders[name] === \"function\"\n ? this.#config.decoders[name](params as Params)\n : params;\n\n const { name: routeName, params: routeParams } = this.#deps.forwardState<P>(\n name,\n decodedParams as P,\n );\n\n let builtPath = path;\n\n if (opts.rewritePathOnMatch) {\n const buildParams =\n typeof this.#config.encoders[routeName] === \"function\"\n ? this.#config.encoders[routeName]({\n ...(routeParams as Params),\n })\n : (routeParams as Record<string, unknown>);\n\n const ts = opts.trailingSlash;\n\n builtPath = this.#matcher.buildPath(routeName, buildParams, {\n trailingSlash: ts === \"never\" || ts === \"always\" ? ts : undefined,\n queryParamsMode: opts.queryParamsMode,\n });\n }\n\n return this.#deps.makeState<P, MP>(routeName, routeParams, builtPath, {\n params: meta as MP,\n options: EMPTY_OPTIONS,\n });\n }\n\n /**\n * Applies forwardTo and returns resolved state with merged defaultParams.\n *\n * Merges params in order:\n * 1. Source route defaultParams\n * 2. Provided params\n * 3. Target route defaultParams (after resolving forwardTo)\n */\n forwardState<P extends Params = Params>(\n name: string,\n params: P,\n ): { name: string; params: P } {\n // Path 1: Dynamic forward\n if (Object.hasOwn(this.#config.forwardFnMap, name)) {\n const paramsWithSourceDefaults = this.#mergeDefaultParams(name, params);\n const dynamicForward = this.#config.forwardFnMap[name];\n const resolved = this.#resolveDynamicForward(\n name,\n dynamicForward,\n params,\n );\n\n return {\n name: resolved,\n params: this.#mergeDefaultParams(resolved, paramsWithSourceDefaults),\n };\n }\n\n // Path 2: Static forward (O(1) cached)\n const staticForward = this.#resolvedForwardMap[name] ?? name;\n\n // Path 3: Mixed chain (static target has dynamic forward)\n if (\n staticForward !== name &&\n Object.hasOwn(this.#config.forwardFnMap, staticForward)\n ) {\n const paramsWithSourceDefaults = this.#mergeDefaultParams(name, params);\n const targetDynamicForward = this.#config.forwardFnMap[staticForward];\n const resolved = this.#resolveDynamicForward(\n staticForward,\n targetDynamicForward,\n params,\n );\n\n return {\n name: resolved,\n params: this.#mergeDefaultParams(resolved, paramsWithSourceDefaults),\n };\n }\n\n // Path 4: Static forward only\n if (staticForward !== name) {\n const paramsWithSourceDefaults = this.#mergeDefaultParams(name, params);\n\n return {\n name: staticForward,\n params: this.#mergeDefaultParams(\n staticForward,\n paramsWithSourceDefaults,\n ),\n };\n }\n\n // No forward - merge own defaults\n return { name, params: this.#mergeDefaultParams(name, params) };\n }\n\n /**\n * Builds a RouteTreeState from already-resolved route name and params.\n * Called by Router.buildState after forwardState is applied at facade level.\n * This allows plugins to intercept forwardState.\n */\n buildStateResolved(\n resolvedName: string,\n resolvedParams: Params,\n ): RouteTreeState | undefined {\n const segments = this.#matcher.getSegmentsByName(resolvedName);\n\n if (!segments) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const meta = this.#matcher.getMetaByName(resolvedName)!;\n\n return createRouteState(\n { segments, params: resolvedParams, meta },\n resolvedName,\n );\n }\n\n /**\n * Builds a RouteTreeState with segments from already-resolved route name and params.\n * Called by Router.buildStateWithSegments after forwardState is applied at facade level.\n * This allows plugins to intercept forwardState.\n */\n buildStateWithSegmentsResolved<P extends Params = Params>(\n resolvedName: string,\n resolvedParams: P,\n ): BuildStateResultWithSegments<P> | undefined {\n const segments = this.#matcher.getSegmentsByName(resolvedName);\n\n if (!segments) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const meta = this.#matcher.getMetaByName(resolvedName)!;\n const state = createRouteState<P>(\n {\n segments: segments as readonly RouteTree[],\n params: resolvedParams,\n meta,\n },\n resolvedName,\n );\n\n return { state, segments: segments as readonly RouteTree[] };\n }\n\n // =========================================================================\n // Query operations\n // =========================================================================\n\n /**\n * Checks if a route is currently active.\n */\n isActiveRoute(\n name: string,\n params: Params = {},\n strictEquality = false,\n ignoreQueryParams = true,\n ): boolean {\n // Fast path: skip regex validation for already-validated route names\n if (!validatedRouteNames.has(name)) {\n validateRouteName(name, \"isActiveRoute\");\n validatedRouteNames.add(name);\n }\n\n // Note: empty string check is handled by Router.ts facade\n const activeState = this.#deps.getState();\n\n if (!activeState) {\n return false;\n }\n\n const activeName = activeState.name;\n\n // Fast path: check if routes are related before expensive operations\n if (\n activeName !== name &&\n !activeName.startsWith(`${name}.`) &&\n !name.startsWith(`${activeName}.`)\n ) {\n return false;\n }\n\n const defaultParams = this.#config.defaultParams[name] as\n | Params\n | undefined;\n\n // Exact match case\n if (strictEquality || activeName === name) {\n const effectiveParams = defaultParams\n ? { ...defaultParams, ...params }\n : params;\n\n const targetState: State = {\n name,\n params: effectiveParams,\n path: \"\",\n };\n\n return this.#deps.areStatesEqual(\n targetState,\n activeState,\n ignoreQueryParams,\n );\n }\n\n // Hierarchical check: activeState is a descendant of target (name)\n const activeParams = activeState.params;\n\n if (!paramsMatch(params, activeParams)) {\n return false;\n }\n\n // Check defaultParams (skip keys already in params)\n return (\n !defaultParams ||\n paramsMatchExcluding(defaultParams, activeParams, params)\n );\n }\n\n /**\n * Creates a predicate function to check if a route node should be updated.\n * Note: Argument validation is done by facade (Router.ts) via validateShouldUpdateNodeArgs.\n */\n shouldUpdateNode(\n nodeName: string,\n ): (toState: State, fromState?: State) => boolean {\n return (toState: State, fromState?: State): boolean => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!(toState && typeof toState === \"object\" && \"name\" in toState)) {\n throw new TypeError(\n \"[router.shouldUpdateNode] toState must be valid State object\",\n );\n }\n\n if (toState.meta?.options.reload) {\n return true;\n }\n\n if (nodeName === DEFAULT_ROUTE_NAME && !fromState) {\n return true;\n }\n\n const { intersection, toActivate, toDeactivate } = getTransitionPath(\n toState,\n fromState,\n );\n\n if (nodeName === intersection) {\n return true;\n }\n\n if (toActivate.includes(nodeName)) {\n return true;\n }\n\n return toDeactivate.includes(nodeName);\n };\n }\n\n /**\n * Returns the config object.\n */\n getConfig(): RouteConfig {\n return this.#config;\n }\n\n /**\n * Returns URL params for a route.\n * Used by StateNamespace.\n */\n getUrlParams(name: string): string[] {\n const segments = this.#matcher.getSegmentsByName(name);\n\n if (!segments) {\n return [];\n }\n\n return this.#collectUrlParamsArray(segments as readonly RouteTree[]);\n }\n\n /**\n * Returns the resolved forward map.\n */\n getResolvedForwardMap(): Record<string, string> {\n return this.#resolvedForwardMap;\n }\n\n /**\n * Sets resolved forward map (used by clone).\n */\n setResolvedForwardMap(map: Record<string, string>): void {\n Object.assign(this.#resolvedForwardMap, map);\n }\n\n /**\n * Applies cloned route config from source router.\n * Used by clone to copy decoders, encoders, defaultParams, forwardMap,\n * forwardFnMap and resolvedForwardMap into this namespace's config.\n */\n applyClonedConfig(\n config: RouteConfig,\n resolvedForwardMap: Record<string, string>,\n ): void {\n Object.assign(this.#config.decoders, config.decoders);\n Object.assign(this.#config.encoders, config.encoders);\n Object.assign(this.#config.defaultParams, config.defaultParams);\n Object.assign(this.#config.forwardMap, config.forwardMap);\n Object.assign(this.#config.forwardFnMap, config.forwardFnMap);\n this.setResolvedForwardMap({ ...resolvedForwardMap });\n }\n\n /**\n * Creates a clone of the routes for a new router (from tree).\n */\n cloneRoutes(): Route<Dependencies>[] {\n return routeTreeToDefinitions(this.#tree) as Route<Dependencies>[];\n }\n\n // =========================================================================\n // Public validation methods (used by Router facade)\n // =========================================================================\n\n /**\n * Validates that forwardTo target doesn't require params that source doesn't have.\n * Used by updateRoute for forwardTo validation.\n */\n validateForwardToParamCompatibility(\n sourceName: string,\n targetName: string,\n ): void {\n const sourceSegments = this.#getSegmentsOrThrow(sourceName);\n const targetSegments = this.#getSegmentsOrThrow(targetName);\n\n // Get source and target URL params using helper\n const sourceParams = this.#collectUrlParams(sourceSegments);\n const targetParams = this.#collectUrlParamsArray(targetSegments);\n\n // Check if target requires params that source doesn't have\n const missingParams = targetParams.filter(\n (param) => !sourceParams.has(param),\n );\n\n if (missingParams.length > 0) {\n throw new Error(\n `[real-router] forwardTo target \"${targetName}\" requires params ` +\n `[${missingParams.join(\", \")}] that are not available in source route \"${sourceName}\"`,\n );\n }\n }\n\n /**\n * Validates that adding forwardTo doesn't create a cycle.\n * Creates a test map with the new entry and uses resolveForwardChain\n * to detect cycles before any mutation happens.\n * Used by updateRoute for forwardTo validation.\n */\n validateForwardToCycle(sourceName: string, targetName: string): void {\n // Create a test map with the new entry to validate BEFORE mutation\n const testMap = {\n ...this.#config.forwardMap,\n [sourceName]: targetName,\n };\n\n // resolveForwardChain will throw if cycle is detected or max depth exceeded\n resolveForwardChain(sourceName, testMap);\n }\n\n /**\n * Validates removeRoute constraints.\n * Returns false if removal should be blocked (route is active).\n * Logs warnings for edge cases.\n *\n * @param name - Route name to remove\n * @param currentStateName - Current active route name (or undefined)\n * @param isNavigating - Whether navigation is in progress\n * @returns true if removal can proceed, false if blocked\n */\n validateRemoveRoute(\n name: string,\n currentStateName: string | undefined,\n isNavigating: boolean,\n ): boolean {\n // Check if trying to remove currently active route (or its parent)\n if (currentStateName) {\n const isExactMatch = currentStateName === name;\n const isParentOfCurrent = currentStateName.startsWith(`${name}.`);\n\n if (isExactMatch || isParentOfCurrent) {\n const suffix = isExactMatch ? \"\" : ` (current: \"${currentStateName}\")`;\n\n logger.warn(\n \"router.removeRoute\",\n `Cannot remove route \"${name}\" — it is currently active${suffix}. Navigate away first.`,\n );\n\n return false;\n }\n }\n\n // Warn if navigation is in progress (but allow removal)\n if (isNavigating) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" removed while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n return true;\n }\n\n /**\n * Validates clearRoutes operation.\n * Returns false if operation should be blocked (navigation in progress).\n *\n * @param isNavigating - Whether navigation is in progress\n * @returns true if clearRoutes can proceed, false if blocked\n */\n validateClearRoutes(isNavigating: boolean): boolean {\n if (isNavigating) {\n logger.error(\n \"router.clearRoutes\",\n \"Cannot clear routes while navigation is in progress. Wait for navigation to complete.\",\n );\n\n return false;\n }\n\n return true;\n }\n\n /**\n * Validates updateRoute instance-level constraints (route existence, forwardTo).\n * Called after static validation passes.\n *\n * @param name - Route name (already validated by static method)\n * @param forwardTo - Cached forwardTo value (to avoid calling getter twice)\n */\n validateUpdateRoute(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null | undefined,\n ): void {\n // Validate route exists\n if (!this.hasRoute(name)) {\n throw new ReferenceError(\n `[real-router] updateRoute: route \"${name}\" does not exist`,\n );\n }\n\n // Validate forwardTo target exists and is valid (only for string forwardTo)\n if (\n forwardTo !== undefined &&\n forwardTo !== null &&\n typeof forwardTo === \"string\"\n ) {\n if (!this.hasRoute(forwardTo)) {\n throw new Error(\n `[real-router] updateRoute: forwardTo target \"${forwardTo}\" does not exist`,\n );\n }\n\n // Check forwardTo param compatibility\n this.validateForwardToParamCompatibility(name, forwardTo);\n\n // Check for cycle detection\n this.validateForwardToCycle(name, forwardTo);\n }\n }\n\n // =========================================================================\n // Private methods\n // =========================================================================\n\n #updateForwardTo(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null,\n ): void {\n if (forwardTo === null) {\n delete this.#config.forwardMap[name];\n delete this.#config.forwardFnMap[name];\n } else if (typeof forwardTo === \"string\") {\n delete this.#config.forwardFnMap[name];\n this.#config.forwardMap[name] = forwardTo;\n } else {\n delete this.#config.forwardMap[name];\n this.#config.forwardFnMap[name] = forwardTo;\n }\n\n this.#refreshForwardMap();\n }\n\n /**\n * Merges route's defaultParams with provided params.\n */\n #mergeDefaultParams<P extends Params = Params>(\n routeName: string,\n params: P,\n ): P {\n if (Object.hasOwn(this.#config.defaultParams, routeName)) {\n return { ...this.#config.defaultParams[routeName], ...params } as P;\n }\n\n return params;\n }\n\n /**\n * Resolves dynamic forwardTo chain with cycle detection and max depth.\n * Throws if cycle detected, max depth exceeded, or invalid return type.\n */\n #resolveDynamicForward(\n startName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n startFn: ForwardToCallback<any>,\n params: Params,\n ): string {\n const visited = new Set<string>([startName]);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n let current = startFn(this.#deps.getDependency as any, params);\n let depth = 0;\n const MAX_DEPTH = 100;\n\n // Validate initial return type\n if (typeof current !== \"string\") {\n throw new TypeError(\n `forwardTo callback must return a string, got ${typeof current}`,\n );\n }\n\n while (depth < MAX_DEPTH) {\n // Check if target route exists\n\n if (this.#matcher.getSegmentsByName(current) === undefined) {\n throw new Error(`Route \"${current}\" does not exist`);\n }\n\n // Check for cycle\n if (visited.has(current)) {\n const chain = [...visited, current].join(\" → \");\n\n throw new Error(`Circular forwardTo detected: ${chain}`);\n }\n\n visited.add(current);\n\n // Check if current has dynamic forward\n if (Object.hasOwn(this.#config.forwardFnMap, current)) {\n const fn = this.#config.forwardFnMap[current];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n current = fn(this.#deps.getDependency as any, params);\n\n depth++;\n continue;\n }\n\n // Check if current has static forward\n const staticForward = this.#config.forwardMap[current];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (staticForward !== undefined) {\n current = staticForward;\n depth++;\n continue;\n }\n\n // No more forwards - return current\n return current;\n }\n\n throw new Error(`forwardTo exceeds maximum depth of ${MAX_DEPTH}`);\n }\n\n #rebuildTree(): void {\n this.#tree = createRouteTree(\n DEFAULT_ROUTE_NAME,\n this.#rootPath,\n this.#definitions,\n );\n\n // Re-register tree in matcher (creates new instance, preserving options if set)\n this.#matcher = createMatcher(this.#matcherOptions);\n this.#matcher.registerTree(this.#tree);\n }\n\n /**\n * Gets segments by name or throws if not found.\n * Use when route existence has been validated by hasRoute() beforehand.\n */\n #getSegmentsOrThrow(name: string): readonly RouteTree[] {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.#matcher.getSegmentsByName(name)! as readonly RouteTree[];\n }\n\n /**\n * Gets last segment from segments array.\n * Use when segments array is guaranteed to be non-empty.\n */\n #getLastSegment(segments: readonly RouteTree[]): RouteTree {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return segments.at(-1)!;\n }\n\n /**\n * Collects URL params from segments into a Set.\n */\n #collectUrlParams(segments: readonly RouteTree[]): Set<string> {\n const params = new Set<string>();\n\n for (const segment of segments) {\n // Named routes always have parsers (null only for root without path)\n for (const param of segment.paramMeta.urlParams) {\n params.add(param);\n }\n }\n\n return params;\n }\n\n /**\n * Collects URL params from segments into an array.\n *\n * @param segments - Non-null segments (caller must validate existence first)\n */\n #collectUrlParamsArray(segments: readonly RouteTree[]): string[] {\n const params: string[] = [];\n\n for (const segment of segments) {\n // Named routes always have parsers (null only for root without path)\n for (const param of segment.paramMeta.urlParams) {\n params.push(param);\n }\n }\n\n return params;\n }\n\n /**\n * Refreshes forward map cache, conditionally validating based on noValidate flag.\n */\n #refreshForwardMap(): void {\n if (this.#noValidate) {\n this.#cacheForwardMap();\n } else {\n this.#validateAndCacheForwardMap();\n }\n }\n\n #validateAndCacheForwardMap(): void {\n // Clear existing cache\n for (const key in this.#resolvedForwardMap) {\n delete this.#resolvedForwardMap[key];\n }\n\n // Resolve all chains\n for (const fromRoute of Object.keys(this.#config.forwardMap)) {\n this.#resolvedForwardMap[fromRoute] = resolveForwardChain(\n fromRoute,\n this.#config.forwardMap,\n );\n }\n }\n\n /**\n * Caches forward chains without validation (noValidate mode).\n * Simply resolves chains without cycle detection or max depth checks.\n */\n #cacheForwardMap(): void {\n // Clear existing cache\n for (const key in this.#resolvedForwardMap) {\n delete this.#resolvedForwardMap[key];\n }\n\n // Resolve chains without validation\n for (const fromRoute of Object.keys(this.#config.forwardMap)) {\n let current = fromRoute;\n\n while (this.#config.forwardMap[current]) {\n current = this.#config.forwardMap[current];\n }\n\n this.#resolvedForwardMap[fromRoute] = current;\n }\n }\n\n #clearRouteConfigurations(routeName: string): void {\n const shouldClear = (n: string): boolean =>\n n === routeName || n.startsWith(`${routeName}.`);\n\n clearConfigEntries(this.#config.decoders, shouldClear);\n clearConfigEntries(this.#config.encoders, shouldClear);\n clearConfigEntries(this.#config.defaultParams, shouldClear);\n clearConfigEntries(this.#config.forwardMap, shouldClear);\n clearConfigEntries(this.#config.forwardFnMap, shouldClear);\n\n // Clear forwardMap entries pointing TO deleted route\n clearConfigEntries(this.#config.forwardMap, (key) =>\n shouldClear(this.#config.forwardMap[key]),\n );\n\n // Clear lifecycle handlers\n const [canDeactivateFactories, canActivateFactories] =\n this.#lifecycleNamespace.getFactories();\n\n for (const n of Object.keys(canActivateFactories)) {\n if (shouldClear(n)) {\n this.#lifecycleNamespace.clearCanActivate(n);\n }\n }\n\n for (const n of Object.keys(canDeactivateFactories)) {\n if (shouldClear(n)) {\n this.#lifecycleNamespace.clearCanDeactivate(n);\n }\n }\n }\n\n #registerAllRouteHandlers(\n routes: readonly Route<Dependencies>[],\n parentName = \"\",\n ): void {\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n this.#registerSingleRouteHandlers(route, fullName);\n\n if (route.children) {\n this.#registerAllRouteHandlers(route.children, fullName);\n }\n }\n }\n\n #registerSingleRouteHandlers(\n route: Route<Dependencies>,\n fullName: string,\n ): void {\n // Register canActivate via deps.canActivate (allows tests to spy on router.canActivate)\n if (route.canActivate) {\n // Note: Uses #depsStore directly because this method is called from constructor\n // before setDependencies(). The getter #deps would throw if deps not set.\n if (this.#depsStore) {\n // Deps available, register immediately\n this.#depsStore.addActivateGuard(fullName, route.canActivate);\n } else {\n // Deps not set yet, store for later registration\n this.#pendingCanActivate.set(fullName, route.canActivate);\n }\n }\n\n // Register canDeactivate via deps.canDeactivate (allows tests to spy on router.canDeactivate)\n if (route.canDeactivate) {\n // Note: Uses #depsStore directly because this method is called from constructor\n // before setDependencies(). The getter #deps would throw if deps not set.\n if (this.#depsStore) {\n // Deps available, register immediately\n this.#depsStore.addDeactivateGuard(fullName, route.canDeactivate);\n } else {\n // Deps not set yet, store for later registration\n this.#pendingCanDeactivate.set(fullName, route.canDeactivate);\n }\n }\n\n // Register forwardTo\n if (route.forwardTo) {\n this.#registerForwardTo(route, fullName);\n }\n\n // Register transformers with fallback wrapper\n if (route.decodeParams) {\n this.#config.decoders[fullName] = (params: Params): Params =>\n route.decodeParams?.(params) ?? params;\n }\n\n if (route.encodeParams) {\n this.#config.encoders[fullName] = (params: Params): Params =>\n route.encodeParams?.(params) ?? params;\n }\n\n // Register defaults\n if (route.defaultParams) {\n this.#config.defaultParams[fullName] = route.defaultParams;\n }\n }\n\n #findDefinition(\n definitions: RouteDefinition[],\n fullName: string,\n parentPrefix = \"\",\n ): RouteDefinition | undefined {\n for (const def of definitions) {\n const currentFullName = parentPrefix\n ? `${parentPrefix}.${def.name}`\n : def.name;\n\n if (currentFullName === fullName) {\n return def;\n }\n if (def.children && fullName.startsWith(`${currentFullName}.`)) {\n return this.#findDefinition(def.children, fullName, currentFullName);\n }\n }\n\n /* v8 ignore next -- @preserve: defensive return, callers validate route exists before calling */\n return undefined;\n }\n\n #registerForwardTo(route: Route<Dependencies>, fullName: string): void {\n if (route.canActivate) {\n /* v8 ignore next -- @preserve: edge case, both string and function tested separately */\n const forwardTarget =\n typeof route.forwardTo === \"string\" ? route.forwardTo : \"[dynamic]\";\n\n logger.warn(\n \"real-router\",\n `Route \"${fullName}\" has both forwardTo and canActivate. ` +\n `canActivate will be ignored because forwardTo creates a redirect (industry standard). ` +\n `Move canActivate to the target route \"${forwardTarget}\".`,\n );\n }\n\n if (route.canDeactivate) {\n /* v8 ignore next -- @preserve: edge case, both string and function tested separately */\n const forwardTarget =\n typeof route.forwardTo === \"string\" ? route.forwardTo : \"[dynamic]\";\n\n logger.warn(\n \"real-router\",\n `Route \"${fullName}\" has both forwardTo and canDeactivate. ` +\n `canDeactivate will be ignored because forwardTo creates a redirect (industry standard). ` +\n `Move canDeactivate to the target route \"${forwardTarget}\".`,\n );\n }\n\n // Async validation ALWAYS runs (even with noValidate=true)\n if (typeof route.forwardTo === \"function\") {\n const isNativeAsync =\n (route.forwardTo as { constructor: { name: string } }).constructor\n .name === \"AsyncFunction\";\n const isTranspiledAsync = route.forwardTo\n .toString()\n .includes(\"__awaiter\");\n\n if (isNativeAsync || isTranspiledAsync) {\n throw new TypeError(\n `forwardTo callback cannot be async for route \"${fullName}\". ` +\n `Async functions break matchPath/buildPath.`,\n );\n }\n }\n\n // forwardTo is guaranteed to exist at this point\n if (typeof route.forwardTo === \"string\") {\n this.#config.forwardMap[fullName] = route.forwardTo;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#config.forwardFnMap[fullName] = route.forwardTo!;\n }\n }\n\n #enrichRoute(\n routeDef: RouteDefinition,\n routeName: string,\n ): Route<Dependencies> {\n const route: Route<Dependencies> = {\n name: routeDef.name,\n path: routeDef.path,\n };\n\n const forwardToFn = this.#config.forwardFnMap[routeName];\n const forwardToStr = this.#config.forwardMap[routeName];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (forwardToFn !== undefined) {\n route.forwardTo = forwardToFn;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if (forwardToStr !== undefined) {\n route.forwardTo = forwardToStr;\n }\n\n if (routeName in this.#config.defaultParams) {\n route.defaultParams = this.#config.defaultParams[routeName];\n }\n\n if (routeName in this.#config.decoders) {\n route.decodeParams = this.#config.decoders[routeName];\n }\n\n if (routeName in this.#config.encoders) {\n route.encodeParams = this.#config.encoders[routeName];\n }\n\n const [canDeactivateFactories, canActivateFactories] =\n this.#lifecycleNamespace.getFactories();\n\n if (routeName in canActivateFactories) {\n route.canActivate = canActivateFactories[routeName];\n }\n\n if (routeName in canDeactivateFactories) {\n route.canDeactivate = canDeactivateFactories[routeName];\n }\n\n if (routeDef.children) {\n route.children = routeDef.children.map((child) =>\n this.#enrichRoute(child, `${routeName}.${child.name}`),\n );\n }\n\n return route;\n }\n}\n","// packages/real-router/modules/transition/wrapSyncError.ts\n\n/**\n * Error metadata structure for transition errors.\n * Contains information extracted from caught exceptions.\n */\nexport interface SyncErrorMetadata {\n [key: string]: unknown;\n message?: string;\n stack?: string | undefined;\n cause?: unknown;\n segment?: string;\n}\n\n// Reserved properties that conflict with RouterError constructor\n// Issue #39: Filter these when wrapping sync errors to avoid TypeError\nconst reservedRouterErrorProps = new Set([\n \"code\",\n \"segment\",\n \"path\",\n \"redirect\",\n]);\n\n/**\n * Wraps a synchronously thrown value into structured error metadata.\n *\n * This helper extracts useful debugging information from various thrown values:\n * - Error instances: extracts message, stack, and cause (ES2022+)\n * - Plain objects: spreads properties into metadata\n * - Primitives (string, number, etc.): returns minimal metadata\n *\n * @param thrown - The value caught in a try-catch block\n * @param segment - Optional route segment name (for lifecycle hooks)\n * @returns Structured error metadata for RouterError\n *\n * @example\n * ```typescript\n * try {\n * hookFn();\n * } catch (error) {\n * const metadata = wrapSyncError(error, \"users.profile\");\n * throw new RouterError(errorCodes.TRANSITION_ERR, metadata);\n * }\n * ```\n */\nexport function wrapSyncError(\n thrown: unknown,\n segment?: string,\n): SyncErrorMetadata {\n // Base metadata - always include segment if provided\n const base: SyncErrorMetadata = segment ? { segment } : {};\n\n // Handle Error instances - extract all useful properties\n if (thrown instanceof Error) {\n return {\n ...base,\n message: thrown.message,\n stack: thrown.stack,\n // Error.cause requires ES2022+ - safely access if present\n ...(\"cause\" in thrown &&\n thrown.cause !== undefined && { cause: thrown.cause }),\n };\n }\n\n // Handle plain objects - spread properties into metadata, filtering reserved props\n if (thrown && typeof thrown === \"object\") {\n const filtered: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(thrown)) {\n // Issue #39: Skip reserved properties to avoid RouterError constructor TypeError\n if (!reservedRouterErrorProps.has(key)) {\n filtered[key] = value;\n }\n }\n\n return { ...base, ...filtered };\n }\n\n // Primitives (string, number, boolean, null, undefined, symbol, bigint)\n // Return base metadata only - the primitive value isn't useful as metadata\n return base;\n}\n","// packages/real-router/modules/RouterError.ts\n\nimport { errorCodes } from \"./constants\";\nimport { deepFreezeState } from \"./helpers\";\n\nimport type { State } from \"@real-router/types\";\n\n// Pre-compute Set of error code values for O(1) lookup in setCode()\n// This avoids creating array and doing linear search on every setCode() call\nconst errorCodeValues = new Set(Object.values(errorCodes));\n\n// Reserved built-in properties - throw error if user tries to set these\nconst reservedProperties = new Set([\"code\", \"segment\", \"path\", \"redirect\"]);\n\n// Reserved method names - silently ignore attempts to overwrite these\nconst reservedMethods = new Set([\n \"setCode\",\n \"setErrorInstance\",\n \"setAdditionalFields\",\n \"hasField\",\n \"getField\",\n \"toJSON\",\n]);\n\nexport class RouterError extends Error {\n [key: string]: unknown;\n\n // Using public properties to ensure structural compatibility\n // with RouterError interface in core-types\n readonly segment: string | undefined;\n readonly path: string | undefined;\n readonly redirect: State | undefined;\n\n // Note: code appears to be writable but setCode() should be used\n // to properly update both code and message together\n code: string;\n\n /**\n * Creates a new RouterError instance.\n *\n * The options object accepts built-in fields (message, segment, path, redirect)\n * and any additional custom fields, which will all be attached to the error instance.\n *\n * @param code - The error code (e.g., \"ROUTE_NOT_FOUND\", \"CANNOT_ACTIVATE\")\n * @param options - Optional configuration object\n * @param options.message - Custom error message (defaults to code if not provided)\n * @param options.segment - The route segment where the error occurred\n * @param options.path - The full path where the error occurred\n * @param options.redirect - Optional redirect state for navigation errors\n *\n * @example\n * ```typescript\n * // Basic error\n * const err1 = new RouterError(\"ROUTE_NOT_FOUND\");\n *\n * // Error with custom message\n * const err2 = new RouterError(\"ERR\", { message: \"Something went wrong\" });\n *\n * // Error with context and custom fields\n * const err3 = new RouterError(\"CANNOT_ACTIVATE\", {\n * message: \"Insufficient permissions\",\n * segment: \"admin\",\n * path: \"/admin/users\",\n * userId: \"123\" // custom field\n * });\n *\n * // Error with redirect\n * const err4 = new RouterError(\"TRANSITION_ERR\", {\n * redirect: { name: \"home\", path: \"/\", params: {} }\n * });\n * ```\n */\n constructor(\n code: string,\n {\n message,\n segment,\n path,\n redirect,\n ...rest\n }: {\n [key: string]: unknown;\n message?: string | undefined;\n segment?: string | undefined;\n path?: string | undefined;\n redirect?: State | undefined;\n } = {},\n ) {\n super(message ?? code);\n\n this.code = code;\n this.segment = segment;\n this.path = path;\n // Deep freeze redirect to prevent mutations (creates a frozen clone)\n this.redirect = redirect ? deepFreezeState(redirect) : undefined;\n\n // Assign custom fields, checking reserved properties and filtering out reserved method names\n // Issue #39: Throw for reserved properties to match setAdditionalFields behavior\n for (const [key, value] of Object.entries(rest)) {\n if (reservedProperties.has(key)) {\n throw new TypeError(\n `[RouterError] Cannot set reserved property \"${key}\"`,\n );\n }\n\n if (!reservedMethods.has(key)) {\n this[key] = value;\n }\n }\n }\n\n /**\n * Updates the error code and conditionally updates the message.\n *\n * If the current message is one of the standard error code values\n * (e.g., \"ROUTE_NOT_FOUND\", \"SAME_STATES\"), it will be replaced with the new code.\n * This allows keeping error messages in sync with codes when using standard error codes.\n *\n * If the message is custom (not a standard error code), it will be preserved.\n *\n * @param newCode - The new error code to set\n *\n * @example\n * // Message follows code (standard error code as message)\n * const err = new RouterError(\"ROUTE_NOT_FOUND\", { message: \"ROUTE_NOT_FOUND\" });\n * err.setCode(\"CUSTOM_ERROR\"); // message becomes \"CUSTOM_ERROR\"\n *\n * @example\n * // Custom message is preserved\n * const err = new RouterError(\"ERR\", { message: \"Custom error message\" });\n * err.setCode(\"NEW_CODE\"); // message stays \"Custom error message\"\n */\n setCode(newCode: string): void {\n this.code = newCode;\n\n // Only update message if it's a standard error code value (not a custom message)\n if (errorCodeValues.has(this.message)) {\n this.message = newCode;\n }\n }\n\n /**\n * Copies properties from another Error instance to this RouterError.\n *\n * This method updates the message, cause, and stack trace from the provided error.\n * Useful for wrapping native errors while preserving error context.\n *\n * @param err - The Error instance to copy properties from\n * @throws {TypeError} If err is null or undefined\n *\n * @example\n * ```typescript\n * const routerErr = new RouterError(\"TRANSITION_ERR\");\n * try {\n * // some operation that might fail\n * } catch (nativeErr) {\n * routerErr.setErrorInstance(nativeErr);\n * throw routerErr;\n * }\n * ```\n */\n setErrorInstance(err: Error): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!err) {\n throw new TypeError(\n \"[RouterError.setErrorInstance] err parameter is required and must be an Error instance\",\n );\n }\n\n this.message = err.message;\n this.cause = err.cause;\n this.stack = err.stack ?? \"\";\n }\n\n /**\n * Adds custom fields to the error object.\n *\n * This method allows attaching arbitrary data to the error for debugging or logging purposes.\n * All fields become accessible as properties on the error instance and are included in JSON serialization.\n *\n * Reserved method names (setCode, setErrorInstance, setAdditionalFields, hasField, getField, toJSON)\n * are automatically filtered out to prevent accidental overwriting of class methods.\n *\n * @param fields - Object containing custom fields to add to the error\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"CANNOT_ACTIVATE\");\n * err.setAdditionalFields({\n * userId: \"123\",\n * attemptedRoute: \"/admin\",\n * reason: \"insufficient permissions\"\n * });\n *\n * console.log(err.userId); // \"123\"\n * console.log(JSON.stringify(err)); // includes all custom fields\n * ```\n */\n setAdditionalFields(fields: Record<string, unknown>): void {\n // Assign fields, throwing for reserved properties, silently ignoring methods\n for (const [key, value] of Object.entries(fields)) {\n if (reservedProperties.has(key)) {\n throw new TypeError(\n `[RouterError.setAdditionalFields] Cannot set reserved property \"${key}\"`,\n );\n }\n\n if (!reservedMethods.has(key)) {\n this[key] = value;\n }\n }\n }\n\n /**\n * Checks if a custom field exists on the error object.\n *\n * This method checks for both custom fields added via setAdditionalFields()\n * and built-in fields (code, message, segment, etc.).\n *\n * @param key - The field name to check\n * @returns `true` if the field exists, `false` otherwise\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ERR\", { segment: \"users\" });\n * err.setAdditionalFields({ userId: \"123\" });\n *\n * err.hasField(\"userId\"); // true\n * err.hasField(\"segment\"); // true\n * err.hasField(\"unknown\"); // false\n * ```\n */\n hasField(key: string): boolean {\n return key in this;\n }\n\n /**\n * Retrieves a custom field value from the error object.\n *\n * This method can access both custom fields and built-in fields.\n * Returns `undefined` if the field doesn't exist.\n *\n * @param key - The field name to retrieve\n * @returns The field value, or `undefined` if it doesn't exist\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ERR\");\n * err.setAdditionalFields({ userId: \"123\", role: \"admin\" });\n *\n * err.getField(\"userId\"); // \"123\"\n * err.getField(\"role\"); // \"admin\"\n * err.getField(\"code\"); // \"ERR\" (built-in field)\n * err.getField(\"unknown\"); // undefined\n * ```\n */\n getField(key: string): unknown {\n return this[key];\n }\n\n /**\n * Serializes the error to a JSON-compatible object.\n *\n * This method is automatically called by JSON.stringify() and includes:\n * - Built-in fields: code, message, segment (if set), path (if set), redirect (if set)\n * - All custom fields added via setAdditionalFields() or constructor\n * - Excludes: stack trace (for security/cleanliness)\n *\n * @returns A plain object representation of the error, suitable for JSON serialization\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ROUTE_NOT_FOUND\", {\n * message: \"Route not found\",\n * path: \"/admin/users/123\"\n * });\n * err.setAdditionalFields({ userId: \"123\" });\n *\n * JSON.stringify(err);\n * // {\n * // \"code\": \"ROUTE_NOT_FOUND\",\n * // \"message\": \"Route not found\",\n * // \"path\": \"/admin/users/123\",\n * // \"userId\": \"123\"\n * // }\n * ```\n */\n toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {\n code: this.code,\n message: this.message,\n };\n\n if (this.segment !== undefined) {\n result.segment = this.segment;\n }\n if (this.path !== undefined) {\n result.path = this.path;\n }\n if (this.redirect !== undefined) {\n result.redirect = this.redirect;\n }\n\n // add all public fields\n // Using Set.has() for O(1) lookup instead of Array.includes() O(n)\n // Overall complexity: O(n) instead of O(n*m)\n const excludeKeys = new Set([\n \"code\",\n \"message\",\n \"segment\",\n \"path\",\n \"redirect\",\n \"stack\",\n ]);\n\n for (const key in this) {\n if (Object.hasOwn(this, key) && !excludeKeys.has(key)) {\n result[key] = this[key];\n }\n }\n\n return result;\n }\n}\n","// packages/real-router/modules/transition/makeError.ts\n\nimport { wrapSyncError } from \"./wrapSyncError\";\nimport { RouterError } from \"../../../RouterError\";\n\n// Helper: Creating an error with code\nexport const makeError = (\n code: string,\n err?: RouterError,\n): RouterError | undefined => {\n if (!err) {\n return undefined;\n }\n\n err.setCode(code);\n\n return err;\n};\n\n/**\n * Re-throws a caught error as a RouterError with the given error code.\n * If the error is already a RouterError, sets the code directly.\n * Otherwise wraps it with wrapSyncError metadata.\n */\nexport function rethrowAsRouterError(\n error: unknown,\n errorCode: string,\n segment?: string,\n): never {\n if (error instanceof RouterError) {\n error.setCode(errorCode);\n\n throw error;\n }\n\n throw new RouterError(errorCode, wrapSyncError(error, segment));\n}\n","// packages/real-router/modules/transition/mergeStates.ts\n\nimport type { Params, State, StateMeta } from \"@real-router/types\";\n\n/**\n * Merges two states with toState taking priority over fromState.\n *\n * Priority order for state fields: toState > fromState\n * Priority order for meta fields: toState.meta > fromState.meta > defaults\n *\n * Special case: meta.params are merged (not replaced):\n * { ...toState.meta.params, ...fromState.meta.params }\n *\n * @param toState - Target state (higher priority)\n * @param fromState - Source state (lower priority)\n * @returns New merged state object\n */\nexport const mergeStates = (toState: State, fromState: State): State => {\n const toMeta = toState.meta;\n const fromMeta = fromState.meta;\n\n // Optimization #1: Conditional merge for params\n // Use spread only when both are defined\n const toParams = toMeta?.params;\n const fromParams = fromMeta?.params;\n\n // Both have params - need to merge; otherwise use whichever is defined\n const metaParams: Params =\n toParams && fromParams\n ? { ...toParams, ...fromParams }\n : (toParams ?? fromParams ?? {});\n\n // Optimization #2: Build meta with defaults, then apply fromMeta, then toMeta\n // Note: StateMeta can have custom fields added by guards/middleware, so we preserve them\n const resultMeta: StateMeta = {\n // Defaults first\n id: 1,\n options: {},\n // fromMeta fields (lower priority, may include custom fields)\n ...fromMeta,\n // toMeta fields (higher priority, may include custom fields)\n ...toMeta,\n // Explicitly set params to our merged version (override spread)\n params: metaParams,\n };\n\n // Optimization #4: Copy all toState fields (including custom ones)\n // then explicitly set meta to our merged version\n // Note: State can have custom fields added by middleware, so we must preserve them\n return {\n ...toState,\n meta: resultMeta,\n };\n};\n","// packages/real-router/modules/transition/processLifecycleResult.ts\n\nimport { isPromise, isState } from \"type-guards\";\n\nimport { errorCodes } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\n\nimport type { SyncErrorMetadata } from \"./wrapSyncError\";\nimport type { State, ActivationFn } from \"@real-router/types\";\n\n/**\n * Builds error metadata from a caught promise rejection.\n * Extracts message, stack, and cause from Error instances.\n */\nfunction buildErrorMetadata(\n error_: unknown,\n errorData: SyncErrorMetadata,\n): SyncErrorMetadata {\n if (error_ instanceof Error) {\n return {\n ...errorData,\n message: error_.message,\n stack: error_.stack,\n // Error.cause requires ES2022+ - safely access it if present\n ...(\"cause\" in error_ &&\n error_.cause !== undefined && { cause: error_.cause }),\n };\n }\n\n if (error_ && typeof error_ === \"object\") {\n return { ...errorData, ...error_ };\n }\n\n return errorData;\n}\n\n// Helper: Lifecycle results Processing Function\nexport const processLifecycleResult = async (\n result: ReturnType<ActivationFn>,\n currentState: State,\n segment?: string,\n): Promise<State> => {\n const errorData = segment ? { segment } : {};\n\n if (result === undefined) {\n return currentState;\n }\n\n if (typeof result === \"boolean\") {\n if (result) {\n return currentState;\n } else {\n throw new RouterError(errorCodes.TRANSITION_ERR, errorData);\n }\n }\n\n if (isState(result)) {\n return result;\n }\n\n if (isPromise<State | boolean | undefined>(result)) {\n // Optimization: single try/catch instead of .then(onFulfill, onReject)\n try {\n const resVal = await result;\n\n return await processLifecycleResult(resVal, currentState, segment);\n } catch (error_: unknown) {\n throw new RouterError(\n errorCodes.TRANSITION_ERR,\n buildErrorMetadata(error_, errorData),\n );\n }\n }\n\n // This should never be reached - all valid ActivationFn return types are handled above\n // If we get here, it means the activation function returned an unexpected type\n throw new RouterError(errorCodes.TRANSITION_ERR, {\n ...errorData,\n message: `Invalid lifecycle result type: ${typeof result}`,\n });\n};\n","// packages/real-router/modules/transition/executeLifecycleHooks.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { isState } from \"type-guards\";\n\nimport { rethrowAsRouterError } from \"./makeError\";\nimport { mergeStates } from \"./mergeStates\";\nimport { processLifecycleResult } from \"./processLifecycleResult\";\nimport { errorCodes } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\n\nimport type { State, ActivationFn } from \"@real-router/types\";\n\n// Helper: execution of the Lifecycle Hooks group\nexport const executeLifecycleHooks = async (\n hooks: Map<string, ActivationFn>,\n toState: State,\n fromState: State | undefined,\n segments: string[],\n errorCode: string,\n isCancelled: () => boolean,\n): Promise<State> => {\n let currentState = toState;\n const segmentsToProcess = segments.filter((name) => hooks.has(name));\n\n if (segmentsToProcess.length === 0) {\n return currentState;\n }\n\n for (const segment of segmentsToProcess) {\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n // Safe cast: segmentsToProcess only contains names that exist in hooks (filtered above)\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed by filter\n const hookFn = hooks.get(segment)!;\n\n try {\n const result = hookFn(currentState, fromState);\n const newState = await processLifecycleResult(\n result,\n currentState,\n segment,\n );\n\n // Optimization: Early return for undefined newState (most common case ~90%+)\n // This avoids isState() call and subsequent checks\n if (newState !== currentState && isState(newState)) {\n // Guards cannot redirect to a different route\n if (newState.name !== currentState.name) {\n throw new RouterError(errorCode, {\n message:\n \"Guards cannot redirect to different route. Use middleware.\",\n attemptedRedirect: {\n name: newState.name,\n params: newState.params,\n path: newState.path,\n },\n });\n }\n\n // Same route - safe to merge (param modifications, meta changes)\n const hasChanged =\n newState.params !== currentState.params ||\n newState.path !== currentState.path;\n\n if (hasChanged) {\n logger.error(\n \"core:transition\",\n \"Warning: State mutated during transition\",\n { from: currentState, to: newState },\n );\n }\n\n currentState = mergeStates(newState, currentState);\n }\n } catch (error: unknown) {\n rethrowAsRouterError(error, errorCode, segment);\n }\n }\n\n return currentState;\n};\n","// packages/real-router/modules/transition/executeMiddleware.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { isState } from \"type-guards\";\n\nimport { rethrowAsRouterError } from \"./makeError\";\nimport { mergeStates } from \"./mergeStates\";\nimport { processLifecycleResult } from \"./processLifecycleResult\";\nimport { errorCodes } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\n\nimport type { State, ActivationFn } from \"@real-router/types\";\n\n// Helper: processing middleware\nexport const executeMiddleware = async (\n middlewareFunctions: ActivationFn[],\n toState: State,\n fromState: State | undefined,\n isCancelled: () => boolean,\n): Promise<State> => {\n let currentState = toState;\n\n for (const middlewareFn of middlewareFunctions) {\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n try {\n const result = middlewareFn(currentState, fromState);\n const newState = await processLifecycleResult(result, currentState);\n\n // Optimization: Early return for undefined newState (most common case ~90%+)\n // This avoids isState() call and subsequent checks\n if (newState !== currentState && isState(newState)) {\n const hasChanged =\n newState.name !== currentState.name ||\n newState.params !== currentState.params ||\n newState.path !== currentState.path;\n\n if (hasChanged) {\n logger.error(\n \"core:middleware\",\n \"Warning: State mutated during middleware execution\",\n { from: currentState, to: newState },\n );\n }\n\n currentState = mergeStates(newState, currentState);\n }\n } catch (error: unknown) {\n rethrowAsRouterError(error, errorCodes.TRANSITION_ERR);\n }\n }\n\n return currentState;\n};\n","// packages/real-router/modules/transition/index.ts\n\nimport { executeLifecycleHooks } from \"./executeLifecycleHooks\";\nimport { executeMiddleware } from \"./executeMiddleware\";\nimport { constants, errorCodes } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\nimport { getTransitionPath, nameToIDs } from \"../../../transitionPath\";\n\nimport type { TransitionDependencies, TransitionOutput } from \"../types\";\nimport type { NavigationOptions, State } from \"@real-router/types\";\n\nexport async function transition(\n deps: TransitionDependencies,\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n): Promise<TransitionOutput> {\n // We're caching the necessary data\n const [canDeactivateFunctions, canActivateFunctions] =\n deps.getLifecycleFunctions();\n const middlewareFunctions = deps.getMiddlewareFunctions();\n const isUnknownRoute = toState.name === constants.UNKNOWN_ROUTE;\n\n // State management functions\n // Issue #36: Check both explicit cancellation AND router shutdown\n const isCancelled = () => !deps.isActive();\n\n const { toDeactivate, toActivate, intersection } = getTransitionPath(\n toState,\n fromState,\n );\n\n // determine the necessary steps\n const shouldDeactivate =\n fromState && !opts.forceDeactivate && toDeactivate.length > 0;\n const shouldActivate = !isUnknownRoute && toActivate.length > 0;\n const shouldRunMiddleware = middlewareFunctions.length > 0;\n\n let currentState = toState;\n\n if (shouldDeactivate) {\n currentState = await executeLifecycleHooks(\n canDeactivateFunctions,\n toState,\n fromState,\n toDeactivate,\n errorCodes.CANNOT_DEACTIVATE,\n isCancelled,\n );\n }\n\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n if (shouldActivate) {\n currentState = await executeLifecycleHooks(\n canActivateFunctions,\n currentState,\n fromState,\n toActivate,\n errorCodes.CANNOT_ACTIVATE,\n isCancelled,\n );\n }\n\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n if (shouldRunMiddleware) {\n currentState = await executeMiddleware(\n middlewareFunctions,\n currentState,\n fromState,\n isCancelled,\n );\n }\n\n if (isCancelled()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n // Automatic cleaning of inactive segments\n if (fromState) {\n const activeSegments = nameToIDs(toState.name);\n const previousActiveSegments = nameToIDs(fromState.name);\n\n for (const name of previousActiveSegments) {\n if (!activeSegments.includes(name) && canDeactivateFunctions.has(name)) {\n deps.clearCanDeactivate(name);\n }\n }\n }\n\n return {\n state: currentState,\n meta: {\n phase: \"middleware\",\n segments: {\n deactivated: toDeactivate,\n activated: toActivate,\n intersection,\n },\n },\n };\n}\n","// packages/core/src/namespaces/NavigationNamespace/validators.ts\n\n/**\n * Static validation functions for NavigationNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport { getTypeDescription, isNavigationOptions } from \"type-guards\";\n\nimport type { NavigationOptions, State } from \"@real-router/types\";\n\n/**\n * Validates navigate route name argument.\n */\nexport function validateNavigateArgs(name: unknown): asserts name is string {\n if (typeof name !== \"string\") {\n throw new TypeError(\n `[router.navigate] Invalid route name: expected string, got ${getTypeDescription(name)}`,\n );\n }\n}\n\n/**\n * Validates navigateToState arguments.\n */\nexport function validateNavigateToStateArgs(\n toState: unknown,\n fromState: unknown,\n opts: unknown,\n): void {\n // toState must be a valid state object\n if (\n !toState ||\n typeof toState !== \"object\" ||\n typeof (toState as State).name !== \"string\" ||\n typeof (toState as State).path !== \"string\"\n ) {\n throw new TypeError(\n `[router.navigateToState] Invalid toState: expected State object with name and path`,\n );\n }\n\n // fromState can be undefined or a valid state\n if (\n fromState !== undefined &&\n (!fromState ||\n typeof fromState !== \"object\" ||\n typeof (fromState as State).name !== \"string\")\n ) {\n throw new TypeError(\n `[router.navigateToState] Invalid fromState: expected State object or undefined`,\n );\n }\n\n // opts must be an object\n if (typeof opts !== \"object\" || opts === null) {\n throw new TypeError(\n `[router.navigateToState] Invalid opts: expected NavigationOptions object, got ${getTypeDescription(opts)}`,\n );\n }\n}\n\n/**\n * Validates navigateToDefault arguments.\n */\nexport function validateNavigateToDefaultArgs(opts: unknown): void {\n // If opts is provided, it must be an object (NavigationOptions)\n if (opts !== undefined && (typeof opts !== \"object\" || opts === null)) {\n throw new TypeError(\n `[router.navigateToDefault] Invalid options: ${getTypeDescription(opts)}. Expected NavigationOptions object.`,\n );\n }\n}\n\n/**\n * Validates that opts is a valid NavigationOptions object.\n */\nexport function validateNavigationOptions(\n opts: unknown,\n methodName: string,\n): asserts opts is NavigationOptions {\n if (!isNavigationOptions(opts)) {\n throw new TypeError(\n `[router.${methodName}] Invalid options: ${getTypeDescription(opts)}. Expected NavigationOptions object.`,\n );\n }\n}\n","// packages/core/src/namespaces/NavigationNamespace/NavigationNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\n\nimport { transition } from \"./transition\";\nimport {\n validateNavigateArgs,\n validateNavigateToDefaultArgs,\n validateNavigateToStateArgs,\n validateNavigationOptions,\n} from \"./validators\";\nimport { errorCodes, constants } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\nimport { resolveOption } from \"../OptionsNamespace\";\n\nimport type {\n NavigationDependencies,\n TransitionDependencies,\n TransitionOutput,\n} from \"./types\";\nimport type {\n NavigationOptions,\n Params,\n State,\n TransitionMeta,\n} from \"@real-router/types\";\n\n/**\n * Independent namespace for managing navigation.\n *\n * Handles navigate(), navigateToDefault(), navigateToState(), and transition state.\n */\nexport class NavigationNamespace {\n // ═══════════════════════════════════════════════════════════════════════════\n // Functional reference for cyclic dependency\n // ═══════════════════════════════════════════════════════════════════════════\n\n // Dependencies injected via setDependencies (replaces full router reference)\n #canNavigate!: () => boolean;\n #deps!: NavigationDependencies;\n #transitionDeps!: TransitionDependencies;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validateNavigateArgs(name: unknown): asserts name is string {\n validateNavigateArgs(name);\n }\n\n static validateNavigateToStateArgs(\n toState: unknown,\n fromState: unknown,\n opts: unknown,\n ): void {\n validateNavigateToStateArgs(toState, fromState, opts);\n }\n\n static validateNavigateToDefaultArgs(opts: unknown): void {\n validateNavigateToDefaultArgs(opts);\n }\n\n static validateNavigationOptions(\n opts: unknown,\n methodName: string,\n ): asserts opts is NavigationOptions {\n validateNavigationOptions(opts, methodName);\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n /**\n * Sets the canNavigate check (cyclic dependency on EventBusNamespace).\n * Must be called before using navigate().\n */\n setCanNavigate(fn: () => boolean): void {\n this.#canNavigate = fn;\n }\n\n /**\n * Sets dependencies for navigation operations.\n * Must be called before using navigation methods.\n */\n setDependencies(deps: NavigationDependencies): void {\n this.#deps = deps;\n }\n\n /**\n * Sets dependencies for transition operations.\n * Must be called before using navigation methods.\n */\n setTransitionDependencies(deps: TransitionDependencies): void {\n this.#transitionDeps = deps;\n }\n\n // =========================================================================\n // Instance methods\n // =========================================================================\n\n /**\n * Navigates to a route by name.\n * Arguments should be pre-parsed and validated by facade.\n */\n async navigate(\n name: string,\n params: Params,\n opts: NavigationOptions,\n ): Promise<State> {\n if (!this.#canNavigate()) {\n throw new RouterError(errorCodes.ROUTER_NOT_STARTED);\n }\n\n const deps = this.#deps;\n\n const result = deps.buildStateWithSegments(name, params);\n\n if (!result) {\n const err = new RouterError(errorCodes.ROUTE_NOT_FOUND);\n\n deps.emitTransitionError(undefined, deps.getState(), err);\n\n throw err;\n }\n\n const { state: route } = result;\n\n const toState = deps.makeState(\n route.name,\n route.params,\n deps.buildPath(route.name, route.params),\n {\n params: route.meta,\n options: opts,\n },\n );\n\n const fromState = deps.getState();\n\n if (\n !opts.reload &&\n !opts.force &&\n deps.areStatesEqual(fromState, toState, false)\n ) {\n const err = new RouterError(errorCodes.SAME_STATES);\n\n deps.emitTransitionError(toState, fromState, err);\n\n throw err;\n }\n\n return this.navigateToState(toState, fromState, opts);\n }\n\n /**\n * Internal navigation function that accepts pre-built state.\n * Used by RouterLifecycleNamespace for start() transitions.\n */\n async navigateToState(\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n ): Promise<State> {\n const deps = this.#deps;\n const transitionDeps = this.#transitionDeps;\n\n if (transitionDeps.isTransitioning()) {\n logger.warn(\n \"router.navigate\",\n \"Concurrent navigation detected on shared router instance. \" +\n \"For SSR, use router.clone() to create isolated instance per request.\",\n );\n deps.cancelNavigation();\n }\n\n deps.startTransition(toState, fromState);\n\n try {\n const { state: finalState, meta: transitionOutput } = await transition(\n transitionDeps,\n toState,\n fromState,\n opts,\n );\n\n if (\n finalState.name === constants.UNKNOWN_ROUTE ||\n deps.hasRoute(finalState.name)\n ) {\n const stateWithTransition = NavigationNamespace.#buildSuccessState(\n finalState,\n transitionOutput,\n fromState,\n );\n\n deps.setState(stateWithTransition);\n deps.sendTransitionDone(stateWithTransition, fromState, opts);\n\n return stateWithTransition;\n } else {\n const err = new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: finalState.name,\n });\n\n deps.sendTransitionError(finalState, fromState, err);\n\n throw err;\n }\n } catch (error) {\n this.#routeTransitionError(error, toState, fromState);\n\n throw error;\n }\n }\n\n /**\n * Navigates to the default route if configured.\n * Arguments should be pre-parsed and validated by facade.\n */\n async navigateToDefault(opts: NavigationOptions): Promise<State> {\n const deps = this.#deps;\n const options = deps.getOptions();\n\n if (!options.defaultRoute) {\n throw new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: \"defaultRoute not configured\",\n });\n }\n\n const resolvedRoute = resolveOption(\n options.defaultRoute,\n deps.getDependency,\n );\n\n if (!resolvedRoute) {\n throw new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: \"defaultRoute resolved to empty\",\n });\n }\n\n const resolvedParams = resolveOption(\n options.defaultParams,\n deps.getDependency,\n );\n\n return this.navigate(resolvedRoute, resolvedParams, opts);\n }\n\n // =========================================================================\n // Private methods\n // =========================================================================\n\n /**\n * Builds the final state with frozen TransitionMeta attached.\n */\n static #buildSuccessState(\n finalState: State,\n transitionOutput: TransitionOutput[\"meta\"],\n fromState: State | undefined,\n ): State {\n const transitionMeta: TransitionMeta = {\n phase: transitionOutput.phase,\n ...(fromState?.name !== undefined && { from: fromState.name }),\n reason: \"success\",\n segments: transitionOutput.segments,\n };\n\n Object.freeze(transitionMeta.segments.deactivated);\n Object.freeze(transitionMeta.segments.activated);\n Object.freeze(transitionMeta.segments);\n Object.freeze(transitionMeta);\n\n return {\n ...finalState,\n transition: transitionMeta,\n };\n }\n\n /**\n * Routes a caught transition error to the correct FSM event.\n */\n #routeTransitionError(\n error: unknown,\n toState: State,\n fromState: State | undefined,\n ): void {\n const routerError = error as RouterError;\n\n // Already routed: cancel/stop sent CANCEL, sendTransitionError called in try block\n if (\n routerError.code === errorCodes.TRANSITION_CANCELLED ||\n routerError.code === errorCodes.ROUTE_NOT_FOUND\n ) {\n return;\n }\n\n if (\n routerError.code === errorCodes.CANNOT_ACTIVATE ||\n routerError.code === errorCodes.CANNOT_DEACTIVATE\n ) {\n this.#deps.sendTransitionBlocked(toState, fromState, routerError);\n } else {\n this.#deps.sendTransitionError(toState, fromState, routerError);\n }\n }\n}\n","// packages/core/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts\n\nimport { errorCodes } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\n\nimport type { RouterLifecycleDependencies } from \"./types\";\nimport type { NavigationOptions, State } from \"@real-router/types\";\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// CYCLIC DEPENDENCIES\n// ═══════════════════════════════════════════════════════════════════════════════\n// RouterLifecycle → Navigation.navigateToState() (for start transitions)\n//\n// Solution: functional references configured in Router.#setupDependencies()\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Independent namespace for managing router lifecycle.\n *\n * Handles start() and stop(). Lifecycle state (isActive, isStarted) is managed\n * by RouterFSM in the facade (Router.ts).\n */\nexport class RouterLifecycleNamespace {\n // ═══════════════════════════════════════════════════════════════════════════\n // Functional references for cyclic dependencies\n // ═══════════════════════════════════════════════════════════════════════════\n\n // Dependencies injected via setDependencies (replaces full router reference)\n #navigateToState!: (\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n ) => Promise<State>;\n\n #deps!: RouterLifecycleDependencies;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // =========================================================================\n\n /**\n * Validates start() arguments.\n */\n static validateStartArgs(args: unknown[]): void {\n /* v8 ignore next 4 -- @preserve: facade enforces 1 arg via TypeScript signature */\n if (args.length !== 1 || typeof args[0] !== \"string\") {\n throw new Error(\n \"[router.start] Expected exactly 1 string argument (startPath).\",\n );\n }\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n /**\n * Sets the navigateToState reference (cyclic dependency on NavigationNamespace).\n * Must be called before using start().\n */\n setNavigateToState(\n fn: (\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n ) => Promise<State>,\n ): void {\n this.#navigateToState = fn;\n }\n\n /**\n * Sets dependencies for lifecycle operations.\n * Must be called before using lifecycle methods.\n */\n setDependencies(deps: RouterLifecycleDependencies): void {\n this.#deps = deps;\n }\n\n // =========================================================================\n // Instance methods\n // =========================================================================\n\n /**\n * Starts the router with the given path.\n *\n * Guards (concurrent start, already started) are handled by the facade via\n * RouterFSM state checks before this method is called.\n */\n async start(startPath: string): Promise<State> {\n const deps = this.#deps;\n const options = deps.getOptions();\n\n const startOptions: NavigationOptions = {\n replace: true,\n };\n\n const matchedState = deps.matchPath(startPath);\n\n if (!matchedState && !options.allowNotFound) {\n const err = new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n path: startPath,\n });\n\n deps.emitTransitionError(undefined, undefined, err);\n\n throw err;\n }\n\n deps.completeStart();\n\n let finalState: State;\n\n if (matchedState) {\n finalState = await this.#navigateToState(\n matchedState,\n undefined,\n startOptions,\n );\n } else {\n const notFoundState = deps.makeNotFoundState(startPath, startOptions);\n\n finalState = await this.#navigateToState(\n notFoundState,\n undefined,\n startOptions,\n );\n }\n\n return finalState;\n }\n\n /**\n * Stops the router and resets state.\n *\n * Called only for READY/TRANSITIONING states (facade handles STARTING/IDLE/DISPOSED).\n */\n stop(): void {\n this.#deps.setState();\n }\n}\n","// packages/core/src/namespaces/CloneNamespace/CloneNamespace.ts\n\nimport { getTypeDescription } from \"type-guards\";\n\nimport type { ApplyConfigFn, CloneData, RouterFactory } from \"./types\";\nimport type { Router } from \"../../Router\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\n/**\n * Independent namespace for router cloning operations.\n *\n * This namespace handles the logic of collecting data from a source router\n * and creating a configured clone. It requires a factory function to create\n * the new router instance.\n */\nexport class CloneNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n // =========================================================================\n // Instance fields\n // =========================================================================\n\n /**\n * Function to get cloning data from the source router.\n */\n #getCloneData!: () => CloneData<Dependencies>;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // =========================================================================\n\n /**\n * Validates clone arguments.\n * Dependencies can be undefined or a plain object without getters.\n */\n static validateCloneArgs(dependencies: unknown): void {\n // undefined is valid (no new dependencies)\n if (dependencies === undefined) {\n return;\n }\n\n // Must be a plain object\n if (\n !(\n dependencies &&\n typeof dependencies === \"object\" &&\n dependencies.constructor === Object\n )\n ) {\n throw new TypeError(\n `[router.clone] Invalid dependencies: expected plain object or undefined, received ${getTypeDescription(dependencies)}`,\n );\n }\n\n // Getters can throw, return different values, or have side effects\n for (const key in dependencies) {\n if (Object.getOwnPropertyDescriptor(dependencies, key)?.get) {\n throw new TypeError(\n `[router.clone] Getters not allowed in dependencies: \"${key}\"`,\n );\n }\n }\n }\n\n /**\n * Sets the function to collect clone data.\n */\n setGetCloneData(getCloneData: () => CloneData<Dependencies>): void {\n this.#getCloneData = getCloneData;\n }\n\n /**\n * Creates a clone of the router with optional new dependencies.\n *\n * @param dependencies - Optional new dependencies for the cloned router\n * @param factory - Factory function to create the new router instance\n * @param applyConfig - Function to apply route config to the new router\n */\n clone(\n dependencies: Dependencies | undefined,\n factory: RouterFactory<Dependencies>,\n applyConfig: ApplyConfigFn<Dependencies>,\n ): Router<Dependencies> {\n // Collect all data from source router\n const data = this.#getCloneData();\n\n // Merge dependencies\n const mergedDeps = {\n ...data.dependencies,\n ...dependencies,\n } as Dependencies;\n\n // Create new router instance\n const newRouter = factory(data.routes, data.options, mergedDeps);\n\n // Copy lifecycle factories\n for (const [name, handler] of Object.entries(data.canDeactivateFactories)) {\n newRouter.addDeactivateGuard(name, handler);\n }\n\n for (const [name, handler] of Object.entries(data.canActivateFactories)) {\n newRouter.addActivateGuard(name, handler);\n }\n\n // Copy middleware factories\n if (data.middlewareFactories.length > 0) {\n newRouter.useMiddleware(...data.middlewareFactories);\n }\n\n // Copy plugin factories\n if (data.pluginFactories.length > 0) {\n newRouter.usePlugin(...data.pluginFactories);\n }\n\n // Apply route config (decoders, encoders, defaultParams, forwardMap)\n applyConfig(newRouter, data.routeConfig, data.resolvedForwardMap);\n\n return newRouter;\n }\n}\n","// packages/core/src/namespaces/EventBusNamespace/EventBusNamespace.ts\n\nimport { events, validEventNames } from \"../../constants\";\nimport { routerEvents, routerStates } from \"../../fsm\";\n\nimport type { EventBusOptions } from \"./types\";\nimport type { RouterEvent, RouterPayloads, RouterState } from \"../../fsm\";\nimport type { RouterError } from \"../../RouterError\";\nimport type { EventMethodMap, RouterEventMap } from \"../../types\";\nimport type { FSM } from \"@real-router/fsm\";\nimport type {\n EventName,\n NavigationOptions,\n Plugin,\n State,\n SubscribeFn,\n Unsubscribe,\n} from \"@real-router/types\";\nimport type { EventEmitter } from \"event-emitter\";\n\nexport class EventBusNamespace {\n readonly #fsm: FSM<RouterState, RouterEvent, null, RouterPayloads>;\n readonly #emitter: EventEmitter<RouterEventMap>;\n\n #currentToState: State | undefined;\n\n constructor(options: EventBusOptions) {\n this.#fsm = options.routerFSM;\n this.#emitter = options.emitter;\n this.#currentToState = undefined;\n this.#setupFSMActions();\n }\n\n static validateEventName(eventName: unknown): void {\n if (!validEventNames.has(eventName as EventName)) {\n throw new Error(`Invalid event name: ${String(eventName)}`);\n }\n }\n\n static validateListenerArgs<E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ): void {\n EventBusNamespace.validateEventName(eventName);\n\n if (typeof cb !== \"function\") {\n throw new TypeError(\n `Expected callback to be a function for event ${eventName}`,\n );\n }\n }\n\n static validateSubscribeListener(listener: unknown): void {\n if (typeof listener !== \"function\") {\n throw new TypeError(\n \"[router.subscribe] Expected a function. \" +\n \"For Observable pattern use @real-router/rx package\",\n );\n }\n }\n\n emitRouterStart(): void {\n this.#emitter.emit(events.ROUTER_START);\n }\n\n emitRouterStop(): void {\n this.#emitter.emit(events.ROUTER_STOP);\n }\n\n emitTransitionStart(toState: State, fromState?: State): void {\n this.#emitter.emit(events.TRANSITION_START, toState, fromState);\n }\n\n emitTransitionSuccess(\n toState: State,\n fromState?: State,\n opts?: NavigationOptions,\n ): void {\n this.#emitter.emit(events.TRANSITION_SUCCESS, toState, fromState, opts);\n }\n\n emitTransitionError(\n toState?: State,\n fromState?: State,\n error?: RouterError,\n ): void {\n this.#emitter.emit(events.TRANSITION_ERROR, toState, fromState, error);\n }\n\n emitTransitionCancel(toState: State, fromState?: State): void {\n this.#emitter.emit(events.TRANSITION_CANCEL, toState, fromState);\n }\n\n sendStart(): void {\n this.#fsm.send(routerEvents.START);\n }\n\n sendStop(): void {\n this.#fsm.send(routerEvents.STOP);\n }\n\n sendDispose(): void {\n this.#fsm.send(routerEvents.DISPOSE);\n }\n\n completeStart(): void {\n this.#fsm.send(routerEvents.STARTED);\n }\n\n beginTransition(toState: State, fromState?: State): void {\n this.#currentToState = toState;\n this.#fsm.send(routerEvents.NAVIGATE, { toState, fromState });\n }\n\n completeTransition(\n state: State,\n fromState?: State,\n opts: NavigationOptions = {},\n ): void {\n this.#fsm.send(routerEvents.COMPLETE, {\n state,\n fromState,\n opts,\n });\n this.#currentToState = undefined;\n }\n\n failTransition(toState?: State, fromState?: State, error?: unknown): void {\n this.#fsm.send(routerEvents.FAIL, { toState, fromState, error });\n this.#currentToState = undefined;\n }\n\n cancelTransition(toState: State, fromState?: State): void {\n this.#fsm.send(routerEvents.CANCEL, { toState, fromState });\n this.#currentToState = undefined;\n }\n\n emitOrFailTransitionError(\n toState?: State,\n fromState?: State,\n error?: unknown,\n ): void {\n if (this.#fsm.getState() === routerStates.READY) {\n this.#fsm.send(routerEvents.FAIL, { toState, fromState, error });\n } else {\n // TRANSITIONING: concurrent navigation with invalid args.\n // Direct emit to avoid disturbing the ongoing transition.\n this.emitTransitionError(toState, fromState, error as RouterError);\n }\n }\n\n canBeginTransition(): boolean {\n return this.#fsm.canSend(routerEvents.NAVIGATE);\n }\n\n canStart(): boolean {\n return this.#fsm.canSend(routerEvents.START);\n }\n\n canCancel(): boolean {\n return this.#fsm.canSend(routerEvents.CANCEL);\n }\n\n isActive(): boolean {\n const s = this.#fsm.getState();\n\n return s !== routerStates.IDLE && s !== routerStates.DISPOSED;\n }\n\n isDisposed(): boolean {\n return this.#fsm.getState() === routerStates.DISPOSED;\n }\n\n isTransitioning(): boolean {\n return this.#fsm.getState() === routerStates.TRANSITIONING;\n }\n\n isReady(): boolean {\n return this.#fsm.getState() === routerStates.READY;\n }\n\n getCurrentToState(): State | undefined {\n return this.#currentToState;\n }\n\n addEventListener<E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ): Unsubscribe {\n return this.#emitter.on(\n eventName,\n cb as (...args: RouterEventMap[typeof eventName]) => void,\n );\n }\n\n subscribe(listener: SubscribeFn): Unsubscribe {\n return this.#emitter.on(\n events.TRANSITION_SUCCESS,\n (toState: State, fromState?: State) => {\n listener({ route: toState, previousRoute: fromState });\n },\n );\n }\n\n clearAll(): void {\n this.#emitter.clearAll();\n }\n\n setLimits(limits: {\n maxListeners: number;\n warnListeners: number;\n maxEventDepth: number;\n }): void {\n this.#emitter.setLimits(limits);\n }\n\n cancelTransitionIfRunning(fromState: State | undefined): void {\n if (!this.canCancel()) {\n return;\n }\n\n this.cancelTransition(this.#currentToState!, fromState); // eslint-disable-line @typescript-eslint/no-non-null-assertion -- guaranteed set before TRANSITIONING\n }\n\n #setupFSMActions(): void {\n const fsm = this.#fsm;\n\n fsm.on(routerStates.STARTING, routerEvents.STARTED, () => {\n this.emitRouterStart();\n });\n\n fsm.on(routerStates.READY, routerEvents.STOP, () => {\n this.emitRouterStop();\n });\n\n fsm.on(routerStates.READY, routerEvents.NAVIGATE, (params) => {\n this.emitTransitionStart(params.toState, params.fromState);\n });\n\n fsm.on(routerStates.TRANSITIONING, routerEvents.COMPLETE, (params) => {\n this.emitTransitionSuccess(params.state, params.fromState, params.opts);\n });\n\n fsm.on(routerStates.TRANSITIONING, routerEvents.CANCEL, (params) => {\n this.emitTransitionCancel(params.toState, params.fromState);\n });\n\n fsm.on(routerStates.STARTING, routerEvents.FAIL, (params) => {\n this.emitTransitionError(\n params.toState,\n params.fromState,\n params.error as RouterError | undefined,\n );\n });\n\n fsm.on(routerStates.READY, routerEvents.FAIL, (params) => {\n this.emitTransitionError(\n params.toState,\n params.fromState,\n params.error as RouterError | undefined,\n );\n });\n\n fsm.on(routerStates.TRANSITIONING, routerEvents.FAIL, (params) => {\n this.emitTransitionError(\n params.toState,\n params.fromState,\n params.error as RouterError | undefined,\n );\n });\n }\n}\n","// packages/core/src/namespaces/RouterLifecycleNamespace/constants.ts\n\nimport { errorCodes } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\n\n// =============================================================================\n// Cached Errors (Performance Optimization)\n// =============================================================================\n// Pre-create error instances to avoid object allocation on hot paths.\n// Error creation involves: new object, stack trace capture (~500ns-2μs).\n// Cached errors skip this overhead entirely.\n//\n// Trade-off: All error instances share the same stack trace (points here).\n// This is acceptable because:\n// 1. These errors indicate user misconfiguration, not internal bugs\n// 2. Error code and message are sufficient for debugging\n// 3. Performance gain (~80% for error paths) outweighs stack trace loss\n// =============================================================================\n\n/**\n * Cached error for start() called when router is already started/starting.\n */\nexport const CACHED_ALREADY_STARTED_ERROR = new RouterError(\n errorCodes.ROUTER_ALREADY_STARTED,\n);\n","// packages/real-router/modules/typeGuards.ts\n\n/**\n * Re-export common type guards from centralized type-guards package\n */\nimport type { LoggerConfig, LogLevelConfig } from \"@real-router/logger\";\n\nexport {\n isObjKey,\n isString,\n isState,\n isParams,\n isNavigationOptions,\n isPromise,\n isBoolean,\n validateRouteName,\n} from \"type-guards\";\n\n/**\n * RealRouter-specific type guards for logger configuration\n */\n\nconst VALID_LEVELS_SET = new Set<string>([\"all\", \"warn-error\", \"error-only\"]);\n\nfunction isValidLevel(value: unknown): value is LogLevelConfig {\n return typeof value === \"string\" && VALID_LEVELS_SET.has(value);\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `\"${value}\"`;\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(value);\n}\n\nexport function isLoggerConfig(config: unknown): config is LoggerConfig {\n if (typeof config !== \"object\" || config === null) {\n throw new TypeError(\"Logger config must be an object\");\n }\n\n const obj = config;\n\n // Check for unknown properties\n for (const key of Object.keys(obj)) {\n if (key !== \"level\" && key !== \"callback\") {\n throw new TypeError(`Unknown logger config property: \"${key}\"`);\n }\n }\n\n // Validate level if present\n if (\"level\" in obj && obj.level !== undefined && !isValidLevel(obj.level)) {\n throw new TypeError(\n `Invalid logger level: ${formatValue(obj.level)}. Expected: \"all\" | \"warn-error\" | \"error-only\"`,\n );\n }\n\n // Validate callback if present\n if (\n \"callback\" in obj &&\n obj.callback !== undefined &&\n typeof obj.callback !== \"function\"\n ) {\n throw new TypeError(\n `Logger callback must be a function, got ${typeof obj.callback}`,\n );\n }\n\n return true;\n}\n","// packages/core/src/wiring/RouterWiringBuilder.ts\n\nimport type { EventBusNamespace } from \"../namespaces\";\nimport type { WiringOptions } from \"./types\";\nimport type { MiddlewareDependencies } from \"../namespaces/MiddlewareNamespace\";\nimport type {\n NavigationDependencies,\n TransitionDependencies,\n} from \"../namespaces/NavigationNamespace\";\nimport type { PluginsDependencies } from \"../namespaces/PluginsNamespace\";\nimport type { RouteLifecycleDependencies } from \"../namespaces/RouteLifecycleNamespace\";\nimport type { RouterLifecycleDependencies } from \"../namespaces/RouterLifecycleNamespace\";\nimport type { RoutesDependencies } from \"../namespaces/RoutesNamespace\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\nexport class RouterWiringBuilder<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n private readonly router: WiringOptions<Dependencies>[\"router\"];\n private readonly options: WiringOptions<Dependencies>[\"options\"];\n private readonly limits: WiringOptions<Dependencies>[\"limits\"];\n private readonly dependencies: WiringOptions<Dependencies>[\"dependencies\"];\n private readonly state: WiringOptions<Dependencies>[\"state\"];\n private readonly routes: WiringOptions<Dependencies>[\"routes\"];\n private readonly routeLifecycle: WiringOptions<Dependencies>[\"routeLifecycle\"];\n private readonly middleware: WiringOptions<Dependencies>[\"middleware\"];\n private readonly plugins: WiringOptions<Dependencies>[\"plugins\"];\n private readonly navigation: WiringOptions<Dependencies>[\"navigation\"];\n private readonly lifecycle: WiringOptions<Dependencies>[\"lifecycle\"];\n private readonly clone: WiringOptions<Dependencies>[\"clone\"];\n private readonly eventBus: EventBusNamespace;\n\n constructor(wiringOptions: WiringOptions<Dependencies>) {\n this.router = wiringOptions.router;\n this.options = wiringOptions.options;\n this.limits = wiringOptions.limits;\n this.dependencies = wiringOptions.dependencies;\n this.state = wiringOptions.state;\n this.routes = wiringOptions.routes;\n this.routeLifecycle = wiringOptions.routeLifecycle;\n this.middleware = wiringOptions.middleware;\n this.plugins = wiringOptions.plugins;\n this.navigation = wiringOptions.navigation;\n this.lifecycle = wiringOptions.lifecycle;\n this.clone = wiringOptions.clone;\n this.eventBus = wiringOptions.eventBus;\n }\n\n wireLimits(): void {\n this.dependencies.setLimits(this.limits);\n this.plugins.setLimits(this.limits);\n this.middleware.setLimits(this.limits);\n this.eventBus.setLimits({\n maxListeners: this.limits.maxListeners,\n warnListeners: this.limits.warnListeners,\n maxEventDepth: this.limits.maxEventDepth,\n });\n this.routeLifecycle.setLimits(this.limits);\n }\n\n wireRouteLifecycleDeps(): void {\n this.routeLifecycle.setRouter(this.router);\n\n const routeLifecycleDeps: RouteLifecycleDependencies<Dependencies> = {\n getDependency: <K extends keyof Dependencies>(dependencyName: K) =>\n this.dependencies.get(dependencyName),\n };\n\n this.routeLifecycle.setDependencies(routeLifecycleDeps);\n }\n\n wireRoutesDeps(): void {\n const routesDeps: RoutesDependencies<Dependencies> = {\n addActivateGuard: (name, handler) => {\n this.router.addActivateGuard(name, handler);\n },\n addDeactivateGuard: (name, handler) => {\n this.router.addDeactivateGuard(name, handler);\n },\n makeState: (name, params, path, meta) =>\n this.state.makeState(name, params, path, meta),\n getState: () => this.state.get(),\n areStatesEqual: (state1, state2, ignoreQueryParams) =>\n this.state.areStatesEqual(state1, state2, ignoreQueryParams),\n getDependency: (name) => this.dependencies.get(name),\n forwardState: (name, params) => this.router.forwardState(name, params),\n };\n\n this.routes.setDependencies(routesDeps);\n this.routes.setLifecycleNamespace(this.routeLifecycle);\n }\n\n wireMiddlewareDeps(): void {\n this.middleware.setRouter(this.router);\n\n const middlewareDeps: MiddlewareDependencies<Dependencies> = {\n getDependency: <K extends keyof Dependencies>(dependencyName: K) =>\n this.dependencies.get(dependencyName),\n };\n\n this.middleware.setDependencies(middlewareDeps);\n }\n\n wirePluginsDeps(): void {\n this.plugins.setRouter(this.router);\n\n const pluginsDeps: PluginsDependencies<Dependencies> = {\n addEventListener: (eventName, cb) =>\n this.eventBus.addEventListener(eventName, cb),\n canNavigate: () => this.eventBus.canBeginTransition(),\n getDependency: <K extends keyof Dependencies>(dependencyName: K) =>\n this.dependencies.get(dependencyName),\n };\n\n this.plugins.setDependencies(pluginsDeps);\n }\n\n wireNavigationDeps(): void {\n const navigationDeps: NavigationDependencies = {\n getOptions: () => this.options.get(),\n hasRoute: (name) => this.routes.hasRoute(name),\n getState: () => this.state.get(),\n setState: (state) => {\n this.state.set(state);\n },\n buildStateWithSegments: (routeName, routeParams) => {\n const { name, params } = this.router.forwardState(\n routeName,\n routeParams,\n );\n\n return this.routes.buildStateWithSegmentsResolved(name, params);\n },\n makeState: (name, params, path, meta) =>\n this.state.makeState(name, params, path, meta),\n buildPath: (route, params) =>\n this.routes.buildPath(route, params, this.options.get()),\n areStatesEqual: (state1, state2, ignoreQueryParams) =>\n this.state.areStatesEqual(state1, state2, ignoreQueryParams),\n getDependency: (name: string) =>\n this.dependencies.get(name as keyof Dependencies),\n startTransition: (toState, fromState) => {\n this.eventBus.beginTransition(toState, fromState);\n },\n cancelNavigation: () => {\n this.eventBus.cancelTransition(\n this.eventBus.getCurrentToState()!, // eslint-disable-line @typescript-eslint/no-non-null-assertion -- guaranteed set before TRANSITIONING\n this.state.get(),\n );\n },\n sendTransitionDone: (state, fromState, opts) => {\n this.eventBus.completeTransition(state, fromState, opts);\n },\n sendTransitionBlocked: (toState, fromState, error) => {\n this.eventBus.failTransition(toState, fromState, error);\n },\n sendTransitionError: (toState, fromState, error) => {\n this.eventBus.failTransition(toState, fromState, error);\n },\n emitTransitionError: (toState, fromState, error) => {\n this.eventBus.emitOrFailTransitionError(toState, fromState, error);\n },\n };\n\n this.navigation.setDependencies(navigationDeps);\n\n const transitionDeps: TransitionDependencies = {\n getLifecycleFunctions: () => this.routeLifecycle.getFunctions(),\n getMiddlewareFunctions: () => this.middleware.getFunctions(),\n isActive: () => this.router.isActive(),\n isTransitioning: () => this.eventBus.isTransitioning(),\n clearCanDeactivate: (name) => {\n this.routeLifecycle.clearCanDeactivate(name);\n },\n };\n\n this.navigation.setTransitionDependencies(transitionDeps);\n }\n\n wireLifecycleDeps(): void {\n const lifecycleDeps: RouterLifecycleDependencies = {\n getOptions: () => this.options.get(),\n makeNotFoundState: (path, options) =>\n this.state.makeNotFoundState(path, options),\n setState: (state) => {\n this.state.set(state);\n },\n matchPath: (path) => this.routes.matchPath(path, this.options.get()),\n completeStart: () => {\n this.eventBus.completeStart();\n },\n emitTransitionError: (toState, fromState, error) => {\n this.eventBus.failTransition(toState, fromState, error);\n },\n };\n\n this.lifecycle.setDependencies(lifecycleDeps);\n }\n\n wireStateDeps(): void {\n this.state.setDependencies({\n getDefaultParams: () => this.routes.getConfig().defaultParams,\n buildPath: (name, params) =>\n this.routes.buildPath(name, params, this.options.get()),\n getUrlParams: (name) => this.routes.getUrlParams(name),\n });\n }\n\n wireCloneCallbacks(): void {\n this.clone.setGetCloneData(() => {\n const [canDeactivateFactories, canActivateFactories] =\n this.routeLifecycle.getFactories();\n\n return {\n routes: this.routes.cloneRoutes(),\n options: { ...this.options.get() },\n dependencies: this.dependencies.getAll(),\n canDeactivateFactories,\n canActivateFactories,\n middlewareFactories: this.middleware.getFactories(),\n pluginFactories: this.plugins.getAll(),\n routeConfig: this.routes.getConfig(),\n resolvedForwardMap: this.routes.getResolvedForwardMap(),\n };\n });\n }\n\n wireCyclicDeps(): void {\n this.navigation.setCanNavigate(() => this.eventBus.canBeginTransition());\n\n this.lifecycle.setNavigateToState((toState, fromState, opts) =>\n this.navigation.navigateToState(toState, fromState, opts),\n );\n }\n}\n","// packages/core/src/wiring/wireRouter.ts\n\nimport type { RouterWiringBuilder } from \"./RouterWiringBuilder\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\n/**\n * Director function — calls RouterWiringBuilder methods in the correct dependency order.\n *\n * ORDER MATTERS:\n * - `wireLimits()` first: all namespaces must have limits before any other setup\n * - `wireRouteLifecycleDeps()` BEFORE `wireRoutesDeps()`: RoutesNamespace.setDependencies()\n * registers pending canActivate handlers which require RouteLifecycleNamespace to be ready\n * - `wireCyclicDeps()` LAST: resolves circular references between NavigationNamespace and\n * RouterLifecycleNamespace (they depend on each other via direct property assignment)\n */\nexport function wireRouter<Dependencies extends DefaultDependencies>(\n builder: RouterWiringBuilder<Dependencies>,\n): void {\n builder.wireLimits();\n builder.wireRouteLifecycleDeps();\n builder.wireRoutesDeps();\n builder.wireMiddlewareDeps();\n builder.wirePluginsDeps();\n builder.wireNavigationDeps();\n builder.wireLifecycleDeps();\n builder.wireStateDeps();\n builder.wireCloneCallbacks();\n builder.wireCyclicDeps();\n}\n","// packages/core/src/Router.ts\n/* eslint-disable unicorn/prefer-event-target -- custom EventEmitter package, not Node.js EventEmitter */\n\n/**\n * Router class - facade with integrated namespaces.\n *\n * All functionality is now provided by namespace classes.\n */\n\nimport { logger } from \"@real-router/logger\";\nimport { EventEmitter } from \"event-emitter\";\nimport { validateRouteName } from \"type-guards\";\n\nimport { errorCodes } from \"./constants\";\nimport { createRouterFSM } from \"./fsm\";\nimport { createLimits } from \"./helpers\";\nimport {\n CloneNamespace,\n DependenciesNamespace,\n EventBusNamespace,\n MiddlewareNamespace,\n NavigationNamespace,\n OptionsNamespace,\n PluginsNamespace,\n RouteLifecycleNamespace,\n RouterLifecycleNamespace,\n RoutesNamespace,\n StateNamespace,\n} from \"./namespaces\";\nimport { CACHED_ALREADY_STARTED_ERROR } from \"./namespaces/RouterLifecycleNamespace/constants\";\nimport { RouterError } from \"./RouterError\";\nimport { getTransitionPath } from \"./transitionPath\";\nimport { isLoggerConfig } from \"./typeGuards\";\nimport { RouterWiringBuilder, wireRouter } from \"./wiring\";\n\nimport type {\n ActivationFnFactory,\n EventMethodMap,\n Limits,\n MiddlewareFactory,\n PluginFactory,\n Route,\n RouteConfigUpdate,\n RouterEventMap,\n} from \"./types\";\nimport type {\n DefaultDependencies,\n EventName,\n NavigationOptions,\n Options,\n Params,\n Plugin,\n RouteTreeState,\n SimpleState,\n State,\n StateMetaInput,\n SubscribeFn,\n Unsubscribe,\n} from \"@real-router/types\";\nimport type { CreateMatcherOptions } from \"route-tree\";\n\n/**\n * Router class with integrated namespace architecture.\n *\n * All functionality is provided by namespace classes:\n * - OptionsNamespace: getOptions (immutable)\n * - DependenciesNamespace: get/set/remove dependencies\n * - EventEmitter: event listeners, subscribe\n * - StateNamespace: state storage (getState, setState, getPreviousState)\n * - RoutesNamespace: route tree operations\n * - RouteLifecycleNamespace: canActivate/canDeactivate guards\n * - MiddlewareNamespace: middleware chain\n * - PluginsNamespace: plugin lifecycle\n * - NavigationNamespace: navigate, navigateToState\n * - RouterLifecycleNamespace: start, stop, isStarted\n *\n * @internal This class implementation is internal. Use createRouter() instead.\n */\nexport class Router<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n // Index signatures to satisfy interface\n [key: string]: unknown;\n\n // ============================================================================\n // Namespaces\n // ============================================================================\n\n readonly #options: OptionsNamespace;\n readonly #limits: Limits;\n readonly #dependencies: DependenciesNamespace<Dependencies>;\n readonly #state: StateNamespace;\n readonly #routes: RoutesNamespace<Dependencies>;\n readonly #routeLifecycle: RouteLifecycleNamespace<Dependencies>;\n readonly #middleware: MiddlewareNamespace<Dependencies>;\n readonly #plugins: PluginsNamespace<Dependencies>;\n readonly #navigation: NavigationNamespace;\n readonly #lifecycle: RouterLifecycleNamespace;\n readonly #clone: CloneNamespace<Dependencies>;\n\n readonly #eventBus: EventBusNamespace;\n\n /**\n * When true, skips argument validation in public methods for production performance.\n * Constructor options are always validated (needed to validate noValidate itself).\n */\n readonly #noValidate: boolean;\n\n // ============================================================================\n // Constructor\n // ============================================================================\n\n /**\n * @param routes - Route definitions\n * @param options - Router options\n * @param dependencies - DI dependencies\n */\n constructor(\n routes: Route<Dependencies>[] = [],\n options: Partial<Options> = {},\n dependencies: Dependencies = {} as Dependencies,\n ) {\n // Configure logger if provided\n if (options.logger && isLoggerConfig(options.logger)) {\n logger.configure(options.logger);\n delete options.logger;\n }\n\n // =========================================================================\n // Validate inputs before creating namespaces\n // =========================================================================\n\n // Always validate options (needed to validate noValidate itself)\n OptionsNamespace.validateOptions(options, \"constructor\");\n\n // Extract noValidate BEFORE creating namespaces\n const noValidate = options.noValidate ?? false;\n\n // Conditional validation for dependencies\n if (!noValidate) {\n DependenciesNamespace.validateDependenciesObject(\n dependencies,\n \"constructor\",\n );\n }\n\n // Conditional validation for initial routes - structure and batch duplicates\n // Validation happens BEFORE tree is built, so tree is not passed\n if (!noValidate && routes.length > 0) {\n RoutesNamespace.validateAddRouteArgs(routes);\n RoutesNamespace.validateRoutes(routes);\n }\n\n // =========================================================================\n // Create Namespaces\n // =========================================================================\n\n this.#options = new OptionsNamespace(options);\n this.#limits = createLimits(options.limits);\n this.#dependencies = new DependenciesNamespace<Dependencies>(dependencies);\n this.#state = new StateNamespace();\n this.#routes = new RoutesNamespace<Dependencies>(\n routes,\n noValidate,\n deriveMatcherOptions(this.#options.get()),\n );\n this.#routeLifecycle = new RouteLifecycleNamespace<Dependencies>();\n this.#middleware = new MiddlewareNamespace<Dependencies>();\n this.#plugins = new PluginsNamespace<Dependencies>();\n this.#navigation = new NavigationNamespace();\n this.#lifecycle = new RouterLifecycleNamespace();\n this.#clone = new CloneNamespace<Dependencies>();\n this.#noValidate = noValidate;\n\n // =========================================================================\n // Initialize EventBus\n // =========================================================================\n\n const routerFSM = createRouterFSM();\n const emitter = new EventEmitter<RouterEventMap>({\n onListenerError: (eventName, error) => {\n logger.error(\"Router\", `Error in listener for ${eventName}:`, error);\n },\n onListenerWarn: (eventName, count) => {\n logger.warn(\n \"router.addEventListener\",\n `Event \"${eventName}\" has ${count} listeners — possible memory leak`,\n );\n },\n });\n\n this.#eventBus = new EventBusNamespace({ routerFSM, emitter });\n\n // =========================================================================\n // Wire Dependencies\n // =========================================================================\n\n wireRouter(\n new RouterWiringBuilder<Dependencies>({\n router: this,\n options: this.#options,\n limits: this.#limits,\n dependencies: this.#dependencies,\n state: this.#state,\n routes: this.#routes,\n routeLifecycle: this.#routeLifecycle,\n middleware: this.#middleware,\n plugins: this.#plugins,\n navigation: this.#navigation,\n lifecycle: this.#lifecycle,\n clone: this.#clone,\n eventBus: this.#eventBus,\n }),\n );\n\n // =========================================================================\n // Bind Public Methods\n // =========================================================================\n // All public methods that access private fields must be bound to preserve\n // `this` context when methods are extracted as references.\n // See: https://github.com/nicolo-ribaudo/tc39-proposal-bind-operator\n // =========================================================================\n\n // Route Management\n this.addRoute = this.addRoute.bind(this);\n this.removeRoute = this.removeRoute.bind(this);\n this.clearRoutes = this.clearRoutes.bind(this);\n this.getRoute = this.getRoute.bind(this);\n this.hasRoute = this.hasRoute.bind(this);\n this.updateRoute = this.updateRoute.bind(this);\n\n // Path & State Building\n this.isActiveRoute = this.isActiveRoute.bind(this);\n this.buildPath = this.buildPath.bind(this);\n this.matchPath = this.matchPath.bind(this);\n this.setRootPath = this.setRootPath.bind(this);\n this.getRootPath = this.getRootPath.bind(this);\n\n // State Management\n this.makeState = this.makeState.bind(this);\n this.getState = this.getState.bind(this);\n this.getPreviousState = this.getPreviousState.bind(this);\n this.areStatesEqual = this.areStatesEqual.bind(this);\n this.forwardState = this.forwardState.bind(this);\n this.buildState = this.buildState.bind(this);\n this.buildNavigationState = this.buildNavigationState.bind(this);\n this.shouldUpdateNode = this.shouldUpdateNode.bind(this);\n\n // Options\n this.getOptions = this.getOptions.bind(this);\n\n // Router Lifecycle\n this.isActive = this.isActive.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.dispose = this.dispose.bind(this);\n\n // Route Lifecycle (Guards)\n this.addActivateGuard = this.addActivateGuard.bind(this);\n this.addDeactivateGuard = this.addDeactivateGuard.bind(this);\n this.removeActivateGuard = this.removeActivateGuard.bind(this);\n this.removeDeactivateGuard = this.removeDeactivateGuard.bind(this);\n this.canNavigateTo = this.canNavigateTo.bind(this);\n\n // Plugins\n this.usePlugin = this.usePlugin.bind(this);\n\n // Middleware\n this.useMiddleware = this.useMiddleware.bind(this);\n // Dependencies\n this.setDependency = this.setDependency.bind(this);\n this.setDependencies = this.setDependencies.bind(this);\n this.getDependency = this.getDependency.bind(this);\n this.getDependencies = this.getDependencies.bind(this);\n this.removeDependency = this.removeDependency.bind(this);\n this.hasDependency = this.hasDependency.bind(this);\n this.resetDependencies = this.resetDependencies.bind(this);\n\n // Events\n this.addEventListener = this.addEventListener.bind(this);\n\n // Navigation\n this.navigate = this.navigate.bind(this);\n this.navigateToDefault = this.navigateToDefault.bind(this);\n this.navigateToState = this.navigateToState.bind(this);\n\n // Subscription\n this.subscribe = this.subscribe.bind(this);\n\n // Cloning\n this.clone = this.clone.bind(this);\n }\n\n // ============================================================================\n // Route Management\n // ============================================================================\n\n addRoute(\n routes: Route<Dependencies>[] | Route<Dependencies>,\n options?: { parent?: string },\n ): this {\n const routeArray = Array.isArray(routes) ? routes : [routes];\n const parentName = options?.parent;\n\n if (!this.#noValidate) {\n // 1. Validate parent option format\n if (parentName !== undefined) {\n RoutesNamespace.validateParentOption(parentName);\n }\n\n // 2. Static validation (route structure and properties)\n RoutesNamespace.validateAddRouteArgs(routeArray);\n\n // 3. State-dependent validation (parent exists, duplicates, forwardTo)\n RoutesNamespace.validateRoutes(\n routeArray,\n this.#routes.getTree(),\n this.#routes.getForwardRecord(),\n parentName,\n );\n }\n\n // 4. Execute (add definitions, register handlers, rebuild tree)\n this.#routes.addRoutes(routeArray, parentName);\n\n return this;\n }\n\n removeRoute(name: string): this {\n // Static validation\n if (!this.#noValidate) {\n RoutesNamespace.validateRemoveRouteArgs(name);\n }\n\n // Instance validation (checks active route, navigation state)\n const canRemove = this.#routes.validateRemoveRoute(\n name,\n this.#state.get()?.name,\n this.#eventBus.isTransitioning(),\n );\n\n if (!canRemove) {\n return this;\n }\n\n // Perform removal\n const wasRemoved = this.#routes.removeRoute(name);\n\n if (!wasRemoved) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" not found. No changes made.`,\n );\n }\n\n return this;\n }\n\n clearRoutes(): this {\n const isNavigating = this.#eventBus.isTransitioning();\n\n // Validate operation can proceed\n const canClear = this.#routes.validateClearRoutes(isNavigating);\n\n if (!canClear) {\n return this;\n }\n\n // Clear routes config (definitions, decoders, encoders, defaultParams, forwardMap)\n this.#routes.clearRoutes();\n\n // Clear all lifecycle handlers\n this.#routeLifecycle.clearAll();\n\n // Clear router state since all routes are removed\n this.#state.set(undefined);\n\n return this;\n }\n\n getRoute(name: string): Route<Dependencies> | undefined {\n if (!this.#noValidate) {\n validateRouteName(name, \"getRoute\");\n }\n\n return this.#routes.getRoute(name);\n }\n\n hasRoute(name: string): boolean {\n if (!this.#noValidate) {\n validateRouteName(name, \"hasRoute\");\n }\n\n return this.#routes.hasRoute(name);\n }\n\n updateRoute(name: string, updates: RouteConfigUpdate<Dependencies>): this {\n // Validate name and updates object structure (basic checks only)\n if (!this.#noValidate) {\n RoutesNamespace.validateUpdateRouteBasicArgs(name, updates);\n }\n\n // Cache all property values upfront to protect against mutating getters.\n // This ensures consistent behavior regardless of getter side effects.\n // Must happen AFTER basic validation but BEFORE property type validation.\n const {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n canActivate,\n canDeactivate,\n } = updates;\n\n // Validate cached property values\n if (!this.#noValidate) {\n RoutesNamespace.validateUpdateRoutePropertyTypes(\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n );\n }\n\n // Warn if navigation is in progress\n if (this.#eventBus.isTransitioning()) {\n logger.error(\n \"router.updateRoute\",\n `Updating route \"${name}\" while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n // Instance validation (route existence, forwardTo checks) - use cached values\n if (!this.#noValidate) {\n this.#routes.validateUpdateRoute(name, forwardTo);\n }\n\n // Update route config\n this.#routes.updateRouteConfig(name, {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n });\n\n // Handle canActivate separately (uses RouteLifecycleNamespace)\n // Use facade method for proper validation\n if (canActivate !== undefined) {\n if (canActivate === null) {\n this.#routeLifecycle.clearCanActivate(name);\n } else {\n this.addActivateGuard(name, canActivate);\n }\n }\n\n // Handle canDeactivate separately (uses RouteLifecycleNamespace)\n // Use facade method for proper validation\n if (canDeactivate !== undefined) {\n if (canDeactivate === null) {\n this.#routeLifecycle.clearCanDeactivate(name);\n } else {\n this.addDeactivateGuard(name, canDeactivate);\n }\n }\n\n return this;\n }\n\n // ============================================================================\n // Path & State Building\n // ============================================================================\n\n isActiveRoute(\n name: string,\n params?: Params,\n strictEquality?: boolean,\n ignoreQueryParams?: boolean,\n ): boolean {\n if (!this.#noValidate) {\n RoutesNamespace.validateIsActiveRouteArgs(\n name,\n params,\n strictEquality,\n ignoreQueryParams,\n );\n }\n\n // Empty string is special case - warn and return false (root node is not a parent)\n if (name === \"\") {\n logger.warn(\n \"real-router\",\n 'isActiveRoute(\"\") called with empty string. Root node is not considered a parent of any route.',\n );\n\n return false;\n }\n\n return this.#routes.isActiveRoute(\n name,\n params,\n strictEquality,\n ignoreQueryParams,\n );\n }\n\n buildPath(route: string, params?: Params): string {\n if (!this.#noValidate) {\n RoutesNamespace.validateBuildPathArgs(route);\n }\n\n return this.#routes.buildPath(route, params, this.#options.get());\n }\n\n matchPath<P extends Params = Params, MP extends Params = Params>(\n path: string,\n ): State<P, MP> | undefined {\n if (!this.#noValidate) {\n RoutesNamespace.validateMatchPathArgs(path);\n }\n\n return this.#routes.matchPath<P, MP>(path, this.#options.get());\n }\n\n setRootPath(rootPath: string): void {\n if (!this.#noValidate) {\n RoutesNamespace.validateSetRootPathArgs(rootPath);\n }\n\n this.#routes.setRootPath(rootPath);\n }\n\n getRootPath(): string {\n return this.#routes.getRootPath();\n }\n\n // ============================================================================\n // State Management (delegated to StateNamespace)\n // ============================================================================\n\n makeState<P extends Params = Params, MP extends Params = Params>(\n name: string,\n params?: P,\n path?: string,\n meta?: StateMetaInput<MP>,\n forceId?: number,\n ): State<P, MP> {\n if (!this.#noValidate) {\n StateNamespace.validateMakeStateArgs(name, params, path, forceId);\n }\n\n return this.#state.makeState<P, MP>(name, params, path, meta, forceId);\n }\n\n getState<P extends Params = Params, MP extends Params = Params>():\n | State<P, MP>\n | undefined {\n return this.#state.get<P, MP>();\n }\n\n getPreviousState(): State | undefined {\n return this.#state.getPrevious();\n }\n\n areStatesEqual(\n state1: State | undefined,\n state2: State | undefined,\n ignoreQueryParams = true,\n ): boolean {\n if (!this.#noValidate) {\n StateNamespace.validateAreStatesEqualArgs(\n state1,\n state2,\n ignoreQueryParams,\n );\n }\n\n return this.#state.areStatesEqual(state1, state2, ignoreQueryParams);\n }\n\n forwardState<P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ): SimpleState<P> {\n if (!this.#noValidate) {\n RoutesNamespace.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"forwardState\",\n );\n }\n\n return this.#routes.forwardState<P>(routeName, routeParams);\n }\n\n buildState(\n routeName: string,\n routeParams: Params,\n ): RouteTreeState | undefined {\n if (!this.#noValidate) {\n RoutesNamespace.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"buildState\",\n );\n }\n\n // Call forwardState at facade level to allow plugin interception\n const { name, params } = this.forwardState(routeName, routeParams);\n\n return this.#routes.buildStateResolved(name, params);\n }\n\n buildNavigationState(name: string, params: Params = {}): State | undefined {\n if (!this.#noValidate) {\n RoutesNamespace.validateStateBuilderArgs(\n name,\n params,\n \"buildNavigationState\",\n );\n }\n\n const routeInfo = this.buildState(name, params);\n\n if (!routeInfo) {\n return undefined;\n }\n\n return this.makeState(\n routeInfo.name,\n routeInfo.params,\n this.buildPath(routeInfo.name, routeInfo.params),\n {\n params: routeInfo.meta,\n options: {},\n },\n );\n }\n\n shouldUpdateNode(\n nodeName: string,\n ): (toState: State, fromState?: State) => boolean {\n if (!this.#noValidate) {\n RoutesNamespace.validateShouldUpdateNodeArgs(nodeName);\n }\n\n return this.#routes.shouldUpdateNode(nodeName);\n }\n\n // ============================================================================\n // Options (backed by OptionsNamespace)\n // ============================================================================\n\n getOptions(): Options {\n return this.#options.get();\n }\n\n // ============================================================================\n // Router Lifecycle\n // ============================================================================\n\n isActive(): boolean {\n return this.#eventBus.isActive();\n }\n\n async start(startPath: string): Promise<State> {\n // Static validation\n if (!this.#noValidate) {\n RouterLifecycleNamespace.validateStartArgs([startPath]);\n }\n\n if (!this.#eventBus.canStart()) {\n throw CACHED_ALREADY_STARTED_ERROR;\n }\n\n this.#eventBus.sendStart();\n\n try {\n return await this.#lifecycle.start(startPath);\n } catch (error) {\n if (this.#eventBus.isReady()) {\n this.#lifecycle.stop();\n this.#eventBus.sendStop();\n }\n\n throw error;\n }\n }\n\n stop(): this {\n this.#eventBus.cancelTransitionIfRunning(this.#state.get());\n\n if (!this.#eventBus.isReady() && !this.#eventBus.isTransitioning()) {\n return this;\n }\n\n this.#lifecycle.stop();\n this.#eventBus.sendStop();\n\n return this;\n }\n\n dispose(): void {\n if (this.#eventBus.isDisposed()) {\n return;\n }\n\n this.#eventBus.cancelTransitionIfRunning(this.#state.get());\n\n if (this.#eventBus.isReady() || this.#eventBus.isTransitioning()) {\n this.#lifecycle.stop();\n this.#eventBus.sendStop();\n }\n\n this.#eventBus.sendDispose();\n this.#eventBus.clearAll();\n\n this.#plugins.disposeAll();\n this.#middleware.clearAll();\n this.#routes.clearRoutes();\n this.#routeLifecycle.clearAll();\n this.#state.reset();\n this.#dependencies.reset();\n\n this.#markDisposed();\n }\n\n // ============================================================================\n // Route Lifecycle (Guards)\n // ============================================================================\n\n addDeactivateGuard(\n name: string,\n canDeactivateHandler: ActivationFnFactory<Dependencies> | boolean,\n ): this {\n if (!this.#noValidate) {\n validateRouteName(name, \"addDeactivateGuard\");\n RouteLifecycleNamespace.validateHandler(\n canDeactivateHandler,\n \"addDeactivateGuard\",\n );\n }\n\n this.#routeLifecycle.addCanDeactivate(\n name,\n canDeactivateHandler,\n this.#noValidate,\n );\n\n return this;\n }\n\n addActivateGuard(\n name: string,\n canActivateHandler: ActivationFnFactory<Dependencies> | boolean,\n ): this {\n if (!this.#noValidate) {\n validateRouteName(name, \"addActivateGuard\");\n RouteLifecycleNamespace.validateHandler(\n canActivateHandler,\n \"addActivateGuard\",\n );\n }\n\n this.#routeLifecycle.addCanActivate(\n name,\n canActivateHandler,\n this.#noValidate,\n );\n\n return this;\n }\n\n removeActivateGuard(name: string): void {\n if (!this.#noValidate) {\n validateRouteName(name, \"removeActivateGuard\");\n }\n\n this.#routeLifecycle.clearCanActivate(name);\n }\n\n removeDeactivateGuard(name: string): void {\n if (!this.#noValidate) {\n validateRouteName(name, \"removeDeactivateGuard\");\n }\n\n this.#routeLifecycle.clearCanDeactivate(name);\n }\n\n canNavigateTo(name: string, params?: Params): boolean {\n if (!this.#noValidate) {\n validateRouteName(name, \"canNavigateTo\");\n }\n\n if (!this.hasRoute(name)) {\n return false;\n }\n\n const { name: resolvedName, params: resolvedParams } = this.forwardState(\n name,\n params ?? {},\n );\n const toState = this.makeState(resolvedName, resolvedParams);\n const fromState = this.getState();\n\n const { toDeactivate, toActivate } = getTransitionPath(toState, fromState);\n\n for (const segment of toDeactivate) {\n if (\n !this.#routeLifecycle.checkDeactivateGuardSync(\n segment,\n toState,\n fromState,\n )\n ) {\n return false;\n }\n }\n\n for (const segment of toActivate) {\n if (\n !this.#routeLifecycle.checkActivateGuardSync(\n segment,\n toState,\n fromState,\n )\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n // ============================================================================\n // Plugins\n // ============================================================================\n\n usePlugin(...plugins: PluginFactory<Dependencies>[]): Unsubscribe {\n if (!this.#noValidate) {\n // 1. Validate input arguments\n PluginsNamespace.validateUsePluginArgs<Dependencies>(plugins);\n\n // 2. Validate limit\n PluginsNamespace.validatePluginLimit(\n this.#plugins.count(),\n plugins.length,\n this.#limits.maxPlugins,\n );\n\n // 3. Validate no duplicates with existing plugins\n PluginsNamespace.validateNoDuplicatePlugins(\n plugins,\n this.#plugins.has.bind(this.#plugins),\n );\n }\n\n // 4. Execute (warnings, deduplication, initialization, commit)\n return this.#plugins.use(...plugins);\n }\n\n // ============================================================================\n // Middleware\n // ============================================================================\n\n useMiddleware(\n ...middlewares: MiddlewareFactory<Dependencies>[]\n ): Unsubscribe {\n if (!this.#noValidate) {\n // 1. Validate input arguments\n MiddlewareNamespace.validateUseMiddlewareArgs<Dependencies>(middlewares);\n\n // 2. Validate no duplicates\n MiddlewareNamespace.validateNoDuplicates<Dependencies>(\n middlewares,\n this.#middleware.getFactories(),\n );\n\n // 3. Validate limit\n MiddlewareNamespace.validateMiddlewareLimit(\n this.#middleware.count(),\n middlewares.length,\n this.#limits.maxMiddleware,\n );\n }\n\n // 4. Initialize (without committing)\n const initialized = this.#middleware.initialize(...middlewares);\n\n // 5. Validate results\n if (!this.#noValidate) {\n for (const { middleware, factory } of initialized) {\n MiddlewareNamespace.validateMiddleware<Dependencies>(\n middleware,\n factory,\n );\n }\n }\n\n // 6. Commit\n return this.#middleware.commit(initialized);\n }\n\n // ============================================================================\n // Dependencies (backed by DependenciesNamespace)\n // ============================================================================\n\n setDependency<K extends keyof Dependencies & string>(\n dependencyName: K,\n dependency: Dependencies[K],\n ): this {\n if (!this.#noValidate) {\n DependenciesNamespace.validateSetDependencyArgs(dependencyName);\n }\n\n this.#dependencies.set(dependencyName, dependency);\n\n return this;\n }\n\n setDependencies(deps: Dependencies): this {\n if (!this.#noValidate) {\n DependenciesNamespace.validateDependenciesObject(deps, \"setDependencies\");\n DependenciesNamespace.validateDependencyLimit(\n this.#dependencies.count(),\n Object.keys(deps).length,\n \"setDependencies\",\n this.#limits.maxDependencies,\n );\n }\n\n this.#dependencies.setMultiple(deps);\n\n return this;\n }\n\n getDependency<K extends keyof Dependencies>(key: K): Dependencies[K] {\n if (!this.#noValidate) {\n DependenciesNamespace.validateName(key, \"getDependency\");\n }\n\n const value = this.#dependencies.get(key);\n\n if (!this.#noValidate) {\n DependenciesNamespace.validateDependencyExists(value, key as string);\n }\n\n return value;\n }\n\n getDependencies(): Partial<Dependencies> {\n return this.#dependencies.getAll();\n }\n\n removeDependency(dependencyName: keyof Dependencies): this {\n if (!this.#noValidate) {\n DependenciesNamespace.validateName(dependencyName, \"removeDependency\");\n }\n\n this.#dependencies.remove(dependencyName);\n\n return this;\n }\n\n hasDependency(dependencyName: keyof Dependencies): boolean {\n if (!this.#noValidate) {\n DependenciesNamespace.validateName(dependencyName, \"hasDependency\");\n }\n\n return this.#dependencies.has(dependencyName);\n }\n\n resetDependencies(): this {\n this.#dependencies.reset();\n\n return this;\n }\n\n // ============================================================================\n // Events (backed by EventEmitter)\n // ============================================================================\n\n addEventListener<E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ): Unsubscribe {\n if (!this.#noValidate) {\n EventBusNamespace.validateListenerArgs(eventName, cb);\n }\n\n return this.#eventBus.addEventListener(eventName, cb);\n }\n\n // ============================================================================\n // Subscription (backed by EventEmitter)\n // ============================================================================\n\n subscribe(listener: SubscribeFn): Unsubscribe {\n if (!this.#noValidate) {\n EventBusNamespace.validateSubscribeListener(listener);\n }\n\n return this.#eventBus.subscribe(listener);\n }\n\n // ============================================================================\n // Navigation\n // ============================================================================\n\n navigate(routeName: string): Promise<State>;\n navigate(routeName: string, routeParams: Params): Promise<State>;\n navigate(\n routeName: string,\n routeParams: Params,\n options: NavigationOptions,\n ): Promise<State>;\n navigate(\n routeName: string,\n routeParams?: Params,\n options?: NavigationOptions,\n ): Promise<State> {\n // 1. Validate route name\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigateArgs(routeName);\n }\n\n // 2. Validate parsed options\n const opts = options ?? {};\n\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigationOptions(opts, \"navigate\");\n }\n\n // 3. Execute navigation with parsed arguments\n const promiseState = this.#navigation.navigate(\n routeName,\n routeParams ?? {},\n opts,\n );\n\n Router.#suppressUnhandledRejection(promiseState);\n\n return promiseState;\n }\n\n navigateToDefault(): Promise<State>;\n navigateToDefault(options: NavigationOptions): Promise<State>;\n navigateToDefault(options?: NavigationOptions): Promise<State> {\n // 1. Validate arguments\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigateToDefaultArgs(options);\n }\n\n // 2. Validate parsed options\n const opts = options ?? {};\n\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigationOptions(opts, \"navigateToDefault\");\n }\n\n // 3. Execute navigation with parsed arguments\n const promiseState = this.#navigation.navigateToDefault(opts);\n\n Router.#suppressUnhandledRejection(promiseState);\n\n return promiseState;\n }\n\n navigateToState(\n toState: State,\n fromState: State | undefined,\n opts: NavigationOptions,\n ): Promise<State> {\n if (!this.#noValidate) {\n NavigationNamespace.validateNavigateToStateArgs(toState, fromState, opts);\n }\n\n return this.#navigation.navigateToState(toState, fromState, opts);\n }\n\n // ============================================================================\n // Cloning\n // ============================================================================\n\n clone(dependencies?: Dependencies): Router<Dependencies> {\n if (!this.#noValidate) {\n CloneNamespace.validateCloneArgs(dependencies);\n }\n\n return this.#clone.clone(\n dependencies,\n (routes, options, deps) =>\n new Router<Dependencies>(routes, options, deps),\n (newRouter, config, resolvedForwardMap) => {\n const typedRouter = newRouter as unknown as Router<Dependencies>;\n\n typedRouter.#routes.applyClonedConfig(config, resolvedForwardMap);\n },\n );\n }\n\n /**\n * Pre-allocated callback for #suppressUnhandledRejection.\n * Avoids creating a new closure on every navigate() call.\n */\n static readonly #onSuppressedError = (error: unknown): void => {\n if (\n error instanceof RouterError &&\n (error.code === errorCodes.SAME_STATES ||\n error.code === errorCodes.TRANSITION_CANCELLED ||\n error.code === errorCodes.ROUTER_NOT_STARTED ||\n error.code === errorCodes.ROUTE_NOT_FOUND)\n ) {\n return;\n }\n\n logger.error(\"router.navigate\", \"Unexpected navigation error\", error);\n };\n\n /**\n * Fire-and-forget safety: prevents unhandled rejection warnings\n * when navigate/navigateToDefault is called without await.\n * Expected errors are silently suppressed; unexpected ones are logged.\n */\n static #suppressUnhandledRejection(promise: Promise<State>): void {\n promise.catch(Router.#onSuppressedError);\n }\n\n #markDisposed(): void {\n this.navigate = throwDisposed as never;\n this.navigateToDefault = throwDisposed as never;\n this.navigateToState = throwDisposed as never;\n this.start = throwDisposed as never;\n this.stop = throwDisposed as never;\n this.addRoute = throwDisposed as never;\n this.removeRoute = throwDisposed as never;\n this.clearRoutes = throwDisposed as never;\n this.updateRoute = throwDisposed as never;\n this.addActivateGuard = throwDisposed as never;\n this.addDeactivateGuard = throwDisposed as never;\n this.removeActivateGuard = throwDisposed as never;\n this.removeDeactivateGuard = throwDisposed as never;\n this.usePlugin = throwDisposed as never;\n this.useMiddleware = throwDisposed as never;\n this.setDependency = throwDisposed as never;\n this.setDependencies = throwDisposed as never;\n this.removeDependency = throwDisposed as never;\n this.resetDependencies = throwDisposed as never;\n this.addEventListener = throwDisposed as never;\n this.subscribe = throwDisposed as never;\n this.setRootPath = throwDisposed as never;\n this.clone = throwDisposed as never;\n this.canNavigateTo = throwDisposed as never;\n }\n}\n\nfunction throwDisposed(): never {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n}\n\n/**\n * Derives CreateMatcherOptions from router Options.\n * Maps core option names to matcher option names.\n */\nfunction deriveMatcherOptions(\n options: Readonly<Options>,\n): CreateMatcherOptions {\n return {\n strictTrailingSlash: options.trailingSlash === \"strict\",\n strictQueryParams: options.queryParamsMode === \"strict\",\n urlParamsEncoding: options.urlParamsEncoding,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n queryParams: options.queryParams!,\n };\n}\n","// packages/core/src/createRouter.ts\n\nimport { Router } from \"./Router\";\n\nimport type { Route } from \"./types\";\nimport type { DefaultDependencies, Options } from \"@real-router/types\";\n\n/**\n * Creates a new router instance.\n *\n * @param routes - Array of route definitions\n * @param options - Router configuration options\n * @param dependencies - Dependencies to inject into the router\n * @returns A new Router instance\n *\n * @example\n * const router = createRouter([\n * { name: 'home', path: '/' },\n * { name: 'users', path: '/users' },\n * ]);\n *\n * router.start('/');\n */\nexport const createRouter = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routes: Route<Dependencies>[] = [],\n options: Partial<Options> = {},\n dependencies: Dependencies = {} as Dependencies,\n): Router<Dependencies> => {\n return new Router<Dependencies>(routes, options, dependencies);\n};\n","import type { Router } from \"./Router\";\nimport type { Navigator, DefaultDependencies } from \"@real-router/types\";\n\nexport const getNavigator = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n): Navigator =>\n Object.freeze({\n navigate: router.navigate,\n getState: router.getState,\n isActiveRoute: router.isActiveRoute,\n canNavigateTo: router.canNavigateTo,\n subscribe: router.subscribe,\n });\n"]}