@navios/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +145 -0
  3. package/dist/index.d.mts +425 -0
  4. package/dist/index.d.ts +425 -0
  5. package/dist/index.js +1744 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.mjs +1657 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +45 -0
  10. package/src/__tests__/controller.spec.mts +59 -0
  11. package/src/attribute.factory.mts +155 -0
  12. package/src/decorators/controller.decorator.mts +36 -0
  13. package/src/decorators/endpoint.decorator.mts +81 -0
  14. package/src/decorators/index.mts +4 -0
  15. package/src/decorators/module.decorator.mts +47 -0
  16. package/src/decorators/use-guards.decorator.mts +43 -0
  17. package/src/exceptions/bad-request.exception.mts +7 -0
  18. package/src/exceptions/conflict.exception.mts +7 -0
  19. package/src/exceptions/forbidden.exception.mts +7 -0
  20. package/src/exceptions/http.exception.mts +7 -0
  21. package/src/exceptions/index.mts +7 -0
  22. package/src/exceptions/internal-server-error.exception.mts +7 -0
  23. package/src/exceptions/not-found.exception.mts +10 -0
  24. package/src/exceptions/unauthorized.exception.mts +7 -0
  25. package/src/index.mts +10 -0
  26. package/src/interfaces/can-activate.mts +5 -0
  27. package/src/interfaces/index.mts +2 -0
  28. package/src/interfaces/navios-module.mts +3 -0
  29. package/src/metadata/controller.metadata.mts +71 -0
  30. package/src/metadata/endpoint.metadata.mts +69 -0
  31. package/src/metadata/index.mts +4 -0
  32. package/src/metadata/injectable.metadata.mts +11 -0
  33. package/src/metadata/module.metadata.mts +62 -0
  34. package/src/navios.application.mts +113 -0
  35. package/src/navios.factory.mts +17 -0
  36. package/src/service-locator/__tests__/injectable.spec.mts +170 -0
  37. package/src/service-locator/decorators/get-injectable-token.mts +23 -0
  38. package/src/service-locator/decorators/index.mts +2 -0
  39. package/src/service-locator/decorators/injectable.decorator.mts +103 -0
  40. package/src/service-locator/enums/index.mts +1 -0
  41. package/src/service-locator/enums/injectable-scope.enum.mts +10 -0
  42. package/src/service-locator/errors/errors.enum.mts +7 -0
  43. package/src/service-locator/errors/factory-not-found.mts +8 -0
  44. package/src/service-locator/errors/index.mts +6 -0
  45. package/src/service-locator/errors/instance-destroying.mts +8 -0
  46. package/src/service-locator/errors/instance-expired.mts +8 -0
  47. package/src/service-locator/errors/instance-not-found.mts +8 -0
  48. package/src/service-locator/errors/unknown-error.mts +15 -0
  49. package/src/service-locator/event-emitter.mts +107 -0
  50. package/src/service-locator/index.mts +14 -0
  51. package/src/service-locator/inject.mts +37 -0
  52. package/src/service-locator/injection-token.mts +36 -0
  53. package/src/service-locator/injector.mts +18 -0
  54. package/src/service-locator/interfaces/factory.interface.mts +3 -0
  55. package/src/service-locator/override.mts +22 -0
  56. package/src/service-locator/proxy-service-locator.mts +80 -0
  57. package/src/service-locator/service-locator-abstract-factory-context.mts +23 -0
  58. package/src/service-locator/service-locator-event-bus.mts +96 -0
  59. package/src/service-locator/service-locator-instance-holder.mts +63 -0
  60. package/src/service-locator/service-locator-manager.mts +89 -0
  61. package/src/service-locator/service-locator.mts +445 -0
  62. package/src/service-locator/sync-injector.mts +55 -0
  63. package/src/services/controller-adapter.service.mts +124 -0
  64. package/src/services/execution-context.mts +53 -0
  65. package/src/services/guard-runner.service.mts +93 -0
  66. package/src/services/index.mts +4 -0
  67. package/src/services/module-loader.service.mts +68 -0
  68. package/src/tokens/application.token.mts +9 -0
  69. package/src/tokens/execution-context.token.mts +8 -0
  70. package/src/tokens/index.mts +4 -0
  71. package/src/tokens/reply.token.mts +7 -0
  72. package/src/tokens/request.token.mts +9 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../packages/core/src/index.mts","../../../../packages/core/src/metadata/endpoint.metadata.mts","../../../../packages/core/src/metadata/controller.metadata.mts","../../../../packages/core/src/metadata/module.metadata.mts","../../../../packages/core/src/service-locator/enums/injectable-scope.enum.mts","../../../../packages/core/src/service-locator/injection-token.mts","../../../../packages/core/src/service-locator/errors/errors.enum.mts","../../../../packages/core/src/service-locator/errors/factory-not-found.mts","../../../../packages/core/src/service-locator/errors/instance-destroying.mts","../../../../packages/core/src/service-locator/errors/instance-expired.mts","../../../../packages/core/src/service-locator/errors/instance-not-found.mts","../../../../packages/core/src/service-locator/errors/unknown-error.mts","../../../../packages/core/src/service-locator/service-locator-event-bus.mts","../../../../packages/core/src/service-locator/service-locator-instance-holder.mts","../../../../packages/core/src/service-locator/service-locator-manager.mts","../../../../packages/core/src/service-locator/service-locator.mts","../../../../packages/core/src/service-locator/injector.mts","../../../../packages/core/src/service-locator/proxy-service-locator.mts","../../../../packages/core/src/service-locator/sync-injector.mts","../../../../packages/core/src/service-locator/decorators/injectable.decorator.mts","../../../../packages/core/src/service-locator/decorators/get-injectable-token.mts","../../../../packages/core/src/service-locator/event-emitter.mts","../../../../packages/core/src/service-locator/inject.mts","../../../../packages/core/src/service-locator/override.mts","../../../../packages/core/src/decorators/controller.decorator.mts","../../../../packages/core/src/decorators/endpoint.decorator.mts","../../../../packages/core/src/decorators/module.decorator.mts","../../../../packages/core/src/decorators/use-guards.decorator.mts","../../../../packages/core/src/exceptions/http.exception.mts","../../../../packages/core/src/exceptions/bad-request.exception.mts","../../../../packages/core/src/exceptions/forbidden.exception.mts","../../../../packages/core/src/exceptions/internal-server-error.exception.mts","../../../../packages/core/src/exceptions/not-found.exception.mts","../../../../packages/core/src/exceptions/unauthorized.exception.mts","../../../../packages/core/src/exceptions/conflict.exception.mts","../../../../packages/core/src/tokens/application.token.mts","../../../../packages/core/src/tokens/execution-context.token.mts","../../../../packages/core/src/tokens/reply.token.mts","../../../../packages/core/src/tokens/request.token.mts","../../../../packages/core/src/services/execution-context.mts","../../../../packages/core/src/services/guard-runner.service.mts","../../../../packages/core/src/services/controller-adapter.service.mts","../../../../packages/core/src/services/module-loader.service.mts","../../../../packages/core/src/attribute.factory.mts","../../../../packages/core/src/navios.application.mts","../../../../packages/core/src/navios.factory.mts"],"sourcesContent":["export * from './decorators/index.mjs'\nexport * from './exceptions/index.mjs'\nexport * from './interfaces/index.mjs'\nexport * from './metadata/index.mjs'\nexport * from './service-locator/index.mjs'\nexport * from './services/index.mjs'\nexport * from './tokens/index.mjs'\nexport * from './attribute.factory.mjs'\nexport * from './navios.application.mjs'\nexport * from './navios.factory.mjs'\n","import type { BaseEndpointConfig, HttpMethod } from '@navios/common'\n\nimport type { CanActivate } from '../interfaces/index.mjs'\nimport type {\n ClassTypeWithInstance,\n InjectionToken,\n} from '../service-locator/index.mjs'\n\nexport const EndpointMetadataKey = Symbol('EndpointMetadataKey')\n\nexport interface EndpointMetadata {\n classMethod: string\n url: string\n httpMethod: HttpMethod\n config: BaseEndpointConfig | null\n guards: Set<\n ClassTypeWithInstance<CanActivate> | InjectionToken<CanActivate, undefined>\n >\n customAttributes: Map<string | symbol, any>\n}\n\nexport function getAllEndpointMetadata(\n context: ClassMethodDecoratorContext | ClassDecoratorContext,\n): Set<EndpointMetadata> {\n if (context.metadata) {\n const metadata = context.metadata[EndpointMetadataKey] as\n | Set<EndpointMetadata>\n | undefined\n if (metadata) {\n return metadata\n } else {\n context.metadata[EndpointMetadataKey] = new Set<EndpointMetadata>()\n return context.metadata[EndpointMetadataKey] as Set<EndpointMetadata>\n }\n }\n throw new Error('[Navios] Wrong environment.')\n}\n\nexport function getEndpointMetadata(\n target: Function,\n context: ClassMethodDecoratorContext,\n): EndpointMetadata {\n if (context.metadata) {\n const metadata = getAllEndpointMetadata(context)\n if (metadata) {\n const endpointMetadata = Array.from(metadata).find(\n (item) => item.classMethod === target.name,\n )\n if (endpointMetadata) {\n return endpointMetadata\n } else {\n const newMetadata: EndpointMetadata = {\n classMethod: target.name,\n url: '',\n httpMethod: 'GET',\n config: null,\n guards: new Set<\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n >(),\n customAttributes: new Map<string | symbol, any>(),\n }\n metadata.add(newMetadata)\n return newMetadata\n }\n }\n }\n throw new Error('[Navios] Wrong environment.')\n}\n","import type { CanActivate } from '../interfaces/index.mjs'\nimport type {\n ClassType,\n ClassTypeWithInstance,\n InjectionToken,\n} from '../service-locator/index.mjs'\nimport type { EndpointMetadata } from './endpoint.metadata.mjs'\n\nimport { getAllEndpointMetadata } from './endpoint.metadata.mjs'\n\nexport const ControllerMetadataKey = Symbol('ControllerMetadataKey')\n\nexport interface ControllerMetadata {\n endpoints: Set<EndpointMetadata>\n guards: Set<\n ClassTypeWithInstance<CanActivate> | InjectionToken<CanActivate, undefined>\n >\n customAttributes: Map<string | symbol, any>\n}\n\nexport function getControllerMetadata(\n target: ClassType,\n context: ClassDecoratorContext,\n): ControllerMetadata {\n if (context.metadata) {\n const metadata = context.metadata[ControllerMetadataKey] as\n | ControllerMetadata\n | undefined\n if (metadata) {\n return metadata\n } else {\n const endpointsMetadata = getAllEndpointMetadata(context)\n const newMetadata: ControllerMetadata = {\n endpoints: endpointsMetadata,\n guards: new Set<\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n >(),\n customAttributes: new Map<string | symbol, any>(),\n }\n context.metadata[ControllerMetadataKey] = newMetadata\n // @ts-expect-error We add a custom metadata key to the target\n target[ControllerMetadataKey] = newMetadata\n return newMetadata\n }\n }\n throw new Error('[Navios] Wrong environment.')\n}\n\nexport function extractControllerMetadata(\n target: ClassType,\n): ControllerMetadata {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ControllerMetadataKey] as\n | ControllerMetadata\n | undefined\n if (!metadata) {\n throw new Error(\n '[Navios] Controller metadata not found. Make sure to use @Controller decorator.',\n )\n }\n return metadata\n}\n\nexport function hasControllerMetadata(target: ClassType): boolean {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ControllerMetadataKey] as\n | ControllerMetadata\n | undefined\n return !!metadata\n}\n","import type { CanActivate } from '../index.mjs'\nimport type {\n ClassType,\n ClassTypeWithInstance,\n InjectionToken,\n} from '../service-locator/index.mjs'\n\nexport const ModuleMetadataKey = Symbol('ControllerMetadataKey')\n\nexport interface ModuleMetadata {\n controllers: Set<ClassType>\n imports: Set<ClassType>\n guards: Set<\n ClassTypeWithInstance<CanActivate> | InjectionToken<CanActivate, undefined>\n >\n customAttributes: Map<string | symbol, any>\n}\n\nexport function getModuleMetadata(\n target: ClassType,\n context: ClassDecoratorContext,\n): ModuleMetadata {\n if (context.metadata) {\n const metadata = context.metadata[ModuleMetadataKey] as\n | ModuleMetadata\n | undefined\n if (metadata) {\n return metadata\n } else {\n const newMetadata: ModuleMetadata = {\n controllers: new Set<ClassType>(),\n imports: new Set<ClassType>(),\n guards: new Set<\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n >(),\n customAttributes: new Map<string | symbol, any>(),\n }\n context.metadata[ModuleMetadataKey] = newMetadata\n // @ts-expect-error We add a custom metadata key to the target\n target[ModuleMetadataKey] = newMetadata\n return newMetadata\n }\n }\n throw new Error('[Navios] Wrong environment.')\n}\n\nexport function extractModuleMetadata(target: ClassType): ModuleMetadata {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ModuleMetadataKey] as ModuleMetadata | undefined\n if (!metadata) {\n throw new Error(\n '[Navios] Module metadata not found. Make sure to use @Module decorator.',\n )\n }\n return metadata\n}\n\nexport function hasModuleMetadata(target: ClassType): boolean {\n // @ts-expect-error We add a custom metadata key to the target\n return !!target[ModuleMetadataKey]\n}\n","export enum InjectableScope {\n /**\n * Singleton scope: The instance is created once and shared across the application.\n */\n Singleton = 'Singleton',\n /**\n * Instance scope: A new instance is created for each injection.\n */\n Instance = 'Instance',\n}\n","import type { AnyZodObject } from 'zod'\n\nimport { randomUUID } from 'crypto'\n\nexport type ClassType = new (...args: any[]) => any\n\nexport type ClassTypeWithInstance<T> = new (...args: any[]) => T\n\nexport class InjectionToken<T, S extends AnyZodObject | unknown = unknown> {\n public id = randomUUID()\n constructor(\n public readonly name: string | symbol | ClassType,\n public readonly schema: AnyZodObject | undefined,\n ) {}\n\n static create<T extends ClassType>(\n name: T,\n ): InjectionToken<InstanceType<T>, undefined>\n static create<T extends ClassType, Schema extends AnyZodObject>(\n name: T,\n schema: Schema,\n ): InjectionToken<InstanceType<T>, Schema>\n static create<T>(name: string): InjectionToken<T, undefined>\n static create<T, Schema extends AnyZodObject>(\n name: string,\n schema: Schema,\n ): InjectionToken<T, Schema>\n static create(name: string, schema?: unknown) {\n // @ts-expect-error\n return new InjectionToken(name, schema)\n }\n\n toString() {\n return this.name\n }\n}\n","export enum ErrorsEnum {\n InstanceExpired = 'InstanceExpired',\n InstanceNotFound = 'InstanceNotFound',\n InstanceDestroying = 'InstanceDestroying',\n UnknownError = 'UnknownError',\n FactoryNotFound = 'FactoryNotFound',\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class FactoryNotFound extends Error {\n code = ErrorsEnum.FactoryNotFound\n constructor(public name: string) {\n super(`Factory ${name} not found`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceDestroying extends Error {\n code = ErrorsEnum.InstanceDestroying\n constructor(public name: string) {\n super(`Instance ${name} destroying`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceExpired extends Error {\n code = ErrorsEnum.InstanceExpired\n constructor(public name: string) {\n super(`Instance ${name} expired`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceNotFound extends Error {\n code = ErrorsEnum.InstanceNotFound\n constructor(public name: string) {\n super(`Instance ${name} not found`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class UnknownError extends Error {\n code = ErrorsEnum.UnknownError\n parent?: Error\n\n constructor(message: string | Error) {\n if (message instanceof Error) {\n super(message.message)\n this.parent = message\n return\n }\n super(message)\n }\n}\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\ntype ListenersMap = Map<string, Map<string, Set<Function>>>\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nexport class ServiceLocatorEventBus {\n private listeners: ListenersMap = new Map()\n constructor(private readonly logger: Console | null = null) {}\n\n on<Event extends string | `pre:${string}` | `post:${string}`>(\n ns: string,\n event: Event,\n listener: (event: Event) => void,\n ) {\n this.logger?.debug(`[ServiceLocatorEventBus]#on(): ns:${ns} event:${event}`)\n if (!this.listeners.has(ns)) {\n this.listeners.set(ns, new Map())\n }\n\n const nsEvents = this.listeners.get(ns)!\n if (!nsEvents.has(event)) {\n nsEvents.set(event, new Set())\n }\n\n nsEvents.get(event)!.add(listener)\n\n return () => {\n nsEvents.get(event)!.delete(listener)\n if (nsEvents.get(event)?.size === 0) {\n nsEvents.delete(event)\n }\n if (nsEvents.size === 0) {\n this.listeners.delete(ns)\n }\n }\n }\n\n async emit(key: string, event: string) {\n if (!this.listeners.has(key)) {\n return\n }\n\n const events = this.listeners.get(key)!\n\n const preEvent = `pre:${event}`\n const postEvent = `post:${event}`\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${preEvent}`)\n await Promise.allSettled(\n [...(events.get(preEvent) ?? [])].map((listener) => listener(preEvent)),\n ).then((results) => {\n results\n .filter((result) => result.status === 'rejected')\n .forEach((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${preEvent} rejected with`,\n result.reason,\n )\n })\n })\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${event}`)\n\n const res = await Promise.allSettled(\n [...(events.get(event) ?? [])!].map((listener) => listener(event)),\n ).then((results) => {\n const res = results\n .filter((result) => result.status === 'rejected')\n .map((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${event} rejected with`,\n result.reason,\n )\n return result\n })\n\n if (res.length > 0) {\n return Promise.reject(res)\n }\n return results\n })\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${postEvent}`)\n await Promise.allSettled(\n [...(events.get(postEvent) ?? [])].map((listener) => listener(postEvent)),\n ).then((results) => {\n results\n .filter((result) => result.status === 'rejected')\n .forEach((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${postEvent} rejected with`,\n result.reason,\n )\n })\n })\n return res\n }\n}\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\n\nexport enum ServiceLocatorInstanceHolderKind {\n Instance = 'instance',\n Factory = 'factory',\n AbstractFactory = 'abstractFactory',\n}\n\nexport enum ServiceLocatorInstanceHolderStatus {\n Created = 'created',\n Creating = 'creating',\n Destroying = 'destroying',\n}\n\nexport type ServiceLocatorInstanceEffect = () => void\nexport type ServiceLocatorInstanceDestroyListener = () => void | Promise<void>\n\nexport interface ServiceLocatorInstanceHolderCreating<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Creating\n name: string\n instance: null\n creationPromise: Promise<[undefined, Instance]> | null\n destroyPromise: null\n kind: ServiceLocatorInstanceHolderKind\n effects: ServiceLocatorInstanceEffect[]\n deps: string[]\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderCreated<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Created\n name: string\n instance: Instance\n creationPromise: null\n destroyPromise: null\n kind: ServiceLocatorInstanceHolderKind\n effects: ServiceLocatorInstanceEffect[]\n deps: string[]\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderDestroying<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Destroying\n name: string\n instance: Instance | null\n creationPromise: null\n destroyPromise: Promise<void>\n kind: ServiceLocatorInstanceHolderKind\n effects: ServiceLocatorInstanceEffect[]\n deps: string[]\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport type ServiceLocatorInstanceHolder<Instance = unknown> =\n | ServiceLocatorInstanceHolderCreating<Instance>\n | ServiceLocatorInstanceHolderCreated<Instance>\n | ServiceLocatorInstanceHolderDestroying<Instance>\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport {\n ErrorsEnum,\n InstanceDestroying,\n InstanceExpired,\n InstanceNotFound,\n} from './errors/index.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\n\nexport class ServiceLocatorManager {\n private readonly instancesHolders: Map<string, ServiceLocatorInstanceHolder> =\n new Map()\n\n constructor(private readonly logger: Console | null = null) {}\n\n get(\n name: string,\n ):\n | [InstanceExpired | InstanceDestroying, ServiceLocatorInstanceHolder]\n | [InstanceNotFound]\n | [undefined, ServiceLocatorInstanceHolder] {\n const holder = this.instancesHolders.get(name)\n if (holder) {\n if (holder.ttl !== Infinity) {\n const now = Date.now()\n if (now - holder.createdAt > holder.ttl) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() TTL expired for ${holder.name}`,\n )\n return [new InstanceExpired(holder.name), holder]\n }\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is destroying`,\n )\n return [new InstanceDestroying(holder.name), holder]\n }\n\n return [undefined, holder]\n } else {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${name} not found`,\n )\n return [new InstanceNotFound(name)]\n }\n }\n\n set(name: string, holder: ServiceLocatorInstanceHolder): void {\n this.instancesHolders.set(name, holder)\n }\n\n has(\n name: string,\n ): [InstanceExpired | InstanceDestroying] | [undefined, boolean] {\n const [error, holder] = this.get(name)\n if (!error) {\n return [undefined, true]\n }\n if (\n [ErrorsEnum.InstanceExpired, ErrorsEnum.InstanceDestroying].includes(\n error.code,\n )\n ) {\n return [error]\n }\n return [undefined, !!holder]\n }\n\n delete(name: string): boolean {\n return this.instancesHolders.delete(name)\n }\n\n filter(\n predicate: (\n value: ServiceLocatorInstanceHolder<any>,\n key: string,\n ) => boolean,\n ): Map<string, ServiceLocatorInstanceHolder> {\n return new Map(\n [...this.instancesHolders].filter(([key, value]) =>\n predicate(value, key),\n ),\n )\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { AnyZodObject, z } from 'zod'\n\nimport type { ServiceLocatorAbstractFactoryContext } from './service-locator-abstract-factory-context.mjs'\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { InjectableScope } from './enums/index.mjs'\nimport { ErrorsEnum, FactoryNotFound, UnknownError } from './errors/index.mjs'\nimport { getInjectableToken } from './index.mjs'\nimport { InjectionToken } from './injection-token.mjs'\nimport { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport {\n ServiceLocatorInstanceHolderKind,\n ServiceLocatorInstanceHolderStatus,\n} from './service-locator-instance-holder.mjs'\nimport { ServiceLocatorManager } from './service-locator-manager.mjs'\n\nexport class ServiceLocator {\n private abstractFactories: Map<\n InjectionToken<any, any>,\n (ctx: ServiceLocatorAbstractFactoryContext, ...args: any) => Promise<any>\n > = new Map()\n private instanceFactories: Map<\n InjectionToken<any, any>,\n (ctx: ServiceLocatorAbstractFactoryContext, ...args: any) => Promise<any>\n > = new Map()\n\n private readonly eventBus: ServiceLocatorEventBus\n private readonly manager: ServiceLocatorManager\n\n constructor(private readonly logger: Console | null = null) {\n this.eventBus = new ServiceLocatorEventBus(logger)\n this.manager = new ServiceLocatorManager(logger)\n }\n\n getEventBus() {\n return this.eventBus\n }\n\n public registerInstance<Instance>(\n token: InjectionToken<Instance, undefined>,\n instance: Instance,\n ): void {\n const instanceName = this.getInstanceIdentifier(token, undefined)\n this.manager.set(instanceName, {\n name: instanceName,\n instance,\n status: ServiceLocatorInstanceHolderStatus.Created,\n kind: ServiceLocatorInstanceHolderKind.Instance,\n createdAt: Date.now(),\n ttl: Infinity,\n deps: [],\n destroyListeners: [],\n effects: [],\n destroyPromise: null,\n creationPromise: null,\n })\n }\n\n public removeInstance<Instance>(token: InjectionToken<Instance, undefined>) {\n const instanceName = this.getInstanceIdentifier(token, undefined)\n return this.invalidate(instanceName)\n }\n\n public registerAbstractFactory<\n Instance,\n Schema extends AnyZodObject | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n factory: (\n ctx: ServiceLocatorAbstractFactoryContext,\n values: Schema extends AnyZodObject ? z.output<Schema> : undefined,\n ) => Promise<Instance>,\n type: InjectableScope = InjectableScope.Singleton,\n ) {\n this.logger?.log(\n `[ServiceLocator]#registerAbstractFactory(): Registering abstract factory for ${name}`,\n )\n if (type === InjectableScope.Instance) {\n this.instanceFactories.set(token, factory)\n this.abstractFactories.delete(token)\n } else {\n this.abstractFactories.set(token, factory)\n this.instanceFactories.delete(token)\n }\n }\n\n public getInstanceIdentifier<\n Instance,\n Schema extends AnyZodObject | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject ? z.input<Schema> : undefined,\n ): string {\n const validatedArgs = token.schema\n ? token.schema.safeParse(args)\n : undefined\n if (validatedArgs && !validatedArgs.success) {\n this.logger?.error(\n `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,\n validatedArgs.error,\n )\n throw new UnknownError(validatedArgs.error)\n }\n return this.makeInstanceName(token, validatedArgs)\n }\n\n public async getInstance<Instance, Schema extends AnyZodObject | undefined>(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject ? z.input<Schema> : undefined,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]> {\n const validatedArgs = token.schema\n ? token.schema.safeParse(args)\n : undefined\n if (validatedArgs && !validatedArgs.success) {\n this.logger?.error(\n `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,\n validatedArgs.error,\n )\n return [new UnknownError(validatedArgs.error)]\n }\n const instanceName = this.makeInstanceName(token, validatedArgs)\n const [error, holder] = this.manager.get(instanceName)\n if (!error) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n // @ts-expect-error TS2322 We should redefine the instance name type\n return holder.creationPromise\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n // Should never happen\n return [new UnknownError(ErrorsEnum.InstanceDestroying)]\n }\n // @ts-expect-error We should redefine the instance name type\n return [undefined, holder.instance]\n }\n switch (error.code) {\n case ErrorsEnum.InstanceDestroying:\n this.logger?.log(\n `[ServiceLocator]#getInstance() TTL expired for ${holder?.name}`,\n )\n await holder?.destroyPromise\n //Maybe we already have a new instance\n return this.getInstance<Instance, Schema>(token, args)\n\n case ErrorsEnum.InstanceExpired:\n this.logger?.log(\n `[ServiceLocator]#getInstance() TTL expired for ${holder?.name}`,\n )\n await this.invalidate(instanceName)\n //Maybe we already have a new instance\n return this.getInstance<Instance, Schema>(token, args)\n case ErrorsEnum.InstanceNotFound:\n break\n default:\n return [error]\n }\n return this.createInstance(instanceName, token, args)\n }\n\n public async getOrThrowInstance<\n Instance,\n Schema extends AnyZodObject | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject ? z.input<Schema> : undefined,\n ): Promise<Instance> {\n const [error, instance] = await this.getInstance(token, args)\n if (error) {\n throw error\n }\n return instance\n }\n\n private notifyListeners(\n name: string,\n event: 'create' | 'destroy' = 'create',\n ) {\n this.logger?.log(\n `[ServiceLocator]#notifyListeners() Notifying listeners for ${name} with event ${event}`,\n )\n return this.eventBus.emit(name, event)\n }\n\n private async createInstance<\n Instance,\n Schema extends AnyZodObject | undefined,\n >(\n instanceName: string,\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject ? z.input<Schema> : undefined,\n ): Promise<[undefined, Instance] | [FactoryNotFound | UnknownError]> {\n this.logger?.log(\n `[ServiceLocator]#createInstance() Creating instance for ${instanceName}`,\n )\n if (\n this.abstractFactories.has(token) ||\n this.instanceFactories.has(token)\n ) {\n return this.createInstanceFromAbstractFactory(instanceName, token, args)\n } else {\n return [new FactoryNotFound(token.name.toString())]\n }\n }\n\n private async createInstanceFromAbstractFactory<\n Instance,\n Schema extends AnyZodObject | undefined,\n Args extends Schema extends AnyZodObject ? z.input<Schema> : undefined,\n >(\n instanceName: string,\n token: InjectionToken<Instance, Schema>,\n args: Args,\n ): Promise<[undefined, Instance] | [FactoryNotFound]> {\n this.logger?.log(\n `[ServiceLocator]#createInstanceFromAbstractFactory(): Creating instance for ${instanceName} from abstract factory`,\n )\n const ctx = this.createContextForAbstractFactory(instanceName)\n let shouldStore = true\n let abstractFactory = this.abstractFactories.get(token)\n if (!abstractFactory) {\n abstractFactory = this.instanceFactories.get(token)\n shouldStore = false\n if (!abstractFactory) {\n return [new FactoryNotFound(token.name.toString())]\n }\n }\n const holder: ServiceLocatorInstanceHolder<Instance> = {\n name: instanceName,\n instance: null,\n status: ServiceLocatorInstanceHolderStatus.Creating,\n kind: ServiceLocatorInstanceHolderKind.AbstractFactory,\n // @ts-expect-error TS2322 This is correct type\n creationPromise: abstractFactory(ctx, args)\n .then(async (instance: Instance) => {\n holder.instance = instance\n holder.status = ServiceLocatorInstanceHolderStatus.Created\n holder.deps = ctx.getDependencies()\n holder.destroyListeners = ctx.getDestroyListeners()\n holder.ttl = ctx.getTtl()\n if (holder.deps.length > 0) {\n this.logger?.log(\n `[ServiceLocator]#createInstanceFromAbstractFactory(): Adding subscriptions for ${instanceName} dependencies for their invalidations: ${holder.deps.join(\n ', ',\n )}`,\n )\n holder.deps.forEach((dependency) => {\n holder.destroyListeners.push(\n this.eventBus.on(dependency, 'destroy', () =>\n this.invalidate(instanceName),\n ),\n )\n })\n }\n if (holder.ttl === 0) {\n // One time instance\n await this.invalidate(instanceName)\n }\n await this.notifyListeners(instanceName)\n return [undefined, instance as Instance]\n })\n .catch((error) => {\n this.logger?.error(\n `[ServiceLocator]#createInstanceFromAbstractFactory(): Error creating instance for ${instanceName}`,\n error,\n )\n return [new UnknownError(error)]\n }),\n effects: [],\n deps: [],\n destroyListeners: [],\n createdAt: Date.now(),\n ttl: Infinity,\n }\n\n if (shouldStore) {\n this.manager.set(instanceName, holder)\n }\n // @ts-expect-error TS2322 This is correct type\n return holder.creationPromise\n }\n\n private createContextForAbstractFactory(\n instanceName: string,\n ): ServiceLocatorAbstractFactoryContext {\n const dependencies = new Set<string>()\n const destroyListeners = new Set<() => void>()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n\n function invalidate(name = instanceName) {\n return self.invalidate(name)\n }\n function addEffect(listener: () => void) {\n destroyListeners.add(listener)\n }\n let ttl = Infinity\n function setTtl(value: number) {\n ttl = value\n }\n function getTtl() {\n return ttl\n }\n\n function on(key: string, event: string, listener: (event: string) => void) {\n destroyListeners.add(self.eventBus.on(key, event, listener))\n }\n\n return {\n // @ts-expect-error This is correct type\n async inject(token, args) {\n let injectionToken = token\n if (typeof token === 'function') {\n injectionToken = getInjectableToken(token)\n }\n if (injectionToken instanceof InjectionToken) {\n const validatedArgs = token.schema\n ? token.schema.safeParse(args)\n : undefined\n const instanceName = self.makeInstanceName(token, validatedArgs)\n dependencies.add(instanceName)\n // @ts-expect-error TS2322 This is correct type\n return self.getOrThrowInstance(injectionToken, args)\n }\n throw new Error(\n `[ServiceLocator]#inject(): Invalid token type: ${typeof token}. Expected a class or an InjectionToken.`,\n )\n },\n invalidate,\n eventBus: self.eventBus,\n on: on as ServiceLocatorEventBus['on'],\n getDependencies: () => Array.from(dependencies),\n addEffect,\n getDestroyListeners: () => Array.from(destroyListeners),\n setTtl,\n getTtl,\n }\n }\n\n public getSyncInstance<Instance, Schema extends AnyZodObject | undefined>(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject ? z.input<Schema> : undefined,\n ): Instance | null {\n const validatedArgs = token.schema\n ? token.schema.safeParse(args)\n : undefined\n if (validatedArgs && !validatedArgs.success) {\n this.logger?.error(\n `[ServiceLocator]#getInstance(): Error validating args for ${token.name.toString()}`,\n validatedArgs.error,\n )\n throw new UnknownError(validatedArgs.error)\n }\n const instanceName = this.makeInstanceName(token, validatedArgs)\n const [error, holder] = this.manager.get(instanceName)\n if (error) {\n return null\n }\n return holder.instance as Instance\n }\n\n invalidate(service: string, round = 1): Promise<any> {\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Starting Invalidating process of ${service}`,\n )\n const toInvalidate = this.manager.filter(\n (holder) => holder.name === service || holder.deps.includes(service),\n )\n const promises = []\n for (const [key, holder] of toInvalidate.entries()) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is already being destroyed`,\n )\n promises.push(holder.destroyPromise)\n continue\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is being created, waiting for creation to finish`,\n )\n promises.push(\n holder.creationPromise?.then(() => {\n if (round > 3) {\n this.logger?.error(\n `[ServiceLocator]#invalidate(): ${key} creation is triggering a new invalidation round, but it is still not created`,\n )\n return\n }\n return this.invalidate(key, round + 1)\n }),\n )\n continue\n }\n // @ts-expect-error TS2322 we are changing the status\n holder.status = ServiceLocatorInstanceHolderStatus.Destroying\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Invalidating ${key} and notifying listeners`,\n )\n // @ts-expect-error TS2322 we are changing the status\n holder.destroyPromise = Promise.all(\n holder.destroyListeners.map((listener) => listener()),\n ).then(async () => {\n this.manager.delete(key)\n await this.notifyListeners(key, 'destroy')\n })\n promises.push(holder.destroyPromise)\n }\n return Promise.all(promises)\n }\n\n async ready() {\n return Promise.all(\n Array.from(this.manager.filter(() => true)).map(([, holder]) => {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n return holder.creationPromise?.then(() => null)\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n return holder.destroyPromise.then(() => null)\n }\n return Promise.resolve(null)\n }),\n ).then(() => null)\n }\n\n makeInstanceName(token: InjectionToken<any, any>, args: any) {\n let stringifiedArgs = args\n ? ':' +\n JSON.stringify(args)\n .replaceAll(/\"/g, '')\n .replaceAll(/:/g, '=')\n .replaceAll(/,/g, '|')\n : ''\n const { name } = token\n if (typeof name === 'function') {\n const className = name.name\n return `${className}(${token.id})${stringifiedArgs}`\n } else if (typeof name === 'symbol') {\n return `${name.toString()}(${token.id})${stringifiedArgs}`\n } else {\n return `${name}(${token.id})${stringifiedArgs}`\n }\n }\n}\n","import { ServiceLocator } from './service-locator.mjs'\n\nlet serviceLocator: ServiceLocator = new ServiceLocator()\n\nexport function provideServiceLocator(locator: ServiceLocator): ServiceLocator {\n const original = serviceLocator\n serviceLocator = locator\n return original\n}\n\nexport function getServiceLocator(): ServiceLocator {\n if (!serviceLocator) {\n throw new Error(\n '[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator.',\n )\n }\n return serviceLocator\n}\n","import type { AnyZodObject, input, output } from 'zod'\n\nimport type { FactoryNotFound, UnknownError } from './index.mjs'\nimport type { InjectionToken } from './injection-token.mjs'\nimport type { ServiceLocatorAbstractFactoryContext } from './service-locator-abstract-factory-context.mjs'\nimport type { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport type { ServiceLocator } from './service-locator.mjs'\n\n// @ts-expect-error We don't need all the properties of the class\nexport class ProxyServiceLocator implements ServiceLocator {\n constructor(\n private readonly serviceLocator: ServiceLocator,\n private readonly ctx: ServiceLocatorAbstractFactoryContext,\n ) {}\n get abstractFactories(): Map<\n InjectionToken<any, any>,\n (ctx: ServiceLocatorAbstractFactoryContext, args: any) => Promise<any>\n > {\n return this.serviceLocator['abstractFactories']\n }\n getEventBus(): ServiceLocatorEventBus {\n return this.serviceLocator.getEventBus()\n }\n public registerAbstractFactory<\n Instance,\n Schema extends AnyZodObject | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n factory: (\n ctx: ServiceLocatorAbstractFactoryContext,\n values: Schema extends AnyZodObject ? output<Schema> : undefined,\n ) => Promise<Instance>,\n ): void {\n return this.serviceLocator.registerAbstractFactory(token, factory)\n }\n public getInstance<Instance, Schema extends AnyZodObject | undefined>(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject ? input<Schema> : undefined,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]> {\n // @ts-expect-error\n return this.ctx.inject(token, args).then(\n (instance) => {\n return [undefined, instance]\n },\n (error) => {\n return [error]\n },\n )\n }\n public getOrThrowInstance<Instance, Schema extends AnyZodObject | undefined>(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject ? input<Schema> : undefined,\n ): Promise<Instance> {\n // @ts-expect-error We need to pass the args to the ctx.inject method\n return this.ctx.inject(token, args)\n }\n public getSyncInstance<Instance, Schema extends AnyZodObject | undefined>(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject ? input<Schema> : undefined,\n ): Instance | null {\n return this.serviceLocator.getSyncInstance(token, args)\n }\n invalidate(service: string, round?: number): Promise<any> {\n return this.serviceLocator.invalidate(service, round)\n }\n ready(): Promise<null> {\n return this.serviceLocator.ready()\n }\n makeInstanceName(token: InjectionToken<any, any>, args: any): string {\n return this.serviceLocator.makeInstanceName(token, args)\n }\n}\n\nexport function makeProxyServiceLocator(\n serviceLocator: ServiceLocator,\n ctx: ServiceLocatorAbstractFactoryContext,\n): ServiceLocator {\n // @ts-expect-error We don't need all the properties of the class\n return new ProxyServiceLocator(serviceLocator, ctx)\n}\n","import type { AnyZodObject, z } from 'zod'\n\nimport type { ClassType } from './injection-token.mjs'\n\nimport { getInjectableToken } from './decorators/index.mjs'\nimport { InjectionToken } from './injection-token.mjs'\nimport { getServiceLocator } from './injector.mjs'\n\nlet promiseCollector: null | ((promise: Promise<any>) => void) = null\n\nexport function syncInject<T extends ClassType>(token: T): InstanceType<T>\nexport function syncInject<T, S extends AnyZodObject>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n): T\nexport function syncInject<T>(token: InjectionToken<T, undefined>): T\nexport function syncInject<\n T,\n Token extends InjectionToken<T>,\n S extends AnyZodObject | unknown = Token['schema'],\n>(token: Token, args?: S extends AnyZodObject ? z.input<S> : never): T {\n if (token.schema) {\n const parsed = token.schema.safeParse(args)\n if (!parsed.success) {\n throw new Error(\n `[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`,\n )\n }\n }\n let realToken: InjectionToken<T, S> = token\n if (!(token instanceof InjectionToken)) {\n realToken = getInjectableToken(token) as InjectionToken<T, S>\n }\n\n const instance = getServiceLocator().getSyncInstance(realToken, args)\n if (!instance) {\n if (promiseCollector) {\n const promise = getServiceLocator().getInstance(realToken, args)\n promiseCollector(promise)\n } else {\n throw new Error(\n `[ServiceLocator] No instance found for ${realToken.name.toString()}`,\n )\n }\n }\n return instance as unknown as T\n}\n\nexport function setPromiseCollector(\n collector: null | ((promise: Promise<any>) => void),\n): typeof promiseCollector {\n const original = promiseCollector\n promiseCollector = collector\n return original\n}\n","import type { ClassType } from '../injection-token.mjs'\n\nimport { InjectableScope } from '../enums/index.mjs'\nimport { InjectionToken } from '../injection-token.mjs'\nimport { getServiceLocator, provideServiceLocator } from '../injector.mjs'\nimport { makeProxyServiceLocator } from '../proxy-service-locator.mjs'\nimport { setPromiseCollector } from '../sync-injector.mjs'\n\nexport enum InjectableType {\n Class = 'Class',\n Factory = 'Factory',\n}\n\nexport interface InjectableOptions {\n scope?: InjectableScope\n type?: InjectableType\n token?: InjectionToken<any, any>\n}\n\nexport const InjectableTokenMeta = Symbol('InjectableTokenMeta')\n\nexport function Injectable({\n scope = InjectableScope.Singleton,\n type = InjectableType.Class,\n token,\n}: InjectableOptions = {}) {\n return (target: ClassType, context: ClassDecoratorContext) => {\n if (context.kind !== 'class') {\n throw new Error(\n '[ServiceLocator] @Injectable decorator can only be used on classes.',\n )\n }\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target)\n const locator = getServiceLocator()\n if (!locator) {\n throw new Error(\n '[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator.',\n )\n }\n if (type === InjectableType.Class) {\n locator.registerAbstractFactory(\n injectableToken,\n async (ctx) => {\n if (scope === InjectableScope.Instance) {\n ctx.setTtl(0)\n }\n const proxyServiceLocator = makeProxyServiceLocator(\n getServiceLocator(),\n ctx,\n )\n const promises: Promise<any>[] = []\n const promiseCollector = (promise: Promise<any>) => {\n promises.push(promise)\n }\n const originalPromiseCollector = setPromiseCollector(promiseCollector)\n const tryInit = () => {\n const original = provideServiceLocator(proxyServiceLocator)\n let result = new target()\n provideServiceLocator(original)\n return result\n }\n const result = tryInit()\n setPromiseCollector(originalPromiseCollector)\n if (promises.length > 0) {\n await Promise.all(promises)\n return tryInit()\n }\n return result\n },\n scope,\n )\n } else if (type === InjectableType.Factory) {\n locator.registerAbstractFactory(\n injectableToken,\n async (ctx, args: any) => {\n if (scope === InjectableScope.Instance) {\n ctx.setTtl(0)\n }\n const proxyServiceLocator = makeProxyServiceLocator(\n getServiceLocator(),\n ctx,\n )\n const original = provideServiceLocator(proxyServiceLocator)\n const builder = new target()\n if (typeof builder.create !== 'function') {\n throw new Error(\n `[ServiceLocator] Factory ${target.name} does not implement the create method.`,\n )\n }\n provideServiceLocator(original)\n return builder.create(ctx, args)\n },\n scope,\n )\n }\n\n // @ts-expect-error\n target[InjectableTokenMeta] = injectableToken\n\n return target\n }\n}\n","import type {\n ClassType,\n ClassTypeWithInstance,\n InjectionToken,\n} from '../injection-token.mjs'\n\nimport { InjectableTokenMeta } from './injectable.decorator.mjs'\n\nexport function getInjectableToken<R, T extends ClassTypeWithInstance<R>>(\n target: ClassType,\n): R extends { create(...args: any[]): infer V }\n ? InjectionToken<V>\n : InjectionToken<R> {\n // @ts-expect-error We inject the token into the class itself\n const token = target[InjectableTokenMeta] as InjectionToken<any, any>\n if (!token) {\n throw new Error(\n `[ServiceLocator] Class ${target.name} is not decorated with @Injectable.`,\n )\n }\n // @ts-expect-error We detect factory or class\n return token\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type EventsConfig = {\n [event: string]: any[]\n}\nexport type EventsNames<Events extends EventsConfig> = Exclude<keyof Events, symbol | number>\nexport type EventsArgs<\n Events extends EventsConfig,\n Name extends EventsNames<Events>,\n> = Events[Name] extends any[] ? Events[Name] : []\n\nexport type ChannelEmitter<\n Events extends EventsConfig,\n Ns extends string,\n E extends EventsNames<Events>,\n> = {\n emit<Args extends EventsArgs<Events, E>>(ns: Ns, event: E, ...args: Args): Promise<any>\n}\n\nexport interface EventEmitterInterface<Events extends EventsConfig> {\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ): () => void\n emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): void\n addChannel<\n E extends EventsNames<Events>,\n Ns extends string,\n Emmiter extends ChannelEmitter<Events, Ns, E>,\n >(\n ns: Ns,\n event: E,\n target: Emmiter,\n ): () => void\n}\n\nexport class EventEmitter<Events extends EventsConfig = {}>\n implements EventEmitterInterface<Events>\n{\n private listeners: Map<EventsNames<Events>, Set<Function>> = new Map()\n\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n\n this.listeners.get(event)!.add(listener)\n\n return () => {\n this.off(event, listener)\n }\n }\n\n off<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n return\n }\n\n this.listeners.get(event)!.delete(listener)\n if (this.listeners.get(event)!.size === 0) {\n this.listeners.delete(event)\n }\n }\n\n once<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n const off = this.on(event, (...args) => {\n off()\n // @ts-expect-error - This is a valid call\n listener(...args)\n })\n\n return off\n }\n\n async emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): Promise<any> {\n if (!this.listeners.has(event)) {\n return\n }\n\n return Promise.all(Array.from(this.listeners.get(event)!).map(listener => listener(...args)))\n }\n\n addChannel<\n E extends EventsNames<Events>,\n Ns extends string,\n Emitter extends ChannelEmitter<Events, Ns, E>,\n >(ns: Ns, event: E, target: Emitter) {\n return this.on(event, (...args) => target.emit(ns, event, ...args))\n }\n}\n","import type { AnyZodObject, z } from 'zod'\n\nimport type { ClassType } from './injection-token.mjs'\n\nimport { getInjectableToken } from './decorators/index.mjs'\nimport { InjectionToken } from './injection-token.mjs'\nimport { getServiceLocator } from './injector.mjs'\n\nexport function inject<T extends ClassType>(token: T): Promise<InstanceType<T>>\nexport function inject<T, S extends AnyZodObject>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n): Promise<T>\nexport function inject<T>(token: InjectionToken<T, undefined>): Promise<T>\nexport function inject<\n T,\n Token extends InjectionToken<T>,\n S extends AnyZodObject | unknown = Token['schema'],\n>(\n token: Token,\n args?: S extends AnyZodObject ? z.input<S> : never,\n): Promise<T> {\n if (token.schema) {\n const parsed = token.schema.safeParse(args)\n if (!parsed.success) {\n throw new Error(\n `[ServiceLocator] Invalid arguments for ${token.name.toString()}: ${parsed.error}`,\n )\n }\n }\n let realToken: InjectionToken<T, S> = token\n if (!(token instanceof InjectionToken)) {\n realToken = getInjectableToken(token) as InjectionToken<T, S>\n }\n\n return getServiceLocator().getOrThrowInstance(realToken, args)\n}\n","import type { ClassType, InjectionToken } from './injection-token.mjs'\n\nimport { getServiceLocator } from './injector.mjs'\n\n/**\n * Useful for tests or when you want to override a service\n * with a different implementation.\n */\nexport function override<T>(token: InjectionToken<T>, target: ClassType) {\n const serviceLocator = getServiceLocator()\n const originalDefinition = serviceLocator['abstractFactories'].get(token)\n serviceLocator.registerAbstractFactory(token, async (ctx, args: any) => {\n const builder = new target()\n return builder.create(ctx, args)\n })\n\n return () => {\n if (originalDefinition) {\n serviceLocator.registerAbstractFactory(token, originalDefinition)\n }\n }\n}\n","import type { ClassType } from '../service-locator/index.mjs'\n\nimport { getControllerMetadata } from '../metadata/index.mjs'\nimport {\n Injectable,\n InjectableScope,\n InjectableType,\n InjectionToken,\n} from '../service-locator/index.mjs'\n\nexport interface ControllerOptions {\n guards?: ClassType[] | Set<ClassType>\n}\nexport function Controller({ guards }: ControllerOptions = {}) {\n return function (target: ClassType, context: ClassDecoratorContext) {\n if (context.kind !== 'class') {\n throw new Error(\n '[Navios] @Controller decorator can only be used on classes.',\n )\n }\n const token = InjectionToken.create(target)\n if (context.metadata) {\n const controllerMetadata = getControllerMetadata(target, context)\n if (guards) {\n for (const guard of Array.from(guards).reverse()) {\n controllerMetadata.guards.add(guard)\n }\n }\n }\n return Injectable({\n token,\n type: InjectableType.Class,\n scope: InjectableScope.Instance,\n })(target, context)\n }\n}\n","import type { BaseEndpointConfig, EndpointFunctionArgs, HttpMethod } from '@navios/common'\nimport type { AnyZodObject, z, ZodType } from 'zod'\n\nimport { getEndpointMetadata } from '../metadata/index.mjs'\n\nexport type EndpointParams<\n EndpointDeclaration extends {\n config: BaseEndpointConfig<any, any, any, any, any>\n },\n Url extends string = EndpointDeclaration['config']['url'],\n QuerySchema = EndpointDeclaration['config']['querySchema'],\n> = QuerySchema extends AnyZodObject\n ? EndpointDeclaration['config']['requestSchema'] extends ZodType\n ? EndpointFunctionArgs<\n Url,\n QuerySchema,\n EndpointDeclaration['config']['requestSchema']\n >\n : EndpointFunctionArgs<Url, QuerySchema, undefined>\n : EndpointDeclaration['config']['requestSchema'] extends ZodType\n ? EndpointFunctionArgs<\n Url,\n undefined,\n EndpointDeclaration['config']['requestSchema']\n >\n : EndpointFunctionArgs<Url, undefined, undefined>\n\nexport function Endpoint<\n Method extends HttpMethod = HttpMethod,\n Url extends string = string,\n QuerySchema = undefined,\n ResponseSchema extends ZodType = ZodType,\n RequestSchema = ZodType,\n>(endpoint: {\n config: BaseEndpointConfig<\n Method,\n Url,\n QuerySchema,\n ResponseSchema,\n RequestSchema\n >\n}) {\n return (\n target: (\n params: QuerySchema extends AnyZodObject\n ? RequestSchema extends ZodType\n ? EndpointFunctionArgs<Url, QuerySchema, RequestSchema>\n : EndpointFunctionArgs<Url, QuerySchema, undefined>\n : RequestSchema extends ZodType\n ? EndpointFunctionArgs<Url, undefined, RequestSchema>\n : EndpointFunctionArgs<Url, undefined, undefined>,\n ) => z.input<ResponseSchema>,\n context: ClassMethodDecoratorContext,\n ) => {\n if (typeof target !== 'function') {\n throw new Error(\n '[Navios] Endpoint decorator can only be used on functions.',\n )\n }\n if (context.kind !== 'method') {\n throw new Error(\n '[Navios] Endpoint decorator can only be used on methods.',\n )\n }\n const config = endpoint.config\n if (context.metadata) {\n let endpointMetadata = getEndpointMetadata(target, context)\n if (endpointMetadata.config && endpointMetadata.config.url) {\n throw new Error(\n `[Navios] Endpoint ${config.method} ${config.url} already exists. Please use a different method or url.`,\n )\n }\n // @ts-expect-error We don't need to set correctly in the metadata\n endpointMetadata.config = config\n endpointMetadata.classMethod = target.name\n endpointMetadata.httpMethod = config.method\n endpointMetadata.url = config.url\n }\n return target\n }\n}\n","import type { ClassType } from '../service-locator/index.mjs'\n\nimport { getModuleMetadata } from '../metadata/index.mjs'\nimport {\n Injectable,\n InjectableScope,\n InjectableType,\n InjectionToken,\n} from '../service-locator/index.mjs'\n\nexport interface ModuleOptions {\n controllers?: ClassType[] | Set<ClassType>\n imports?: ClassType[] | Set<ClassType>\n guards?: ClassType[] | Set<ClassType>\n}\n\nexport function Module(metadata: ModuleOptions) {\n return (target: ClassType, context: ClassDecoratorContext) => {\n if (context.kind !== 'class') {\n throw new Error('[Navios] @Module decorator can only be used on classes.')\n }\n // Register the module in the service locator\n const token = InjectionToken.create(target)\n const moduleMetadata = getModuleMetadata(target, context)\n if (metadata.controllers) {\n for (const controller of metadata.controllers) {\n moduleMetadata.controllers.add(controller)\n }\n }\n if (metadata.imports) {\n for (const importedModule of metadata.imports) {\n moduleMetadata.imports.add(importedModule)\n }\n }\n if (metadata.guards) {\n for (const guard of Array.from(metadata.guards).reverse()) {\n moduleMetadata.guards.add(guard)\n }\n }\n\n return Injectable({\n token,\n type: InjectableType.Class,\n scope: InjectableScope.Singleton,\n })(target, context)\n }\n}\n","import type { CanActivate } from '../interfaces/index.mjs'\nimport type {\n ClassType,\n ClassTypeWithInstance,\n InjectionToken,\n} from '../service-locator/index.mjs'\n\nimport {\n getControllerMetadata,\n getEndpointMetadata,\n} from '../metadata/index.mjs'\n\nexport function UseGuards(\n ...guards: (\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n )[]\n) {\n return function <T extends Function>(\n target: T,\n context: ClassMethodDecoratorContext | ClassDecoratorContext,\n ): T {\n if (context.kind === 'class') {\n const controllerMetadata = getControllerMetadata(\n target as unknown as ClassType,\n context,\n )\n for (const guard of guards.reverse()) {\n controllerMetadata.guards.add(guard)\n }\n } else if (context.kind === 'method') {\n const endpointMetadata = getEndpointMetadata(target, context)\n for (const guard of guards.reverse()) {\n endpointMetadata.guards.add(guard)\n }\n } else {\n throw new Error(\n '[Navios] @UseGuards decorator can only be used on classes or methods.',\n )\n }\n return target\n }\n}\n","export class HttpException {\n constructor(\n public readonly statusCode: number,\n public readonly response: string | object,\n public readonly error?: Error,\n ) {}\n}\n","import { HttpException } from './http.exception.mjs'\n\nexport class BadRequestException extends HttpException {\n constructor(message: string | object) {\n super(400, message)\n }\n}\n","import { HttpException } from './http.exception.mjs'\n\nexport class ForbiddenException extends HttpException {\n constructor(message: string) {\n super(403, message)\n }\n}\n","import { HttpException } from './http.exception.mjs'\n\nexport class InternalServerErrorException extends HttpException {\n constructor(message: string | object, error?: Error) {\n super(500, message, error)\n }\n}\n","import { HttpException } from './http.exception.mjs'\n\nexport class NotFoundException extends HttpException {\n constructor(\n public readonly response: string | object,\n public readonly error?: Error,\n ) {\n super(404, response, error)\n }\n}\n","import { HttpException } from './http.exception.mjs'\n\nexport class UnauthorizedException extends HttpException {\n constructor(message: string | object, error?: Error) {\n super(401, message, error)\n }\n}\n","import { HttpException } from './http.exception.mjs'\n\nexport class ConflictException extends HttpException {\n constructor(message: string | object, error?: Error) {\n super(409, message, error)\n }\n}\n","import type { FastifyInstance } from 'fastify'\n\nimport { InjectionToken } from '../service-locator/index.mjs'\n\nconst ApplicationInjectionToken = 'ApplicationInjectionToken'\n\nexport const Application = InjectionToken.create<FastifyInstance>(\n ApplicationInjectionToken,\n)\n","import { InjectionToken } from '../service-locator/index.mjs'\nimport { ExecutionContext } from '../services/index.mjs'\n\nexport const ExecutionContextInjectionToken = 'ExecutionContextInjectionToken'\n\nexport const ExecutionContextToken = InjectionToken.create<ExecutionContext>(\n ExecutionContextInjectionToken,\n)\n","import type { FastifyReply } from 'fastify'\n\nimport { InjectionToken } from '../service-locator/index.mjs'\n\nconst ReplyInjectionToken = 'ReplyInjectionToken'\n\nexport const Reply = InjectionToken.create<FastifyReply>(ReplyInjectionToken)\n","import type { FastifyRequest } from 'fastify'\n\nimport { InjectionToken } from '../service-locator/index.mjs'\n\nconst RequestInjectionToken = 'RequestInjectionToken'\n\nexport const Request = InjectionToken.create<FastifyRequest>(\n RequestInjectionToken,\n)\n","import type { FastifyReply, FastifyRequest } from 'fastify'\n\nimport type {\n ControllerMetadata,\n EndpointMetadata,\n ModuleMetadata,\n} from '../metadata/index.mjs'\n\nexport class ExecutionContext {\n private request: FastifyRequest | undefined\n private reply: FastifyReply | undefined\n constructor(\n private readonly module: ModuleMetadata,\n private readonly controller: ControllerMetadata,\n private readonly handler: EndpointMetadata,\n ) {}\n getModule(): ModuleMetadata {\n return this.module\n }\n\n getController(): ControllerMetadata {\n return this.controller\n }\n\n getHandler(): EndpointMetadata {\n return this.handler\n }\n\n getRequest(): FastifyRequest {\n if (!this.request) {\n throw new Error(\n '[Navios] Request is not set. Make sure to set it before using it.',\n )\n }\n return this.request\n }\n\n getReply(): FastifyReply {\n if (!this.reply) {\n throw new Error(\n '[Navios] Reply is not set. Make sure to set it before using it.',\n )\n }\n return this.reply\n }\n\n provideRequest(request: FastifyRequest): void {\n this.request = request\n }\n provideReply(reply: FastifyReply): void {\n this.reply = reply\n }\n}\n","import type { CanActivate } from '../interfaces/index.mjs'\nimport type { ClassTypeWithInstance } from '../service-locator/index.mjs'\nimport type { ExecutionContext } from './execution-context.mjs'\n\nimport { HttpException } from '../exceptions/index.mjs'\nimport {\n inject,\n Injectable,\n InjectionToken,\n} from '../service-locator/index.mjs'\n\n@Injectable()\nexport class GuardRunnerService {\n async runGuards(\n allGuards: Set<\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n >,\n executionContext: ExecutionContext,\n ) {\n let canActivate = true\n for (const guard of Array.from(allGuards).reverse()) {\n const guardInstance = await inject(\n guard as InjectionToken<CanActivate, undefined>,\n )\n if (!guardInstance.canActivate) {\n throw new Error(\n `[Navios] Guard ${guard.name as string} does not implement canActivate()`,\n )\n }\n try {\n canActivate = await guardInstance.canActivate(executionContext)\n if (!canActivate) {\n break\n }\n } catch (error) {\n if (error instanceof HttpException) {\n executionContext\n .getReply()\n .status(error.statusCode)\n .send(error.response)\n return false\n } else {\n executionContext\n .getReply()\n .status(500)\n .send({\n message: 'Internal server error',\n error: (error as Error).message,\n })\n return false\n }\n }\n }\n if (!canActivate) {\n executionContext.getReply().status(403).send({\n message: 'Forbidden',\n })\n return false\n }\n return canActivate\n }\n\n makeContext(\n executionContext: ExecutionContext,\n ): Set<\n ClassTypeWithInstance<CanActivate> | InjectionToken<CanActivate, undefined>\n > {\n const guards = new Set<\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n >()\n const endpointGuards = executionContext.getHandler().guards\n const controllerGuards = executionContext.getController().guards\n const moduleGuards = executionContext.getModule().guards\n if (endpointGuards.size > 0) {\n for (const guard of endpointGuards) {\n guards.add(guard)\n }\n }\n if (controllerGuards.size > 0) {\n for (const guard of controllerGuards) {\n guards.add(guard)\n }\n }\n if (moduleGuards.size > 0) {\n for (const guard of moduleGuards) {\n guards.add(guard)\n }\n }\n return guards\n }\n}\n","import type { FastifyInstance } from 'fastify'\nimport type { ZodTypeProvider } from 'fastify-type-provider-zod'\n\nimport type { ModuleMetadata } from '../metadata/index.mjs'\nimport type { ClassType } from '../service-locator/index.mjs'\n\nimport { HttpException } from '../exceptions/index.mjs'\nimport { extractControllerMetadata } from '../metadata/index.mjs'\nimport {\n getServiceLocator,\n inject,\n Injectable,\n syncInject,\n} from '../service-locator/index.mjs'\nimport { ExecutionContextToken, Reply, Request } from '../tokens/index.mjs'\nimport { ExecutionContext } from './execution-context.mjs'\nimport { GuardRunnerService } from './guard-runner.service.mjs'\n\n@Injectable()\nexport class ControllerAdapterService {\n guardRunner = syncInject(GuardRunnerService)\n\n setupController(\n controller: ClassType,\n instance: FastifyInstance,\n moduleMetadata: ModuleMetadata,\n ): void {\n const controllerMetadata = extractControllerMetadata(controller)\n for (const endpoint of controllerMetadata.endpoints) {\n const { classMethod, url, httpMethod, config } = endpoint\n\n if (!url || !config) {\n throw new Error(\n `[Navios] Malformed Endpoint ${controller.name}:${classMethod}`,\n )\n }\n const executionContext = new ExecutionContext(\n moduleMetadata,\n controllerMetadata,\n endpoint,\n )\n const guards = this.guardRunner.makeContext(executionContext)\n const { querySchema, requestSchema, responseSchema } = config\n const schema: Record<string, any> = {}\n if (querySchema) {\n schema.querystring = querySchema\n }\n if (requestSchema) {\n schema.body = requestSchema\n }\n if (responseSchema) {\n schema.response = {\n 200: responseSchema,\n }\n }\n instance.withTypeProvider<ZodTypeProvider>().route({\n method: httpMethod,\n url: url.replaceAll('$', ':'),\n schema,\n preHandler: async (request, reply) => {\n if (guards.size > 0) {\n getServiceLocator().registerInstance(Request, request)\n getServiceLocator().registerInstance(Reply, reply)\n getServiceLocator().registerInstance(\n ExecutionContextToken,\n executionContext,\n )\n executionContext.provideRequest(request)\n executionContext.provideReply(reply)\n const canActivate = await this.guardRunner.runGuards(\n guards,\n executionContext,\n )\n getServiceLocator().removeInstance(Request)\n getServiceLocator().removeInstance(Reply)\n getServiceLocator().removeInstance(ExecutionContextToken)\n if (!canActivate) {\n return reply\n }\n }\n },\n handler: async (request, reply) => {\n getServiceLocator().registerInstance(Request, request)\n getServiceLocator().registerInstance(Reply, reply)\n getServiceLocator().registerInstance(\n ExecutionContextToken,\n executionContext,\n )\n executionContext.provideRequest(request)\n executionContext.provideReply(reply)\n const controllerInstance = await inject(controller)\n try {\n const { query, params, body } = request\n const argument: Record<string, any> = {}\n if (query && Object.keys(query).length > 0) {\n argument.params = query\n }\n if (params && Object.keys(params).length > 0) {\n argument.urlParams = params\n }\n if (body) {\n argument.data = body\n }\n const result = await controllerInstance[classMethod](argument)\n reply.status(200).send(result)\n } catch (error) {\n if (error instanceof HttpException) {\n reply.status(error.statusCode).send(error.response)\n } else {\n reply.status(500).send({\n message: 'Internal server error',\n error: (error as Error).message,\n })\n }\n } finally {\n getServiceLocator().removeInstance(Request)\n getServiceLocator().removeInstance(Reply)\n getServiceLocator().removeInstance(ExecutionContextToken)\n }\n },\n })\n }\n }\n}\n","import type { NaviosModule } from '../interfaces/index.mjs'\nimport type { ModuleMetadata } from '../metadata/index.mjs'\nimport type { ClassTypeWithInstance } from '../service-locator/index.mjs'\n\nimport { extractModuleMetadata } from '../metadata/index.mjs'\nimport { inject, Injectable } from '../service-locator/index.mjs'\n\n@Injectable()\nexport class ModuleLoaderService {\n private modulesMetadata: Map<string, ModuleMetadata> = new Map()\n private loadedModules: Map<string, any> = new Map()\n private initialized = false\n\n async loadModules(appModule: ClassTypeWithInstance<NaviosModule>) {\n if (this.initialized) {\n return\n }\n await this.traverseModules(appModule)\n this.initialized = true\n }\n\n private async traverseModules(\n module: ClassTypeWithInstance<NaviosModule>,\n parentMetadata?: ModuleMetadata,\n ) {\n const metadata = extractModuleMetadata(module)\n if (parentMetadata) {\n this.mergeMetadata(metadata, parentMetadata)\n }\n const moduleName = module.name\n if (this.modulesMetadata.has(moduleName)) {\n return\n }\n this.modulesMetadata.set(moduleName, metadata)\n const imports = metadata.imports ?? new Set()\n const loadingPromises = Array.from(imports).map(async (importedModule) =>\n this.traverseModules(importedModule, metadata),\n )\n await Promise.all(loadingPromises)\n const instance = await inject(module)\n if (instance.onModuleInit) {\n await instance.onModuleInit()\n }\n this.loadedModules.set(moduleName, instance)\n }\n\n private mergeMetadata(\n metadata: ModuleMetadata,\n parentMetadata: ModuleMetadata,\n ): void {\n if (parentMetadata.guards) {\n for (const guard of parentMetadata.guards) {\n metadata.guards.add(guard)\n }\n }\n if (parentMetadata.customAttributes) {\n for (const [key, value] of parentMetadata.customAttributes) {\n if (metadata.customAttributes.has(key)) {\n continue\n }\n metadata.customAttributes.set(key, value)\n }\n }\n }\n getAllModules(): Map<string, ModuleMetadata> {\n return this.modulesMetadata\n }\n}\n","import type { z, ZodType } from 'zod'\n\nimport type {\n ControllerMetadata,\n EndpointMetadata,\n ModuleMetadata,\n} from './metadata/index.mjs'\nimport type { ClassType } from './service-locator/index.mjs'\n\nimport {\n getControllerMetadata,\n getEndpointMetadata,\n getModuleMetadata,\n hasControllerMetadata,\n hasModuleMetadata,\n} from './metadata/index.mjs'\n\nexport type ClassAttribute = (() => <T>(\n target: T,\n context: ClassDecoratorContext | ClassMethodDecoratorContext,\n) => T) & {\n token: symbol\n}\nexport type ClassSchemaAttribute<T extends ZodType> = ((\n value: z.input<T>,\n) => <T extends ClassType>(\n target: T,\n context: ClassDecoratorContext | ClassMethodDecoratorContext,\n) => T) & {\n token: symbol\n schema: ZodType\n}\n\nexport class AttributeFactory {\n static createAttribute(token: symbol): ClassAttribute\n static createAttribute<T extends ZodType>(\n token: symbol,\n value: z.input<T>,\n ): ClassSchemaAttribute<T>\n static createAttribute(token: symbol, schema?: ZodType) {\n const res =\n (value?: unknown) =>\n (\n target: any,\n context: ClassDecoratorContext | ClassMethodDecoratorContext,\n ) => {\n if (context.kind !== 'class' && context.kind !== 'method') {\n throw new Error(\n '[Navios] Attribute can only be applied to classes or methods',\n )\n }\n const isController =\n context.kind === 'class' && hasControllerMetadata(target as ClassType)\n const isModule =\n context.kind === 'class' && hasModuleMetadata(target as ClassType)\n if (context.kind === 'class' && !isController && !isModule) {\n throw new Error(\n '[Navios] Attribute can only be applied to classes with @Controller or @Module decorators',\n )\n }\n let metadata =\n context.kind === 'class'\n ? isController\n ? getControllerMetadata(target as any, context)\n : getModuleMetadata(target as any, context)\n : getEndpointMetadata(target, context)\n if (schema) {\n const validatedValue = schema.safeParse(value)\n if (!validatedValue.success) {\n throw new Error(\n `[Navios] Invalid value for attribute ${token.toString()}: ${validatedValue.error}`,\n )\n }\n metadata.customAttributes.set(token, validatedValue.data)\n } else {\n metadata.customAttributes.set(token, true)\n }\n return target\n }\n res.token = token\n if (schema) {\n res.schema = schema\n }\n return res\n }\n\n static get(\n attribute: ClassAttribute,\n target: ModuleMetadata | ControllerMetadata | EndpointMetadata,\n ): true | null\n static get<T extends ZodType>(\n attribute: ClassSchemaAttribute<T>,\n target: ModuleMetadata | ControllerMetadata | EndpointMetadata,\n ): z.output<T> | null\n static get(\n attribute: ClassAttribute | ClassSchemaAttribute<any>,\n target: ModuleMetadata | ControllerMetadata | EndpointMetadata,\n ) {\n return target.customAttributes.get(attribute.token) ?? null\n }\n\n static getAll(\n attribute: ClassAttribute,\n target: ModuleMetadata | ControllerMetadata | EndpointMetadata,\n ): Array<true> | null\n static getAll<T extends ZodType>(\n attribute: ClassSchemaAttribute<T>,\n target: ModuleMetadata | ControllerMetadata | EndpointMetadata,\n ): Array<z.output<T>> | null\n static getAll(\n attribute: ClassAttribute | ClassSchemaAttribute<any>,\n target: ModuleMetadata | ControllerMetadata | EndpointMetadata,\n ) {\n const values = Array.from(target.customAttributes.entries())\n .filter(([key]) => key === attribute.token)\n .map(([, value]) => value)\n return values.length > 0 ? values : null\n }\n\n static getLast(\n attribute: ClassAttribute,\n target: (ModuleMetadata | ControllerMetadata | EndpointMetadata)[],\n ): true | null\n static getLast<T extends ZodType>(\n attribute: ClassSchemaAttribute<T>,\n target: (ModuleMetadata | ControllerMetadata | EndpointMetadata)[],\n ): z.output<T> | null\n static getLast(\n attribute: ClassAttribute | ClassSchemaAttribute<any>,\n target: (ModuleMetadata | ControllerMetadata | EndpointMetadata)[],\n ) {\n for (let i = target.length - 1; i >= 0; i--) {\n const value = target[i].customAttributes.get(attribute.token)\n if (value) {\n return value\n }\n }\n return null\n }\n\n static has(\n attribute: ClassAttribute,\n target: ModuleMetadata | ControllerMetadata | EndpointMetadata,\n ): boolean\n static has<T extends ZodType>(\n attribute: ClassSchemaAttribute<T>,\n target: ModuleMetadata | ControllerMetadata | EndpointMetadata,\n ): boolean\n static has(\n attribute: ClassAttribute | ClassSchemaAttribute<any>,\n target: ModuleMetadata | ControllerMetadata | EndpointMetadata,\n ) {\n return target.customAttributes.has(attribute.token)\n }\n}\n","import type { FastifyCorsOptions } from '@fastify/cors'\nimport type {\n FastifyInstance,\n FastifyListenOptions,\n FastifyServerOptions,\n} from 'fastify'\n\nimport cors from '@fastify/cors'\nimport { fastify } from 'fastify'\nimport {\n serializerCompiler,\n validatorCompiler,\n} from 'fastify-type-provider-zod'\n\nimport type { NaviosModule } from './interfaces/index.mjs'\nimport type { ClassTypeWithInstance } from './service-locator/index.mjs'\n\nimport {\n getServiceLocator,\n Injectable,\n syncInject,\n} from './service-locator/index.mjs'\nimport {\n ControllerAdapterService,\n ModuleLoaderService,\n} from './services/index.mjs'\nimport { Application } from './tokens/index.mjs'\n\nexport interface NaviosApplicationOptions extends FastifyServerOptions {}\n\n@Injectable()\nexport class NaviosApplication {\n private moduleLoader = syncInject(ModuleLoaderService)\n private controllerAdapter = syncInject(ControllerAdapterService)\n private server: FastifyInstance | null = null\n private corsOptions: FastifyCorsOptions | null = null\n private globalPrefix: string | null = null\n\n private appModule: ClassTypeWithInstance<NaviosModule> | null = null\n private options: NaviosApplicationOptions = {}\n\n setup(\n appModule: ClassTypeWithInstance<NaviosModule>,\n options: NaviosApplicationOptions = {},\n ) {\n this.appModule = appModule\n this.options = options\n }\n\n async init() {\n if (!this.appModule) {\n throw new Error('App module is not set. Call setAppModule() first.')\n }\n await this.moduleLoader.loadModules(this.appModule)\n this.server = fastify(this.options)\n getServiceLocator().registerInstance(Application, this.server)\n // Add schema validator and serializer\n this.server.setValidatorCompiler(validatorCompiler)\n this.server.setSerializerCompiler(serializerCompiler)\n\n if (this.corsOptions) {\n await this.server.register(cors, this.corsOptions)\n }\n const modules = this.moduleLoader.getAllModules()\n const globalPrefix = this.globalPrefix ?? ''\n for (const [moduleName, moduleMetadata] of modules) {\n if (\n !moduleMetadata.controllers ||\n moduleMetadata.controllers.size === 0\n ) {\n continue\n }\n this.server.register(\n (instance, opts, done) => {\n for (const controller of moduleMetadata.controllers) {\n this.controllerAdapter.setupController(\n controller,\n instance,\n moduleMetadata,\n )\n }\n done()\n },\n {\n prefix: globalPrefix,\n },\n )\n }\n }\n\n enableCors(options: FastifyCorsOptions) {\n this.corsOptions = options\n this.server?.register\n }\n\n setGlobalPrefix(prefix: string) {\n this.globalPrefix = prefix\n }\n\n getServer(): FastifyInstance {\n if (!this.server) {\n throw new Error('Server is not initialized. Call init() first.')\n }\n return this.server\n }\n\n async listen(options: FastifyListenOptions) {\n if (!this.server) {\n throw new Error('Server is not initialized. Call init() first.')\n }\n await this.server.listen(options)\n }\n}\n","import type { NaviosModule } from './interfaces/index.mjs'\nimport type { NaviosApplicationOptions } from './navios.application.mjs'\nimport type { ClassTypeWithInstance } from './service-locator/index.mjs'\n\nimport { NaviosApplication } from './navios.application.mjs'\nimport { inject } from './service-locator/index.mjs'\n\nexport class NaviosFactory {\n static async create(\n appModule: ClassTypeWithInstance<NaviosModule>,\n options: NaviosApplicationOptions = {},\n ) {\n const app = await inject(NaviosApplication)\n app.setup(appModule, options)\n return app\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAAA;AAAA,EAAA;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,IAAM,sBAAsB,OAAO,qBAAqB;AAaxD,SAAS,uBACd,SACuB;AACvB,MAAI,QAAQ,UAAU;AACpB,UAAM,WAAW,QAAQ,SAAS,mBAAmB;AAGrD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT,OAAO;AACL,cAAQ,SAAS,mBAAmB,IAAI,oBAAI,IAAsB;AAClE,aAAO,QAAQ,SAAS,mBAAmB;AAAA,IAC7C;AAAA,EACF;AACA,QAAM,IAAI,MAAM,6BAA6B;AAC/C;AAEO,SAAS,oBACd,QACA,SACkB;AAClB,MAAI,QAAQ,UAAU;AACpB,UAAM,WAAW,uBAAuB,OAAO;AAC/C,QAAI,UAAU;AACZ,YAAM,mBAAmB,MAAM,KAAK,QAAQ,EAAE;AAAA,QAC5C,CAAC,SAAS,KAAK,gBAAgB,OAAO;AAAA,MACxC;AACA,UAAI,kBAAkB;AACpB,eAAO;AAAA,MACT,OAAO;AACL,cAAM,cAAgC;AAAA,UACpC,aAAa,OAAO;AAAA,UACpB,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ,oBAAI,IAGV;AAAA,UACF,kBAAkB,oBAAI,IAA0B;AAAA,QAClD;AACA,iBAAS,IAAI,WAAW;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAI,MAAM,6BAA6B;AAC/C;;;AC1DO,IAAM,wBAAwB,OAAO,uBAAuB;AAU5D,SAAS,sBACd,QACA,SACoB;AACpB,MAAI,QAAQ,UAAU;AACpB,UAAM,WAAW,QAAQ,SAAS,qBAAqB;AAGvD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT,OAAO;AACL,YAAM,oBAAoB,uBAAuB,OAAO;AACxD,YAAM,cAAkC;AAAA,QACtC,WAAW;AAAA,QACX,QAAQ,oBAAI,IAGV;AAAA,QACF,kBAAkB,oBAAI,IAA0B;AAAA,MAClD;AACA,cAAQ,SAAS,qBAAqB,IAAI;AAE1C,aAAO,qBAAqB,IAAI;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,IAAI,MAAM,6BAA6B;AAC/C;AAEO,SAAS,0BACd,QACoB;AAEpB,QAAM,WAAW,OAAO,qBAAqB;AAG7C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,QAA4B;AAEhE,QAAM,WAAW,OAAO,qBAAqB;AAG7C,SAAO,CAAC,CAAC;AACX;;;AC/DO,IAAM,oBAAoB,OAAO,uBAAuB;AAWxD,SAAS,kBACd,QACA,SACgB;AAChB,MAAI,QAAQ,UAAU;AACpB,UAAM,WAAW,QAAQ,SAAS,iBAAiB;AAGnD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT,OAAO;AACL,YAAM,cAA8B;AAAA,QAClC,aAAa,oBAAI,IAAe;AAAA,QAChC,SAAS,oBAAI,IAAe;AAAA,QAC5B,QAAQ,oBAAI,IAGV;AAAA,QACF,kBAAkB,oBAAI,IAA0B;AAAA,MAClD;AACA,cAAQ,SAAS,iBAAiB,IAAI;AAEtC,aAAO,iBAAiB,IAAI;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,IAAI,MAAM,6BAA6B;AAC/C;AAEO,SAAS,sBAAsB,QAAmC;AAEvE,QAAM,WAAW,OAAO,iBAAiB;AACzC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,QAA4B;AAE5D,SAAO,CAAC,CAAC,OAAO,iBAAiB;AACnC;;;AC7DO,IAAK,kBAAL,kBAAKC,qBAAL;AAIL,EAAAA,iBAAA,eAAY;AAIZ,EAAAA,iBAAA,cAAW;AARD,SAAAA;AAAA,GAAA;;;ACEZ,oBAA2B;AAMpB,IAAM,iBAAN,MAAM,gBAA8D;AAAA,EAEzE,YACkBC,OACA,QAChB;AAFgB,gBAAAA;AACA;AAAA,EACf;AAAA,EAJI,SAAK,0BAAW;AAAA,EAkBvB,OAAO,OAAOA,OAAc,QAAkB;AAE5C,WAAO,IAAI,gBAAeA,OAAM,MAAM;AAAA,EACxC;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AACF;;;ACnCO,IAAK,aAAL,kBAAKC,gBAAL;AACL,EAAAA,YAAA,qBAAkB;AAClB,EAAAA,YAAA,sBAAmB;AACnB,EAAAA,YAAA,wBAAqB;AACrB,EAAAA,YAAA,kBAAe;AACf,EAAAA,YAAA,qBAAkB;AALR,SAAAA;AAAA,GAAA;;;ACEL,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAEzC,YAAmBC,OAAc;AAC/B,UAAM,WAAWA,KAAI,YAAY;AADhB,gBAAAA;AAAA,EAEnB;AAAA,EAHA;AAIF;;;ACLO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAE5C,YAAmBC,OAAc;AAC/B,UAAM,YAAYA,KAAI,aAAa;AADlB,gBAAAA;AAAA,EAEnB;AAAA,EAHA;AAIF;;;ACLO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAEzC,YAAmBC,OAAc;AAC/B,UAAM,YAAYA,KAAI,UAAU;AADf,gBAAAA;AAAA,EAEnB;AAAA,EAHA;AAIF;;;ACLO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAE1C,YAAmBC,OAAc;AAC/B,UAAM,YAAYA,KAAI,YAAY;AADjB,gBAAAA;AAAA,EAEnB;AAAA,EAHA;AAIF;;;ACLO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC;AAAA,EACA;AAAA,EAEA,YAAY,SAAyB;AACnC,QAAI,mBAAmB,OAAO;AAC5B,YAAM,QAAQ,OAAO;AACrB,WAAK,SAAS;AACd;AAAA,IACF;AACA,UAAM,OAAO;AAAA,EACf;AACF;;;ACRO,IAAM,yBAAN,MAA6B;AAAA,EAElC,YAA6B,SAAyB,MAAM;AAA/B;AAAA,EAAgC;AAAA,EADrD,YAA0B,oBAAI,IAAI;AAAA,EAG1C,GACE,IACA,OACA,UACA;AAdJ;AAeI,eAAK,WAAL,mBAAa,MAAM,qCAAqC,EAAE,UAAU,KAAK;AACzE,QAAI,CAAC,KAAK,UAAU,IAAI,EAAE,GAAG;AAC3B,WAAK,UAAU,IAAI,IAAI,oBAAI,IAAI,CAAC;AAAA,IAClC;AAEA,UAAM,WAAW,KAAK,UAAU,IAAI,EAAE;AACtC,QAAI,CAAC,SAAS,IAAI,KAAK,GAAG;AACxB,eAAS,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IAC/B;AAEA,aAAS,IAAI,KAAK,EAAG,IAAI,QAAQ;AAEjC,WAAO,MAAM;AA3BjB,UAAAC;AA4BM,eAAS,IAAI,KAAK,EAAG,OAAO,QAAQ;AACpC,YAAIA,MAAA,SAAS,IAAI,KAAK,MAAlB,gBAAAA,IAAqB,UAAS,GAAG;AACnC,iBAAS,OAAO,KAAK;AAAA,MACvB;AACA,UAAI,SAAS,SAAS,GAAG;AACvB,aAAK,UAAU,OAAO,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,KAAa,OAAe;AAtCzC;AAuCI,QAAI,CAAC,KAAK,UAAU,IAAI,GAAG,GAAG;AAC5B;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,UAAU,IAAI,GAAG;AAErC,UAAM,WAAW,OAAO,KAAK;AAC7B,UAAM,YAAY,QAAQ,KAAK;AAC/B,eAAK,WAAL,mBAAa,MAAM,oCAAoC,GAAG,IAAI,QAAQ;AACtE,UAAM,QAAQ;AAAA,MACZ,CAAC,GAAI,OAAO,IAAI,QAAQ,KAAK,CAAC,CAAE,EAAE,IAAI,CAAC,aAAa,SAAS,QAAQ,CAAC;AAAA,IACxE,EAAE,KAAK,CAAC,YAAY;AAClB,cACG,OAAO,CAAC,WAAW,OAAO,WAAW,UAAU,EAC/C,QAAQ,CAAC,WAAkC;AArDpD,YAAAA;AAsDU,SAAAA,MAAA,KAAK,WAAL,gBAAAA,IAAa;AAAA,UACX,oCAAoC,GAAG,IAAI,QAAQ;AAAA,UACnD,OAAO;AAAA;AAAA,MAEX,CAAC;AAAA,IACL,CAAC;AACD,eAAK,WAAL,mBAAa,MAAM,oCAAoC,GAAG,IAAI,KAAK;AAEnE,UAAM,MAAM,MAAM,QAAQ;AAAA,MACxB,CAAC,GAAI,OAAO,IAAI,KAAK,KAAK,CAAC,CAAG,EAAE,IAAI,CAAC,aAAa,SAAS,KAAK,CAAC;AAAA,IACnE,EAAE,KAAK,CAAC,YAAY;AAClB,YAAMC,OAAM,QACT,OAAO,CAAC,WAAW,OAAO,WAAW,UAAU,EAC/C,IAAI,CAAC,WAAkC;AAnEhD,YAAAD;AAoEU,SAAAA,MAAA,KAAK,WAAL,gBAAAA,IAAa;AAAA,UACX,oCAAoC,GAAG,IAAI,KAAK;AAAA,UAChD,OAAO;AAAA;AAET,eAAO;AAAA,MACT,CAAC;AAEH,UAAIC,KAAI,SAAS,GAAG;AAClB,eAAO,QAAQ,OAAOA,IAAG;AAAA,MAC3B;AACA,aAAO;AAAA,IACT,CAAC;AACD,eAAK,WAAL,mBAAa,MAAM,oCAAoC,GAAG,IAAI,SAAS;AACvE,UAAM,QAAQ;AAAA,MACZ,CAAC,GAAI,OAAO,IAAI,SAAS,KAAK,CAAC,CAAE,EAAE,IAAI,CAAC,aAAa,SAAS,SAAS,CAAC;AAAA,IAC1E,EAAE,KAAK,CAAC,YAAY;AAClB,cACG,OAAO,CAAC,WAAW,OAAO,WAAW,UAAU,EAC/C,QAAQ,CAAC,WAAkC;AAtFpD,YAAAD;AAuFU,SAAAA,MAAA,KAAK,WAAL,gBAAAA,IAAa;AAAA,UACX,oCAAoC,GAAG,IAAI,SAAS;AAAA,UACpD,OAAO;AAAA;AAAA,MAEX,CAAC;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACT;AACF;;;AC7FO,IAAK,mCAAL,kBAAKE,sCAAL;AACL,EAAAA,kCAAA,cAAW;AACX,EAAAA,kCAAA,aAAU;AACV,EAAAA,kCAAA,qBAAkB;AAHR,SAAAA;AAAA,GAAA;AAML,IAAK,qCAAL,kBAAKC,wCAAL;AACL,EAAAA,oCAAA,aAAU;AACV,EAAAA,oCAAA,cAAW;AACX,EAAAA,oCAAA,gBAAa;AAHH,SAAAA;AAAA,GAAA;;;ACGL,IAAM,wBAAN,MAA4B;AAAA,EAIjC,YAA6B,SAAyB,MAAM;AAA/B;AAAA,EAAgC;AAAA,EAH5C,mBACf,oBAAI,IAAI;AAAA,EAIV,IACEC,OAI4C;AAtBhD;AAuBI,UAAM,SAAS,KAAK,iBAAiB,IAAIA,KAAI;AAC7C,QAAI,QAAQ;AACV,UAAI,OAAO,QAAQ,UAAU;AAC3B,cAAM,MAAM,KAAK,IAAI;AACrB,YAAI,MAAM,OAAO,YAAY,OAAO,KAAK;AACvC,qBAAK,WAAL,mBAAa;AAAA,YACX,+DAA+D,OAAO,IAAI;AAAA;AAE5E,iBAAO,CAAC,IAAI,gBAAgB,OAAO,IAAI,GAAG,MAAM;AAAA,QAClD;AAAA,MACF,WACE,OAAO,0CACP;AACA,mBAAK,WAAL,mBAAa;AAAA,UACX,wDAAwD,OAAO,IAAI;AAAA;AAErE,eAAO,CAAC,IAAI,mBAAmB,OAAO,IAAI,GAAG,MAAM;AAAA,MACrD;AAEA,aAAO,CAAC,QAAW,MAAM;AAAA,IAC3B,OAAO;AACL,iBAAK,WAAL,mBAAa;AAAA,QACX,wDAAwDA,KAAI;AAAA;AAE9D,aAAO,CAAC,IAAI,iBAAiBA,KAAI,CAAC;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,IAAIA,OAAc,QAA4C;AAC5D,SAAK,iBAAiB,IAAIA,OAAM,MAAM;AAAA,EACxC;AAAA,EAEA,IACEA,OAC+D;AAC/D,UAAM,CAAC,OAAO,MAAM,IAAI,KAAK,IAAIA,KAAI;AACrC,QAAI,CAAC,OAAO;AACV,aAAO,CAAC,QAAW,IAAI;AAAA,IACzB;AACA,QACE,uFAA0D,EAAE;AAAA,MAC1D,MAAM;AAAA,IACR,GACA;AACA,aAAO,CAAC,KAAK;AAAA,IACf;AACA,WAAO,CAAC,QAAW,CAAC,CAAC,MAAM;AAAA,EAC7B;AAAA,EAEA,OAAOA,OAAuB;AAC5B,WAAO,KAAK,iBAAiB,OAAOA,KAAI;AAAA,EAC1C;AAAA,EAEA,OACE,WAI2C;AAC3C,WAAO,IAAI;AAAA,MACT,CAAC,GAAG,KAAK,gBAAgB,EAAE;AAAA,QAAO,CAAC,CAAC,KAAK,KAAK,MAC5C,UAAU,OAAO,GAAG;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;;;ACtEO,IAAM,iBAAN,MAAqB;AAAA,EAa1B,YAA6B,SAAyB,MAAM;AAA/B;AAC3B,SAAK,WAAW,IAAI,uBAAuB,MAAM;AACjD,SAAK,UAAU,IAAI,sBAAsB,MAAM;AAAA,EACjD;AAAA,EAfQ,oBAGJ,oBAAI,IAAI;AAAA,EACJ,oBAGJ,oBAAI,IAAI;AAAA,EAEK;AAAA,EACA;AAAA,EAOjB,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,iBACL,OACA,UACM;AACN,UAAM,eAAe,KAAK,sBAAsB,OAAO,MAAS;AAChE,SAAK,QAAQ,IAAI,cAAc;AAAA,MAC7B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,KAAK;AAAA,MACL,MAAM,CAAC;AAAA,MACP,kBAAkB,CAAC;AAAA,MACnB,SAAS,CAAC;AAAA,MACV,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEO,eAAyB,OAA4C;AAC1E,UAAM,eAAe,KAAK,sBAAsB,OAAO,MAAS;AAChE,WAAO,KAAK,WAAW,YAAY;AAAA,EACrC;AAAA,EAEO,wBAIL,OACA,SAIA,oCACA;AA3EJ;AA4EI,eAAK,WAAL,mBAAa;AAAA,MACX,gFAAgF,IAAI;AAAA;AAEtF,QAAI,oCAAmC;AACrC,WAAK,kBAAkB,IAAI,OAAO,OAAO;AACzC,WAAK,kBAAkB,OAAO,KAAK;AAAA,IACrC,OAAO;AACL,WAAK,kBAAkB,IAAI,OAAO,OAAO;AACzC,WAAK,kBAAkB,OAAO,KAAK;AAAA,IACrC;AAAA,EACF;AAAA,EAEO,sBAIL,OACA,MACQ;AA9FZ;AA+FI,UAAM,gBAAgB,MAAM,SACxB,MAAM,OAAO,UAAU,IAAI,IAC3B;AACJ,QAAI,iBAAiB,CAAC,cAAc,SAAS;AAC3C,iBAAK,WAAL,mBAAa;AAAA,QACX,6DAA6D,MAAM,KAAK,SAAS,CAAC;AAAA,QAClF,cAAc;AAAA;AAEhB,YAAM,IAAI,aAAa,cAAc,KAAK;AAAA,IAC5C;AACA,WAAO,KAAK,iBAAiB,OAAO,aAAa;AAAA,EACnD;AAAA,EAEA,MAAa,YACX,OACA,MACmE;AA/GvE;AAgHI,UAAM,gBAAgB,MAAM,SACxB,MAAM,OAAO,UAAU,IAAI,IAC3B;AACJ,QAAI,iBAAiB,CAAC,cAAc,SAAS;AAC3C,iBAAK,WAAL,mBAAa;AAAA,QACX,6DAA6D,MAAM,KAAK,SAAS,CAAC;AAAA,QAClF,cAAc;AAAA;AAEhB,aAAO,CAAC,IAAI,aAAa,cAAc,KAAK,CAAC;AAAA,IAC/C;AACA,UAAM,eAAe,KAAK,iBAAiB,OAAO,aAAa;AAC/D,UAAM,CAAC,OAAO,MAAM,IAAI,KAAK,QAAQ,IAAI,YAAY;AACrD,QAAI,CAAC,OAAO;AACV,UAAI,OAAO,sCAAwD;AAEjE,eAAO,OAAO;AAAA,MAChB,WACE,OAAO,0CACP;AAEA,eAAO,CAAC,IAAI,0DAA0C,CAAC;AAAA,MACzD;AAEA,aAAO,CAAC,QAAW,OAAO,QAAQ;AAAA,IACpC;AACA,YAAQ,MAAM,MAAM;AAAA,MAClB;AACE,mBAAK,WAAL,mBAAa;AAAA,UACX,kDAAkD,iCAAQ,IAAI;AAAA;AAEhE,eAAM,iCAAQ;AAEd,eAAO,KAAK,YAA8B,OAAO,IAAI;AAAA,MAEvD;AACE,mBAAK,WAAL,mBAAa;AAAA,UACX,kDAAkD,iCAAQ,IAAI;AAAA;AAEhE,cAAM,KAAK,WAAW,YAAY;AAElC,eAAO,KAAK,YAA8B,OAAO,IAAI;AAAA,MACvD;AACE;AAAA,MACF;AACE,eAAO,CAAC,KAAK;AAAA,IACjB;AACA,WAAO,KAAK,eAAe,cAAc,OAAO,IAAI;AAAA,EACtD;AAAA,EAEA,MAAa,mBAIX,OACA,MACmB;AACnB,UAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,KAAK,YAAY,OAAO,IAAI;AAC5D,QAAI,OAAO;AACT,YAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBACNC,OACA,QAA8B,UAC9B;AAlLJ;AAmLI,eAAK,WAAL,mBAAa;AAAA,MACX,8DAA8DA,KAAI,eAAe,KAAK;AAAA;AAExF,WAAO,KAAK,SAAS,KAAKA,OAAM,KAAK;AAAA,EACvC;AAAA,EAEA,MAAc,eAIZ,cACA,OACA,MACmE;AAhMvE;AAiMI,eAAK,WAAL,mBAAa;AAAA,MACX,2DAA2D,YAAY;AAAA;AAEzE,QACE,KAAK,kBAAkB,IAAI,KAAK,KAChC,KAAK,kBAAkB,IAAI,KAAK,GAChC;AACA,aAAO,KAAK,kCAAkC,cAAc,OAAO,IAAI;AAAA,IACzE,OAAO;AACL,aAAO,CAAC,IAAI,gBAAgB,MAAM,KAAK,SAAS,CAAC,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAc,kCAKZ,cACA,OACA,MACoD;AAtNxD;AAuNI,eAAK,WAAL,mBAAa;AAAA,MACX,+EAA+E,YAAY;AAAA;AAE7F,UAAM,MAAM,KAAK,gCAAgC,YAAY;AAC7D,QAAI,cAAc;AAClB,QAAI,kBAAkB,KAAK,kBAAkB,IAAI,KAAK;AACtD,QAAI,CAAC,iBAAiB;AACpB,wBAAkB,KAAK,kBAAkB,IAAI,KAAK;AAClD,oBAAc;AACd,UAAI,CAAC,iBAAiB;AACpB,eAAO,CAAC,IAAI,gBAAgB,MAAM,KAAK,SAAS,CAAC,CAAC;AAAA,MACpD;AAAA,IACF;AACA,UAAM,SAAiD;AAAA,MACrD,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA;AAAA;AAAA,MAEA,iBAAiB,gBAAgB,KAAK,IAAI,EACvC,KAAK,OAAO,aAAuB;AA3O5C,YAAAC;AA4OU,eAAO,WAAW;AAClB,eAAO;AACP,eAAO,OAAO,IAAI,gBAAgB;AAClC,eAAO,mBAAmB,IAAI,oBAAoB;AAClD,eAAO,MAAM,IAAI,OAAO;AACxB,YAAI,OAAO,KAAK,SAAS,GAAG;AAC1B,WAAAA,MAAA,KAAK,WAAL,gBAAAA,IAAa;AAAA,YACX,kFAAkF,YAAY,0CAA0C,OAAO,KAAK;AAAA,cAClJ;AAAA,YACF,CAAC;AAAA;AAEH,iBAAO,KAAK,QAAQ,CAAC,eAAe;AAClC,mBAAO,iBAAiB;AAAA,cACtB,KAAK,SAAS;AAAA,gBAAG;AAAA,gBAAY;AAAA,gBAAW,MACtC,KAAK,WAAW,YAAY;AAAA,cAC9B;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACA,YAAI,OAAO,QAAQ,GAAG;AAEpB,gBAAM,KAAK,WAAW,YAAY;AAAA,QACpC;AACA,cAAM,KAAK,gBAAgB,YAAY;AACvC,eAAO,CAAC,QAAW,QAAoB;AAAA,MACzC,CAAC,EACA,MAAM,CAAC,UAAU;AAtQ1B,YAAAA;AAuQU,SAAAA,MAAA,KAAK,WAAL,gBAAAA,IAAa;AAAA,UACX,qFAAqF,YAAY;AAAA,UACjG;AAAA;AAEF,eAAO,CAAC,IAAI,aAAa,KAAK,CAAC;AAAA,MACjC,CAAC;AAAA,MACH,SAAS,CAAC;AAAA,MACV,MAAM,CAAC;AAAA,MACP,kBAAkB,CAAC;AAAA,MACnB,WAAW,KAAK,IAAI;AAAA,MACpB,KAAK;AAAA,IACP;AAEA,QAAI,aAAa;AACf,WAAK,QAAQ,IAAI,cAAc,MAAM;AAAA,IACvC;AAEA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEQ,gCACN,cACsC;AACtC,UAAM,eAAe,oBAAI,IAAY;AACrC,UAAM,mBAAmB,oBAAI,IAAgB;AAE7C,UAAM,OAAO;AAEb,aAAS,WAAWD,QAAO,cAAc;AACvC,aAAO,KAAK,WAAWA,KAAI;AAAA,IAC7B;AACA,aAAS,UAAU,UAAsB;AACvC,uBAAiB,IAAI,QAAQ;AAAA,IAC/B;AACA,QAAI,MAAM;AACV,aAAS,OAAO,OAAe;AAC7B,YAAM;AAAA,IACR;AACA,aAAS,SAAS;AAChB,aAAO;AAAA,IACT;AAEA,aAAS,GAAG,KAAa,OAAe,UAAmC;AACzE,uBAAiB,IAAI,KAAK,SAAS,GAAG,KAAK,OAAO,QAAQ,CAAC;AAAA,IAC7D;AAEA,WAAO;AAAA;AAAA,MAEL,MAAM,OAAO,OAAO,MAAM;AACxB,YAAI,iBAAiB;AACrB,YAAI,OAAO,UAAU,YAAY;AAC/B,2BAAiB,mBAAmB,KAAK;AAAA,QAC3C;AACA,YAAI,0BAA0B,gBAAgB;AAC5C,gBAAM,gBAAgB,MAAM,SACxB,MAAM,OAAO,UAAU,IAAI,IAC3B;AACJ,gBAAME,gBAAe,KAAK,iBAAiB,OAAO,aAAa;AAC/D,uBAAa,IAAIA,aAAY;AAE7B,iBAAO,KAAK,mBAAmB,gBAAgB,IAAI;AAAA,QACrD;AACA,cAAM,IAAI;AAAA,UACR,kDAAkD,OAAO,KAAK;AAAA,QAChE;AAAA,MACF;AAAA,MACA;AAAA,MACA,UAAU,KAAK;AAAA,MACf;AAAA,MACA,iBAAiB,MAAM,MAAM,KAAK,YAAY;AAAA,MAC9C;AAAA,MACA,qBAAqB,MAAM,MAAM,KAAK,gBAAgB;AAAA,MACtD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEO,gBACL,OACA,MACiB;AAvVrB;AAwVI,UAAM,gBAAgB,MAAM,SACxB,MAAM,OAAO,UAAU,IAAI,IAC3B;AACJ,QAAI,iBAAiB,CAAC,cAAc,SAAS;AAC3C,iBAAK,WAAL,mBAAa;AAAA,QACX,6DAA6D,MAAM,KAAK,SAAS,CAAC;AAAA,QAClF,cAAc;AAAA;AAEhB,YAAM,IAAI,aAAa,cAAc,KAAK;AAAA,IAC5C;AACA,UAAM,eAAe,KAAK,iBAAiB,OAAO,aAAa;AAC/D,UAAM,CAAC,OAAO,MAAM,IAAI,KAAK,QAAQ,IAAI,YAAY;AACrD,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AACA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,WAAW,SAAiB,QAAQ,GAAiB;AA1WvD;AA2WI,eAAK,WAAL,mBAAa;AAAA,MACX,mEAAmE,OAAO;AAAA;AAE5E,UAAM,eAAe,KAAK,QAAQ;AAAA,MAChC,CAAC,WAAW,OAAO,SAAS,WAAW,OAAO,KAAK,SAAS,OAAO;AAAA,IACrE;AACA,UAAM,WAAW,CAAC;AAClB,eAAW,CAAC,KAAK,MAAM,KAAK,aAAa,QAAQ,GAAG;AAClD,UAAI,OAAO,0CAA0D;AACnE,mBAAK,WAAL,mBAAa;AAAA,UACX,kCAAkC,GAAG;AAAA;AAEvC,iBAAS,KAAK,OAAO,cAAc;AACnC;AAAA,MACF;AACA,UAAI,OAAO,sCAAwD;AACjE,mBAAK,WAAL,mBAAa;AAAA,UACX,kCAAkC,GAAG;AAAA;AAEvC,iBAAS;AAAA,WACP,YAAO,oBAAP,mBAAwB,KAAK,MAAM;AA/X7C,gBAAAD;AAgYY,gBAAI,QAAQ,GAAG;AACb,eAAAA,MAAA,KAAK,WAAL,gBAAAA,IAAa;AAAA,gBACX,kCAAkC,GAAG;AAAA;AAEvC;AAAA,YACF;AACA,mBAAO,KAAK,WAAW,KAAK,QAAQ,CAAC;AAAA,UACvC;AAAA,QACF;AACA;AAAA,MACF;AAEA,aAAO;AACP,iBAAK,WAAL,mBAAa;AAAA,QACX,+CAA+C,GAAG;AAAA;AAGpD,aAAO,iBAAiB,QAAQ;AAAA,QAC9B,OAAO,iBAAiB,IAAI,CAAC,aAAa,SAAS,CAAC;AAAA,MACtD,EAAE,KAAK,YAAY;AACjB,aAAK,QAAQ,OAAO,GAAG;AACvB,cAAM,KAAK,gBAAgB,KAAK,SAAS;AAAA,MAC3C,CAAC;AACD,eAAS,KAAK,OAAO,cAAc;AAAA,IACrC;AACA,WAAO,QAAQ,IAAI,QAAQ;AAAA,EAC7B;AAAA,EAEA,MAAM,QAAQ;AACZ,WAAO,QAAQ;AAAA,MACb,MAAM,KAAK,KAAK,QAAQ,OAAO,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,MAAM;AA9ZtE;AA+ZQ,YAAI,OAAO,sCAAwD;AACjE,kBAAO,YAAO,oBAAP,mBAAwB,KAAK,MAAM;AAAA,QAC5C;AACA,YAAI,OAAO,0CAA0D;AACnE,iBAAO,OAAO,eAAe,KAAK,MAAM,IAAI;AAAA,QAC9C;AACA,eAAO,QAAQ,QAAQ,IAAI;AAAA,MAC7B,CAAC;AAAA,IACH,EAAE,KAAK,MAAM,IAAI;AAAA,EACnB;AAAA,EAEA,iBAAiB,OAAiC,MAAW;AAC3D,QAAI,kBAAkB,OAClB,MACA,KAAK,UAAU,IAAI,EAChB,WAAW,MAAM,EAAE,EACnB,WAAW,MAAM,GAAG,EACpB,WAAW,MAAM,GAAG,IACvB;AACJ,UAAM,EAAE,MAAAD,MAAK,IAAI;AACjB,QAAI,OAAOA,UAAS,YAAY;AAC9B,YAAM,YAAYA,MAAK;AACvB,aAAO,GAAG,SAAS,IAAI,MAAM,EAAE,IAAI,eAAe;AAAA,IACpD,WAAW,OAAOA,UAAS,UAAU;AACnC,aAAO,GAAGA,MAAK,SAAS,CAAC,IAAI,MAAM,EAAE,IAAI,eAAe;AAAA,IAC1D,OAAO;AACL,aAAO,GAAGA,KAAI,IAAI,MAAM,EAAE,IAAI,eAAe;AAAA,IAC/C;AAAA,EACF;AACF;;;AC1bA,IAAI,iBAAiC,IAAI,eAAe;AAEjD,SAAS,sBAAsB,SAAyC;AAC7E,QAAM,WAAW;AACjB,mBAAiB;AACjB,SAAO;AACT;AAEO,SAAS,oBAAoC;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ACRO,IAAM,sBAAN,MAAoD;AAAA,EACzD,YACmBG,iBACA,KACjB;AAFiB,0BAAAA;AACA;AAAA,EAChB;AAAA,EACH,IAAI,oBAGF;AACA,WAAO,KAAK,eAAe,mBAAmB;AAAA,EAChD;AAAA,EACA,cAAsC;AACpC,WAAO,KAAK,eAAe,YAAY;AAAA,EACzC;AAAA,EACO,wBAIL,OACA,SAIM;AACN,WAAO,KAAK,eAAe,wBAAwB,OAAO,OAAO;AAAA,EACnE;AAAA,EACO,YACL,OACA,MACmE;AAEnE,WAAO,KAAK,IAAI,OAAO,OAAO,IAAI,EAAE;AAAA,MAClC,CAAC,aAAa;AACZ,eAAO,CAAC,QAAW,QAAQ;AAAA,MAC7B;AAAA,MACA,CAAC,UAAU;AACT,eAAO,CAAC,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACO,mBACL,OACA,MACmB;AAEnB,WAAO,KAAK,IAAI,OAAO,OAAO,IAAI;AAAA,EACpC;AAAA,EACO,gBACL,OACA,MACiB;AACjB,WAAO,KAAK,eAAe,gBAAgB,OAAO,IAAI;AAAA,EACxD;AAAA,EACA,WAAW,SAAiB,OAA8B;AACxD,WAAO,KAAK,eAAe,WAAW,SAAS,KAAK;AAAA,EACtD;AAAA,EACA,QAAuB;AACrB,WAAO,KAAK,eAAe,MAAM;AAAA,EACnC;AAAA,EACA,iBAAiB,OAAiC,MAAmB;AACnE,WAAO,KAAK,eAAe,iBAAiB,OAAO,IAAI;AAAA,EACzD;AACF;AAEO,SAAS,wBACdA,iBACA,KACgB;AAEhB,SAAO,IAAI,oBAAoBA,iBAAgB,GAAG;AACpD;;;ACvEA,IAAI,mBAA6D;AAQ1D,SAAS,WAId,OAAc,MAAuD;AACrE,MAAI,MAAM,QAAQ;AAChB,UAAM,SAAS,MAAM,OAAO,UAAU,IAAI;AAC1C,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,0CAA0C,MAAM,KAAK,SAAS,CAAC,KAAK,OAAO,KAAK;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AACA,MAAI,YAAkC;AACtC,MAAI,EAAE,iBAAiB,iBAAiB;AACtC,gBAAY,mBAAmB,KAAK;AAAA,EACtC;AAEA,QAAM,WAAW,kBAAkB,EAAE,gBAAgB,WAAW,IAAI;AACpE,MAAI,CAAC,UAAU;AACb,QAAI,kBAAkB;AACpB,YAAM,UAAU,kBAAkB,EAAE,YAAY,WAAW,IAAI;AAC/D,uBAAiB,OAAO;AAAA,IAC1B,OAAO;AACL,YAAM,IAAI;AAAA,QACR,0CAA0C,UAAU,KAAK,SAAS,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,oBACd,WACyB;AACzB,QAAM,WAAW;AACjB,qBAAmB;AACnB,SAAO;AACT;;;AC9CO,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,WAAQ;AACR,EAAAA,gBAAA,aAAU;AAFA,SAAAA;AAAA,GAAA;AAWL,IAAM,sBAAsB,OAAO,qBAAqB;AAExD,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,EACP;AACF,IAAuB,CAAC,GAAG;AACzB,SAAO,CAAC,QAAmB,YAAmC;AAC5D,QAAI,QAAQ,SAAS,SAAS;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,kBACF,SAAS,eAAe,OAAO,MAAM;AACvC,UAAM,UAAU,kBAAkB;AAClC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,qBAAsB;AACjC,cAAQ;AAAA,QACN;AAAA,QACA,OAAO,QAAQ;AACb,cAAI,qCAAoC;AACtC,gBAAI,OAAO,CAAC;AAAA,UACd;AACA,gBAAM,sBAAsB;AAAA,YAC1B,kBAAkB;AAAA,YAClB;AAAA,UACF;AACA,gBAAM,WAA2B,CAAC;AAClC,gBAAMC,oBAAmB,CAAC,YAA0B;AAClD,qBAAS,KAAK,OAAO;AAAA,UACvB;AACA,gBAAM,2BAA2B,oBAAoBA,iBAAgB;AACrE,gBAAM,UAAU,MAAM;AACpB,kBAAM,WAAW,sBAAsB,mBAAmB;AAC1D,gBAAIC,UAAS,IAAI,OAAO;AACxB,kCAAsB,QAAQ;AAC9B,mBAAOA;AAAA,UACT;AACA,gBAAM,SAAS,QAAQ;AACvB,8BAAoB,wBAAwB;AAC5C,cAAI,SAAS,SAAS,GAAG;AACvB,kBAAM,QAAQ,IAAI,QAAQ;AAC1B,mBAAO,QAAQ;AAAA,UACjB;AACA,iBAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,SAAS,yBAAwB;AAC1C,cAAQ;AAAA,QACN;AAAA,QACA,OAAO,KAAK,SAAc;AACxB,cAAI,qCAAoC;AACtC,gBAAI,OAAO,CAAC;AAAA,UACd;AACA,gBAAM,sBAAsB;AAAA,YAC1B,kBAAkB;AAAA,YAClB;AAAA,UACF;AACA,gBAAM,WAAW,sBAAsB,mBAAmB;AAC1D,gBAAM,UAAU,IAAI,OAAO;AAC3B,cAAI,OAAO,QAAQ,WAAW,YAAY;AACxC,kBAAM,IAAI;AAAA,cACR,4BAA4B,OAAO,IAAI;AAAA,YACzC;AAAA,UACF;AACA,gCAAsB,QAAQ;AAC9B,iBAAO,QAAQ,OAAO,KAAK,IAAI;AAAA,QACjC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,WAAO,mBAAmB,IAAI;AAE9B,WAAO;AAAA,EACT;AACF;;;AC9FO,SAAS,mBACd,QAGoB;AAEpB,QAAM,QAAQ,OAAO,mBAAmB;AACxC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,0BAA0B,OAAO,IAAI;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;;;ACmBO,IAAM,eAAN,MAEP;AAAA,EACU,YAAqD,oBAAI,IAAI;AAAA,EAErE,GACE,OACA,UACA;AACA,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,WAAK,UAAU,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IACrC;AAEA,SAAK,UAAU,IAAI,KAAK,EAAG,IAAI,QAAQ;AAEvC,WAAO,MAAM;AACX,WAAK,IAAI,OAAO,QAAQ;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IACE,OACA,UACA;AACA,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B;AAAA,IACF;AAEA,SAAK,UAAU,IAAI,KAAK,EAAG,OAAO,QAAQ;AAC1C,QAAI,KAAK,UAAU,IAAI,KAAK,EAAG,SAAS,GAAG;AACzC,WAAK,UAAU,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,KACE,OACA,UACA;AACA,UAAM,MAAM,KAAK,GAAG,OAAO,IAAI,SAAS;AACtC,UAAI;AAEJ,eAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KACJ,UACG,MACW;AACd,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B;AAAA,IACF;AAEA,WAAO,QAAQ,IAAI,MAAM,KAAK,KAAK,UAAU,IAAI,KAAK,CAAE,EAAE,IAAI,cAAY,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,EAC9F;AAAA,EAEA,WAIE,IAAQ,OAAU,QAAiB;AACnC,WAAO,KAAK,GAAG,OAAO,IAAI,SAAS,OAAO,KAAK,IAAI,OAAO,GAAG,IAAI,CAAC;AAAA,EACpE;AACF;;;AC5FO,SAAS,OAKd,OACA,MACY;AACZ,MAAI,MAAM,QAAQ;AAChB,UAAM,SAAS,MAAM,OAAO,UAAU,IAAI;AAC1C,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,0CAA0C,MAAM,KAAK,SAAS,CAAC,KAAK,OAAO,KAAK;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AACA,MAAI,YAAkC;AACtC,MAAI,EAAE,iBAAiB,iBAAiB;AACtC,gBAAY,mBAAmB,KAAK;AAAA,EACtC;AAEA,SAAO,kBAAkB,EAAE,mBAAmB,WAAW,IAAI;AAC/D;;;AC5BO,SAAS,SAAY,OAA0B,QAAmB;AACvE,QAAMC,kBAAiB,kBAAkB;AACzC,QAAM,qBAAqBA,gBAAe,mBAAmB,EAAE,IAAI,KAAK;AACxE,EAAAA,gBAAe,wBAAwB,OAAO,OAAO,KAAK,SAAc;AACtE,UAAM,UAAU,IAAI,OAAO;AAC3B,WAAO,QAAQ,OAAO,KAAK,IAAI;AAAA,EACjC,CAAC;AAED,SAAO,MAAM;AACX,QAAI,oBAAoB;AACtB,MAAAA,gBAAe,wBAAwB,OAAO,kBAAkB;AAAA,IAClE;AAAA,EACF;AACF;;;ACRO,SAAS,WAAW,EAAE,OAAO,IAAuB,CAAC,GAAG;AAC7D,SAAO,SAAU,QAAmB,SAAgC;AAClE,QAAI,QAAQ,SAAS,SAAS;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,eAAe,OAAO,MAAM;AAC1C,QAAI,QAAQ,UAAU;AACpB,YAAM,qBAAqB,sBAAsB,QAAQ,OAAO;AAChE,UAAI,QAAQ;AACV,mBAAW,SAAS,MAAM,KAAK,MAAM,EAAE,QAAQ,GAAG;AAChD,6BAAmB,OAAO,IAAI,KAAK;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AACA,WAAO,WAAW;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,EAAE,QAAQ,OAAO;AAAA,EACpB;AACF;;;ACRO,SAAS,SAMd,UAQC;AACD,SAAO,CACL,QASA,YACG;AACH,QAAI,OAAO,WAAW,YAAY;AAChC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,UAAU;AAC7B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,SAAS;AACxB,QAAI,QAAQ,UAAU;AACpB,UAAI,mBAAmB,oBAAoB,QAAQ,OAAO;AAC1D,UAAI,iBAAiB,UAAU,iBAAiB,OAAO,KAAK;AAC1D,cAAM,IAAI;AAAA,UACR,qBAAqB,OAAO,MAAM,IAAI,OAAO,GAAG;AAAA,QAClD;AAAA,MACF;AAEA,uBAAiB,SAAS;AAC1B,uBAAiB,cAAc,OAAO;AACtC,uBAAiB,aAAa,OAAO;AACrC,uBAAiB,MAAM,OAAO;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AACF;;;AChEO,SAAS,OAAO,UAAyB;AAC9C,SAAO,CAAC,QAAmB,YAAmC;AAC5D,QAAI,QAAQ,SAAS,SAAS;AAC5B,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAEA,UAAM,QAAQ,eAAe,OAAO,MAAM;AAC1C,UAAM,iBAAiB,kBAAkB,QAAQ,OAAO;AACxD,QAAI,SAAS,aAAa;AACxB,iBAAW,cAAc,SAAS,aAAa;AAC7C,uBAAe,YAAY,IAAI,UAAU;AAAA,MAC3C;AAAA,IACF;AACA,QAAI,SAAS,SAAS;AACpB,iBAAW,kBAAkB,SAAS,SAAS;AAC7C,uBAAe,QAAQ,IAAI,cAAc;AAAA,MAC3C;AAAA,IACF;AACA,QAAI,SAAS,QAAQ;AACnB,iBAAW,SAAS,MAAM,KAAK,SAAS,MAAM,EAAE,QAAQ,GAAG;AACzD,uBAAe,OAAO,IAAI,KAAK;AAAA,MACjC;AAAA,IACF;AAEA,WAAO,WAAW;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,EAAE,QAAQ,OAAO;AAAA,EACpB;AACF;;;AClCO,SAAS,aACX,QAIH;AACA,SAAO,SACL,QACA,SACG;AACH,QAAI,QAAQ,SAAS,SAAS;AAC5B,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,MACF;AACA,iBAAW,SAAS,OAAO,QAAQ,GAAG;AACpC,2BAAmB,OAAO,IAAI,KAAK;AAAA,MACrC;AAAA,IACF,WAAW,QAAQ,SAAS,UAAU;AACpC,YAAM,mBAAmB,oBAAoB,QAAQ,OAAO;AAC5D,iBAAW,SAAS,OAAO,QAAQ,GAAG;AACpC,yBAAiB,OAAO,IAAI,KAAK;AAAA,MACnC;AAAA,IACF,OAAO;AACL,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AC1CO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YACkB,YACA,UACA,OAChB;AAHgB;AACA;AACA;AAAA,EACf;AACL;;;ACJO,IAAM,sBAAN,cAAkC,cAAc;AAAA,EACrD,YAAY,SAA0B;AACpC,UAAM,KAAK,OAAO;AAAA,EACpB;AACF;;;ACJO,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD,YAAY,SAAiB;AAC3B,UAAM,KAAK,OAAO;AAAA,EACpB;AACF;;;ACJO,IAAM,+BAAN,cAA2C,cAAc;AAAA,EAC9D,YAAY,SAA0B,OAAe;AACnD,UAAM,KAAK,SAAS,KAAK;AAAA,EAC3B;AACF;;;ACJO,IAAM,oBAAN,cAAgC,cAAc;AAAA,EACnD,YACkB,UACA,OAChB;AACA,UAAM,KAAK,UAAU,KAAK;AAHV;AACA;AAAA,EAGlB;AACF;;;ACPO,IAAM,wBAAN,cAAoC,cAAc;AAAA,EACvD,YAAY,SAA0B,OAAe;AACnD,UAAM,KAAK,SAAS,KAAK;AAAA,EAC3B;AACF;;;ACJO,IAAM,oBAAN,cAAgC,cAAc;AAAA,EACnD,YAAY,SAA0B,OAAe;AACnD,UAAM,KAAK,SAAS,KAAK;AAAA,EAC3B;AACF;;;ACFA,IAAM,4BAA4B;AAE3B,IAAM,cAAc,eAAe;AAAA,EACxC;AACF;;;ACLO,IAAM,iCAAiC;AAEvC,IAAM,wBAAwB,eAAe;AAAA,EAClD;AACF;;;ACHA,IAAM,sBAAsB;AAErB,IAAM,QAAQ,eAAe,OAAqB,mBAAmB;;;ACF5E,IAAM,wBAAwB;AAEvB,IAAM,UAAU,eAAe;AAAA,EACpC;AACF;;;ACAO,IAAMC,oBAAN,MAAuB;AAAA,EAG5B,YACmBC,SACA,YACA,SACjB;AAHiB,kBAAAA;AACA;AACA;AAAA,EAChB;AAAA,EANK;AAAA,EACA;AAAA,EAMR,YAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAA+B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAA6B;AAC3B,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAyB;AACvB,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAe,SAA+B;AAC5C,SAAK,UAAU;AAAA,EACjB;AAAA,EACA,aAAa,OAA2B;AACtC,SAAK,QAAQ;AAAA,EACf;AACF;;;ACpDA;AAWA,kCAAC,WAAW;AACL,IAAM,qBAAN,MAAyB;AAAA,EAC9B,MAAM,UACJ,WAIA,kBACA;AACA,QAAI,cAAc;AAClB,eAAW,SAAS,MAAM,KAAK,SAAS,EAAE,QAAQ,GAAG;AACnD,YAAM,gBAAgB,MAAM;AAAA,QAC1B;AAAA,MACF;AACA,UAAI,CAAC,cAAc,aAAa;AAC9B,cAAM,IAAI;AAAA,UACR,kBAAkB,MAAM,IAAc;AAAA,QACxC;AAAA,MACF;AACA,UAAI;AACF,sBAAc,MAAM,cAAc,YAAY,gBAAgB;AAC9D,YAAI,CAAC,aAAa;AAChB;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,YAAI,iBAAiB,eAAe;AAClC,2BACG,SAAS,EACT,OAAO,MAAM,UAAU,EACvB,KAAK,MAAM,QAAQ;AACtB,iBAAO;AAAA,QACT,OAAO;AACL,2BACG,SAAS,EACT,OAAO,GAAG,EACV,KAAK;AAAA,YACJ,SAAS;AAAA,YACT,OAAQ,MAAgB;AAAA,UAC1B,CAAC;AACH,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,aAAa;AAChB,uBAAiB,SAAS,EAAE,OAAO,GAAG,EAAE,KAAK;AAAA,QAC3C,SAAS;AAAA,MACX,CAAC;AACD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YACE,kBAGA;AACA,UAAM,SAAS,oBAAI,IAGjB;AACF,UAAM,iBAAiB,iBAAiB,WAAW,EAAE;AACrD,UAAM,mBAAmB,iBAAiB,cAAc,EAAE;AAC1D,UAAM,eAAe,iBAAiB,UAAU,EAAE;AAClD,QAAI,eAAe,OAAO,GAAG;AAC3B,iBAAW,SAAS,gBAAgB;AAClC,eAAO,IAAI,KAAK;AAAA,MAClB;AAAA,IACF;AACA,QAAI,iBAAiB,OAAO,GAAG;AAC7B,iBAAW,SAAS,kBAAkB;AACpC,eAAO,IAAI,KAAK;AAAA,MAClB;AAAA,IACF;AACA,QAAI,aAAa,OAAO,GAAG;AACzB,iBAAW,SAAS,cAAc;AAChC,eAAO,IAAI,KAAK;AAAA,MAClB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAhFO;AAAM,qBAAN,kDADP,gCACa;AAAN,4BAAM;;;ACZb,0CAAAC;AAkBA,wCAAC,WAAW;AACL,IAAM,2BAAN,MAA+B;AAAA,EACpC,cAAc,WAAW,kBAAkB;AAAA,EAE3C,gBACE,YACA,UACA,gBACM;AACN,UAAM,qBAAqB,0BAA0B,UAAU;AAC/D,eAAW,YAAY,mBAAmB,WAAW;AACnD,YAAM,EAAE,aAAa,KAAK,YAAY,OAAO,IAAI;AAEjD,UAAI,CAAC,OAAO,CAAC,QAAQ;AACnB,cAAM,IAAI;AAAA,UACR,+BAA+B,WAAW,IAAI,IAAI,WAAW;AAAA,QAC/D;AAAA,MACF;AACA,YAAM,mBAAmB,IAAIC;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,SAAS,KAAK,YAAY,YAAY,gBAAgB;AAC5D,YAAM,EAAE,aAAa,eAAe,eAAe,IAAI;AACvD,YAAM,SAA8B,CAAC;AACrC,UAAI,aAAa;AACf,eAAO,cAAc;AAAA,MACvB;AACA,UAAI,eAAe;AACjB,eAAO,OAAO;AAAA,MAChB;AACA,UAAI,gBAAgB;AAClB,eAAO,WAAW;AAAA,UAChB,KAAK;AAAA,QACP;AAAA,MACF;AACA,eAAS,iBAAkC,EAAE,MAAM;AAAA,QACjD,QAAQ;AAAA,QACR,KAAK,IAAI,WAAW,KAAK,GAAG;AAAA,QAC5B;AAAA,QACA,YAAY,OAAO,SAAS,UAAU;AACpC,cAAI,OAAO,OAAO,GAAG;AACnB,8BAAkB,EAAE,iBAAiB,SAAS,OAAO;AACrD,8BAAkB,EAAE,iBAAiB,OAAO,KAAK;AACjD,8BAAkB,EAAE;AAAA,cAClB;AAAA,cACA;AAAA,YACF;AACA,6BAAiB,eAAe,OAAO;AACvC,6BAAiB,aAAa,KAAK;AACnC,kBAAM,cAAc,MAAM,KAAK,YAAY;AAAA,cACzC;AAAA,cACA;AAAA,YACF;AACA,8BAAkB,EAAE,eAAe,OAAO;AAC1C,8BAAkB,EAAE,eAAe,KAAK;AACxC,8BAAkB,EAAE,eAAe,qBAAqB;AACxD,gBAAI,CAAC,aAAa;AAChB,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,QACA,SAAS,OAAO,SAAS,UAAU;AACjC,4BAAkB,EAAE,iBAAiB,SAAS,OAAO;AACrD,4BAAkB,EAAE,iBAAiB,OAAO,KAAK;AACjD,4BAAkB,EAAE;AAAA,YAClB;AAAA,YACA;AAAA,UACF;AACA,2BAAiB,eAAe,OAAO;AACvC,2BAAiB,aAAa,KAAK;AACnC,gBAAM,qBAAqB,MAAM,OAAO,UAAU;AAClD,cAAI;AACF,kBAAM,EAAE,OAAO,QAAQ,KAAK,IAAI;AAChC,kBAAM,WAAgC,CAAC;AACvC,gBAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAC1C,uBAAS,SAAS;AAAA,YACpB;AACA,gBAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAC5C,uBAAS,YAAY;AAAA,YACvB;AACA,gBAAI,MAAM;AACR,uBAAS,OAAO;AAAA,YAClB;AACA,kBAAM,SAAS,MAAM,mBAAmB,WAAW,EAAE,QAAQ;AAC7D,kBAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAAA,UAC/B,SAAS,OAAO;AACd,gBAAI,iBAAiB,eAAe;AAClC,oBAAM,OAAO,MAAM,UAAU,EAAE,KAAK,MAAM,QAAQ;AAAA,YACpD,OAAO;AACL,oBAAM,OAAO,GAAG,EAAE,KAAK;AAAA,gBACrB,SAAS;AAAA,gBACT,OAAQ,MAAgB;AAAA,cAC1B,CAAC;AAAA,YACH;AAAA,UACF,UAAE;AACA,8BAAkB,EAAE,eAAe,OAAO;AAC1C,8BAAkB,EAAE,eAAe,KAAK;AACxC,8BAAkB,EAAE,eAAe,qBAAqB;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAxGOD,SAAA;AAAM,2BAAN,kBAAAA,QAAA,+BADP,sCACa;AAAN,kBAAAA,QAAA,GAAM;;;ACnBb,qCAAAE;AAOA,mCAAC,WAAW;AACL,IAAM,sBAAN,MAA0B;AAAA,EACvB,kBAA+C,oBAAI,IAAI;AAAA,EACvD,gBAAkC,oBAAI,IAAI;AAAA,EAC1C,cAAc;AAAA,EAEtB,MAAM,YAAY,WAAgD;AAChE,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AACA,UAAM,KAAK,gBAAgB,SAAS;AACpC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAc,gBACZC,SACA,gBACA;AACA,UAAM,WAAW,sBAAsBA,OAAM;AAC7C,QAAI,gBAAgB;AAClB,WAAK,cAAc,UAAU,cAAc;AAAA,IAC7C;AACA,UAAM,aAAaA,QAAO;AAC1B,QAAI,KAAK,gBAAgB,IAAI,UAAU,GAAG;AACxC;AAAA,IACF;AACA,SAAK,gBAAgB,IAAI,YAAY,QAAQ;AAC7C,UAAM,UAAU,SAAS,WAAW,oBAAI,IAAI;AAC5C,UAAM,kBAAkB,MAAM,KAAK,OAAO,EAAE;AAAA,MAAI,OAAO,mBACrD,KAAK,gBAAgB,gBAAgB,QAAQ;AAAA,IAC/C;AACA,UAAM,QAAQ,IAAI,eAAe;AACjC,UAAM,WAAW,MAAM,OAAOA,OAAM;AACpC,QAAI,SAAS,cAAc;AACzB,YAAM,SAAS,aAAa;AAAA,IAC9B;AACA,SAAK,cAAc,IAAI,YAAY,QAAQ;AAAA,EAC7C;AAAA,EAEQ,cACN,UACA,gBACM;AACN,QAAI,eAAe,QAAQ;AACzB,iBAAW,SAAS,eAAe,QAAQ;AACzC,iBAAS,OAAO,IAAI,KAAK;AAAA,MAC3B;AAAA,IACF;AACA,QAAI,eAAe,kBAAkB;AACnC,iBAAW,CAAC,KAAK,KAAK,KAAK,eAAe,kBAAkB;AAC1D,YAAI,SAAS,iBAAiB,IAAI,GAAG,GAAG;AACtC;AAAA,QACF;AACA,iBAAS,iBAAiB,IAAI,KAAK,KAAK;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EACA,gBAA6C;AAC3C,WAAO,KAAK;AAAA,EACd;AACF;AA3DOD,SAAA;AAAM,sBAAN,kBAAAA,QAAA,0BADP,iCACa;AAAN,kBAAAA,QAAA,GAAM;;;ACyBN,IAAM,mBAAN,MAAuB;AAAA,EAM5B,OAAO,gBAAgB,OAAe,QAAkB;AACtD,UAAM,MACJ,CAAC,UACD,CACE,QACA,YACG;AACH,UAAI,QAAQ,SAAS,WAAW,QAAQ,SAAS,UAAU;AACzD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,eACJ,QAAQ,SAAS,WAAW,sBAAsB,MAAmB;AACvE,YAAM,WACJ,QAAQ,SAAS,WAAW,kBAAkB,MAAmB;AACnE,UAAI,QAAQ,SAAS,WAAW,CAAC,gBAAgB,CAAC,UAAU;AAC1D,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,UAAI,WACF,QAAQ,SAAS,UACb,eACE,sBAAsB,QAAe,OAAO,IAC5C,kBAAkB,QAAe,OAAO,IAC1C,oBAAoB,QAAQ,OAAO;AACzC,UAAI,QAAQ;AACV,cAAM,iBAAiB,OAAO,UAAU,KAAK;AAC7C,YAAI,CAAC,eAAe,SAAS;AAC3B,gBAAM,IAAI;AAAA,YACR,wCAAwC,MAAM,SAAS,CAAC,KAAK,eAAe,KAAK;AAAA,UACnF;AAAA,QACF;AACA,iBAAS,iBAAiB,IAAI,OAAO,eAAe,IAAI;AAAA,MAC1D,OAAO;AACL,iBAAS,iBAAiB,IAAI,OAAO,IAAI;AAAA,MAC3C;AACA,aAAO;AAAA,IACT;AACF,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACV,UAAI,SAAS;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAAA,EAUA,OAAO,IACL,WACA,QACA;AACA,WAAO,OAAO,iBAAiB,IAAI,UAAU,KAAK,KAAK;AAAA,EACzD;AAAA,EAUA,OAAO,OACL,WACA,QACA;AACA,UAAM,SAAS,MAAM,KAAK,OAAO,iBAAiB,QAAQ,CAAC,EACxD,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,UAAU,KAAK,EACzC,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,KAAK;AAC3B,WAAO,OAAO,SAAS,IAAI,SAAS;AAAA,EACtC;AAAA,EAUA,OAAO,QACL,WACA,QACA;AACA,aAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,YAAM,QAAQ,OAAO,CAAC,EAAE,iBAAiB,IAAI,UAAU,KAAK;AAC5D,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAUA,OAAO,IACL,WACA,QACA;AACA,WAAO,OAAO,iBAAiB,IAAI,UAAU,KAAK;AAAA,EACpD;AACF;;;ACnJA,kBAAiB;AACjB,qBAAwB;AACxB,uCAGO;AAZP,mCAAAE;AA8BA,iCAAC,WAAW;AACL,IAAM,oBAAN,MAAwB;AAAA,EACrB,eAAe,WAAW,mBAAmB;AAAA,EAC7C,oBAAoB,WAAW,wBAAwB;AAAA,EACvD,SAAiC;AAAA,EACjC,cAAyC;AAAA,EACzC,eAA8B;AAAA,EAE9B,YAAwD;AAAA,EACxD,UAAoC,CAAC;AAAA,EAE7C,MACE,WACA,UAAoC,CAAC,GACrC;AACA,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,OAAO;AACX,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AACA,UAAM,KAAK,aAAa,YAAY,KAAK,SAAS;AAClD,SAAK,aAAS,wBAAQ,KAAK,OAAO;AAClC,sBAAkB,EAAE,iBAAiB,aAAa,KAAK,MAAM;AAE7D,SAAK,OAAO,qBAAqB,kDAAiB;AAClD,SAAK,OAAO,sBAAsB,mDAAkB;AAEpD,QAAI,KAAK,aAAa;AACpB,YAAM,KAAK,OAAO,SAAS,YAAAC,SAAM,KAAK,WAAW;AAAA,IACnD;AACA,UAAM,UAAU,KAAK,aAAa,cAAc;AAChD,UAAM,eAAe,KAAK,gBAAgB;AAC1C,eAAW,CAAC,YAAY,cAAc,KAAK,SAAS;AAClD,UACE,CAAC,eAAe,eAChB,eAAe,YAAY,SAAS,GACpC;AACA;AAAA,MACF;AACA,WAAK,OAAO;AAAA,QACV,CAAC,UAAU,MAAM,SAAS;AACxB,qBAAW,cAAc,eAAe,aAAa;AACnD,iBAAK,kBAAkB;AAAA,cACrB;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AACA,eAAK;AAAA,QACP;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,SAA6B;AA1F1C;AA2FI,SAAK,cAAc;AACnB,eAAK,WAAL,mBAAa;AAAA,EACf;AAAA,EAEA,gBAAgB,QAAgB;AAC9B,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,YAA6B;AAC3B,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAO,SAA+B;AAC1C,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AACA,UAAM,KAAK,OAAO,OAAO,OAAO;AAAA,EAClC;AACF;AAjFOD,SAAA;AAAM,oBAAN,kBAAAA,QAAA,wBADP,+BACa;AAAN,kBAAAA,QAAA,GAAM;;;ACxBN,IAAM,gBAAN,MAAoB;AAAA,EACzB,aAAa,OACX,WACA,UAAoC,CAAC,GACrC;AACA,UAAM,MAAM,MAAM,OAAO,iBAAiB;AAC1C,QAAI,MAAM,WAAW,OAAO;AAC5B,WAAO;AAAA,EACT;AACF;","names":["ExecutionContext","InjectableScope","name","ErrorsEnum","name","name","name","name","_a","res","ServiceLocatorInstanceHolderKind","ServiceLocatorInstanceHolderStatus","name","name","_a","instanceName","serviceLocator","InjectableType","promiseCollector","result","serviceLocator","ExecutionContext","module","_init","ExecutionContext","_init","module","_init","cors"]}